我试图理解 git 中关于本地存储库中源和非源空间之间划分的相关术语。
请考虑以下方案。我已经签出了分支foo
,我想将其重定基数到master
上,但首先我想确保master
远程存储库是最新的。 我可以这样做:
git checkout master
git pull
git checkout foo
git rebase -i master
这工作正常。但是,如果我进行获取然后重新定位到origin/master
,我可以避免master
结帐。
git fetch -a
git rebase -i origin/master
在试图向同事解释这两种方法之间的区别时,我意识到我不知道origin/master
和master
之间的术语差异。谁能在这里教我正确的词汇?
master
是一个分支。 有时您可以称其为"本地分支"。 如果你想非常具体,你可以说它是refs/heads
下的参考。
origin/master
是一个远程跟踪参考。 有些人称之为远程跟踪分支。 (我认为即使是文档也可能至少在某些地方使用该术语。 这很不幸,因为它不是一个好origin/master
名字,至少有两个原因:
如果我有
master
并且它跟踪origin/master
,这也意味着我列为origin
远程的存储库有一个名为master
的分支。origin
上的master
分支与我的本地存储库中的origin/master
ref 不同,如果有什么是"远程分支",那就是远程存储库¹上的分支。 将"跟踪"一词放在中间并不会使其不那么混乱;承认远程跟踪引用是与分支不同类型的引用确实如此。这表明
origin/master
是一种分支。 当然origin/master
是一种引用类型,它通常(并非总是)与本地分支相关,并且与远程分支相关。 但它的行为不像树枝。 如果你检查出来,你处于分离的头部状态;因此,承诺不会推进它。 它对如何移动有自己的约定(由与遥控器的通信控制)。
毫无疑问,它是refs/remotes/origin
下的参考。
¹当您建议将变基到origin/master
是替代pull
然后变基到master
时,这种区别的重要性就表现出来了。 这不是因为你的origin/master
可能无法反映master
现在origin
的位置;它仅反映您上次更新远程参考以进行origin
origin
master
的位置。 它大致相当于fetch
和变基到origin/master
,不同之处在于这让master
落后于origin/master
。
origin/master
是指向远程分支的指针,它指向远程origin
中的master
分支。master
是本地分支机构。 它们是两个不同的东西(但可以通过设置本地分支的upstream
分支来连接)。 并非所有本地分支都有上游分支。
不能直接更改origin/master
指向本地的内容。 您只能通过push
来做到这一点。
您可以添加另一个遥控器,例如fred
(带git remote add
)。fred
也可能有一个master
分支,并且会在您的存储库中显示为fred/master
。 您的本地master
不会fred/master
作为upstream
分支(默认情况下,但您可以更改它)。
Git 文档有时不太擅长明确区分,但一般来说,像master
这样的名称称为分支名称,而像origin/master
这样的名称称为远程跟踪分支名称。
我不喜欢后一个短语,因为很容易将它们混淆,特别是如果您删除一个单词或重新排序一两个单词。 我的首选新术语是远程跟踪名称,因为如果您删除带连字符的术语,很明显您不清楚:-),如果您删除名词而不是形容词,带连字符的术语远程跟踪仍然相当清晰。
这仍然为与 remote混淆留下了很大的空间,远程是像origin
本身这样的名称的术语:git remote
操纵这些远程,这些远程大多只是记住长 URL 的方法。 也很容易将其与动词跟踪或跟踪混淆,后者在 Git 中大约有 4000 万种不同的含义。:-) 好吧,不是那么多,而是太多了:
- 一个将其他名称设置为上游的分支据说可以跟踪上游。
- 当且仅当文件的路径名位于索引中时,才会跟踪该文件,否则将取消跟踪该文件。
-
远程跟踪名称是类似于
origin/master
.
Git的名字,如master
和origin/master
,是命名空间中的名字。 命名空间名称都以refs/
开头;分支名称是以refs/heads/
开头的 ref(或引用),标签名称以refs/tags/
开头,远程跟踪名称以refs/remotes/
开头(并继续包括远程名称加上另一个斜杠)。 (人们可以争论特殊名称HEAD
、MERGE_HEAD
、ORIG_HEAD
等是否也是引用/引用。 Git 本身大多说它们不是,除非它说它们是......