起源/ 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。 当您在回购中切换分支时,您不会影响到这一点。 远程分支也是如此; 您可能在您的仓库中拥有masterorigin/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>
  • 除了测试,我没有看到这方面的用例
  • 不幸的是,遥控器上无法设置HEAD
  • 老版本的git不知道哪个分支HEAD指向远程,只有它最后有哪个提交散列:所以它只是希望选择一个指向相同散列的分支名称
  • 链接地址: http://www.djcxy.com/p/43605.html

    上一篇: How does origin/HEAD get set?

    下一篇: forward merges by default?