我认为我在正确的轨道上理解git的基本概念。

我已经建立并克隆了一个远程存储库。我还创建了一个服务器端空存储库,并将我的本地存储库链接到它。

我的问题是我不明白以下两者的区别:

Origin /master vs. remotes/ Origin /master

据我所知,master是一个本地分支,remotes/origin/master是一个远端分支。

但到底什么是起源/主宰?


当前回答

给我这样的傻瓜的简短回答(从Torek那里偷来的):

origin/master是“上次我检查master在哪里” master指的是"根据我一直在做的事情,master在哪里"

其他回答

从技术上讲,在你的Git回购中实际上根本没有任何“远程”的东西,只有本地名称,这些名称应该与另一个不同的回购上的名称对应。命名为origin/whatever的那些最初将与你克隆的回购上的那些匹配:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

生成另一个回购的本地副本。在这个过程中,它会记录所有在那里的分支,并提交那些被引用的分支,并将它们以refs/remotes/origin/的名称粘贴到本地repo中。

Depending on how long you go before you git fetch or equivalent to update "my copy of what's some.where.out.there", they may change their branches around, create new ones, and delete some. When you do your git fetch (or git pull which is really fetch plus merge), your repo will make copies of their new work and change all the refs/remotes/origin/<name> entries as needed. It's that moment of fetching that makes everything match up (well, that, and the initial clone, and some cases of pushing too—basically whenever Git gets a chance to check—but see caveat below).

Git normally has you refer to your own refs/heads/<name> as just <name>, and the remote ones as origin/<name>, and it all just works because it's obvious which one is which. It's sometimes possible to create your own branch names that make it not obvious, but don't worry about that until it happens. :-) Just give Git the shortest name that makes it obvious, and it will go from there: origin/master is "where master was over there last time I checked", and master is "where master is over here based on what I have been doing". Run git fetch to update Git on "where master is over there" as needed.


注意:在1.8.4以上的Git版本中,Git获取有一些模式不会更新“master is over there”(更准确地说,这些模式不会更新任何远程跟踪分支)。运行git fetch origin,或者git fetch——all,甚至只是git fetch,都会更新。运行git fetch origin master则不会。不幸的是,这种“不更新”模式是由普通git拉取触发的。(这主要只是一个小麻烦,在Git 1.8.4及更高版本中得到了修复。)


嗯,有一种东西叫做“遥控器”。但那也是本地的!名称来源是Git称为“远程”的东西。它基本上只是克隆时使用的URL的一个简短名称。这也是origin/master中的原点的由来。名称origin/master称为远程跟踪分支,有时会缩写为“远程分支”,特别是在较老的或更非正式的文档中。

给我这样的傻瓜的简短回答(从Torek那里偷来的):

origin/master是“上次我检查master在哪里” master指的是"根据我一直在做的事情,master在哪里"

澄清一下(也是让我困惑的一点):

“remotes/origin/HEAD是默认的分支”是不正确的。

Remotes /origin/master是远程存储库中的默认分支(上次检查时)。HEAD不是一个分支,它只是指向一个分支。

把HEAD看作你的工作区域。当你这样想的时候,'git checkout branchname'对于将你的工作区域文件更改为特定分支的文件是有意义的。您将分支文件“签出”到您的工作区域。对于所有实际目的来说,HEAD是你在工作区域可以看到的东西。

origin -这是指向远程的自定义和最常见的名称。

$ git remote add origin https://github.com/git/git.git—你将运行这个命令来链接你的github项目到origin。这里origin是用户自定义的。 你可以用$ git remote rename old-name new-name来重命名它


master - Git中默认的分支名称是master。适用于远程和本地计算机。


origin/master -这只是一个在远程repo中引用主分支的指针。记住我说过原点指向远程。

$ git fetch origin -从远程存储库下载对象并引用到本地计算机[origin/master]。这意味着它不会影响您的本地主分支,除非您使用$ git merge origin/master合并它们。在运行此命令之前,请记住签出需要合并的正确分支

注意:获取的内容表示为远程分支。Fetch让您有机会在将更改集成到项目副本之前检查更改。显示你的和远程$git差异master..origin/master之间的变化

复制一个远程存储库并运行git branch -a(显示git所知道的所有分支)。它可能看起来像这样:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

在这里,master是本地存储库中的一个分支。Remotes /origin/master是远程命名origin上名为master的分支。你可以将其称为origin/master,如下所示:

git diff origin/master..master

你也可以把它称为remotes/origin/master:

git diff remotes/origin/master..master

这只是引用同一事物的两种不同方式(顺便说一句,这两个命令都表示“向我显示远程主分支和我的主分支之间的更改”)。

remotes/origin/HEAD是远程命名origin的默认分支。这让您可以简单地说origin而不是origin/master。