我正在尝试理解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/master
和master
之间的术语差异。有人可以在这里教我正确的词汇吗?
答案 0 :(得分:5)
master
是一个分支。有时您可能将其称为“本地分支”。如果您想非常具体,可以说它是refs/heads
下的参考。
origin/master
是远程跟踪参考。有人将此称为远程跟踪分支。 (我认为,甚至文档也可能至少在某些地方使用了该术语。)这很不幸,因为它不是origin/master
的好名字,至少出于两个原因:
如果我有master
且它跟踪origin/master
,则也是表示我列为origin
遥控器的仓库有一个分支称为master
。 master
上的origin
分支不同于本地仓库中的origin/master
引用,并且如果有什么是“远程分支”,它就是远程仓库中的分支¹。在中间加上“跟踪”一词并不会减少混乱。承认远程跟踪参考是与分支不同的参考。
这表明origin/master
是分支的一种。当然origin/master
是 ref 的一种,通常(并非总是)与本地分支相关,并且与远程分支相关。但是它的行为不像分支。如果签出,则表明您处于分离状态。因此提交不会推进它。它有自己的约定(通过与遥控器的通信进行控制)。
毫无疑问,它是refs/remotes/origin
下的引用。
¹当您建议将基准重设为origin/master
可以替代pull
,然后再基准重设为master
时,这种区别的重要性就体现出来了。这不是因为您的origin/master
可能无法反映master
上的origin
现在是什么地方;它仅反映master
上origin
的位置 上次更新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万种不同的含义。 :-)好,不是很多,但是太多:
origin/master
之类的名称。 Git的名称(如master
和origin/master
)是namespaces中的名称。名称空间名称均以refs/
开头;分支名称特别是以refs/heads/
开头的ref(或引用),标记名称以refs/tags/
开头,远程跟踪名称以refs/remotes/
开头(并继续包括远程名称)。加上另一个斜线)。 (人们可以争论特殊名称HEAD
,MERGE_HEAD
,ORIG_HEAD
等是否也是refs /references。Git本身大多说不是,除非它说。他们是...。)