起源/ HEAD如何设置?
我有一个分支设置来跟踪原始参考。 git checkout <branchname>
切换到该分支,并且git status
将显示我的分支从原点git checkout <branchname>
有多远,但我很惊讶origin/HEAD
仍指向origin/master
点,而不是origin/<branchname>
所以我的问题是,在什么情况下origin / HEAD被移动?
编辑:
我很欣赏关于如何移动origin / HEAD的答案,但我对“有机地”移动它感兴趣,除了明确地告诉它这样做。
例如,当我切换分支时,git让HEAD指向我正在检查的分支,所以我很惊讶原点/ HEAD不以相同的方式移动。
首先注意你的问题显示了一些误解。 origin / HEAD表示远程设备上的默认分支 ,即位于该远程存储库中您称之为原始设备的HEAD。 当您在回购中切换分支时,您不会影响到这一点。 远程分支也是如此; 您可能在您的仓库中拥有master
和origin/master
,其中origin/master
代表远程仓库中master
分支的本地副本。
如果你或者其他人在远程仓库中真正改变了它,原来的HEAD只会改变 ,这基本上不会发生 - 你希望默认分支公共仓库在稳定的分支(可能是主仓库)上保持不变。 origin / HEAD是代表远程存储库中HEAD本地副本的本地ref。 (它的全名是refs / remotes / origin / HEAD。)
我想上面的回答是你真正想知道的,但是要继续回答你明确提出的问题......克隆仓库时origin / HEAD会自动设置,这就是它。 奇怪的是,它不是由像git remote update
这样的命令设置的 - 我相信它会改变的唯一方法就是如果你手动改变它。 (通过更改,我的意思是指向不同的分支;显然,如果该分支更改,则指向更改的提交,这可能发生在提取/拉出/远程更新上。)
编辑 :下面讨论的问题在Git 1.8.4.3中得到纠正; 看到这个更新。
虽然有一个小小的警告。 HEAD是一个符号引用,指向一个分支,而不是直接提交,但是git远程传输协议只报告提交的提交。 所以Git知道HEAD和所有其他文件指向的提交的SHA1; 然后它必须通过找到指向相同提交的分支来推断HEAD的值。 这意味着如果两个分支碰巧指向那里,它是不明确的。 (我相信如果可能的话,它会选择主人,然后回到第一个字母)。你会在git remote show origin
的输出中看到这个报告:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
奇怪的是,虽然这种方式打印HEAD的概念将改变,如果事情改变远程(例如,如果foo被删除),它并没有实际更新refs/remotes/origin/HEAD
。 这可能会导致非常奇怪的情况。 说在上面的例子中,origin / HEAD实际上指向了foo,然后删除了origin的foo分支。 我们可以这样做:
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
所以,尽管远程节目知道HEAD是主人,但它不会更新任何东西。 陈旧的foo分支被正确修剪,并且HEAD变成悬挂(指向不存在的分支),并且它仍然不会将其更新为指向主。 如果你想解决这个问题,使用git remote set-head origin -a
,它会自动确定原点的HEAD,然后将原点/ HEAD设置为指向相应的远程分支。
这是您作为本地回购的所有者的设置。 像这样改变它:
git remote set-head origin some_branch
起源/ HEAD将指向您的分支,而不是主人。 这将只适用于您的回购,而不适用于其他回报。 默认情况下,它将指向master,除非在远程repo上配置了其他内容。
手动输入远程设置头提供了一些关于此的良好信息。
编辑:强调:没有你告诉它,它将“移动”的唯一方式就是重命名主分支,我认为它不被认为是“有机的”。 所以,我会有机地说它不会移动。
什么原点/头部“有机地”移动?
git clone
将它设置到HEAD所在的位置 git clone
后作为缺省分支来检出 HEAD在起源上代表什么?
git clone
以这种方式使用它 什么起源/头部?
git clone
获取并设置它 git fetch
更新它像任何其他参考,但它不会 git remote set-head origin -a
提取并设置它 琐事
origin/HEAD
也可以设置为任何其他值,而无需联系遥控器: git remote set-head origin <branch>