起源分支机构与非起源分支机构的正确术语是什么?

时间:2018-08-23 17:58:31

标签: git

我正在尝试理解git中有关本地仓库中原始空间与非原始空间之间的划分的相关术语。

请考虑以下情形。我已经签出了分支foo,并且我想将其重新建立到master上,但是首先我要确保master是最新的远程仓库。 我可以这样做:

git checkout master
git pull
git checkout foo
git rebase -i master

这很好。但是,如果执行提取操作,则可以避免结帐master,然后改为基于origin/master

git fetch -a
git rebase -i origin/master

在试图向同事解释这两种方法之间的差异时,我意识到我不知道origin/mastermaster之间的术语差异。有人可以在这里教我正确的词汇吗?

3 个答案:

答案 0 :(得分:5)

master是一个分支。有时您可能将其称为“本地分支”。如果您想非常具体,可以说它是refs/heads下的参考。

origin/master是远程跟踪参考。有人将此称为远程跟踪分支。 (我认为,甚至文档也可能至少在某些地方使用了该术语。)这很不幸,因为它不是origin/master的好名字,至少出于两个原因:

  1. 如果我有master且它跟踪origin/master,则也是表示我列为origin遥控器的仓库有一个分支称为mastermaster上的origin分支不同于本地仓库中的origin/master引用,并且如果有什么是“远程分支”,它就是远程仓库中的分支¹。在中间加上“跟踪”一词并不会减少混乱。承认远程跟踪参考是与分支不同的参考。

  2. 这表明origin/master是分支的一种。当然origin/master ref 的一种,通常(并非总是)与本地分支相关,并且与远程分支相关。但是它的行为不像分支。如果签出,则表明您处于分离状态。因此提交不会推进它。它有自己的约定(通过与遥控器的通信进行控制)。

毫无疑问,它是refs/remotes/origin下的引用。


¹当您建议将基准重设为origin/master可以替代pull,然后再基准重设为master时,这种区别的重要性就体现出来了。这不是因为您的origin/master可能无法反映master上的origin现在是什么地方;它仅反映masterorigin的位置 上次更新origin的远程引用的位置。 大致等同于fetch,并将其变基为origin/master,区别在于这将master留在了origin/master之后。

答案 1 :(得分:2)

In [10]: from sample.models import Profile In [11]: Profile() Out[11]: <Profile: API KEY: 43065d5f-c7f5-42ea-bf7b-8d82cdb11541> In [12]: Profile() Out[12]: <Profile: API KEY: b86abd24-62d0-4d0e-b125-d37a7f14d182> In [13]: Profile.objects.get(id=1) Out[13]: <Profile: API KEY: 39aa9839-2ea5-43ca-9bbb-dfb08e48d775> In [14]: Profile.objects.get(id=1) Out[14]: <Profile: API KEY: 39aa9839-2ea5-43ca-9bbb-dfb08e48d775> 是远程分支的pointer,它指向远程origin/master中的master分支。 origin是本地分支。它们是两个截然不同的事物(但是可以通过设置本地分支的master分支来进行某种程度的连接)。并非所有本地分支机构都有上游分支机构。

您无法直接更改upstream在本地指向的内容。您只能通过origin/master来做到这一点。

您可以添加另一个遥控器,例如push(带有fred)。 git remote add也可能有一个fred分支,并会在您的存储库中显示为master。您的本地fred/master不会将master作为fred/master分支(默认情况下,但是您可以更改它)。

答案 2 :(得分:1)

Git文档有时不能很好地进行区分,但是一般来说,诸如master之类的名称称为分支名称,而诸如origin/master之类的名称则是 remote跟踪分支名称

我不喜欢后一个短语,因为将它们混淆起来太容易了,尤其是当您丢下一个单词或重新排列一两个单词时。我的新首选术语是远程跟踪名称,因为如果删除带连字符的术语,很显然您不清楚:-),并且如果删除名词而不是形容词,则带连字符的术语远程跟踪仍然很清楚。

这仍然与 remote 混淆,这是origin本身的名称的术语:git remote操纵这些 remotes ,这大多只是记住长网址的方法。将其与动词 track tracking 混淆也很容易,动词在Git中具有大约4000万种不同的含义。 :-)好,不是很多,但是太多:

  • 将其他名称设置为上游的分支称为 track 上游。
  • 仅当文件的路径名在索引中时,该文件才被跟踪。否则,该文件将被未跟踪
  • 远程跟踪名称origin/master之类的名称。

Git的名称(如masterorigin/master)是namespaces中的名称。名称空间名称均以refs/开头;分支名称特别是以refs/heads/开头的ref(或引用),标记名称以refs/tags/开头,远程跟踪名称以refs/remotes/开头(并继续包括远程名称)。加上另一个斜线)。 (人们可以争论特殊名称HEADMERGE_HEADORIG_HEAD等是否也是refs /references。Git本身大多说不是,除非它说。他们是...。)