请注意,您的问题有些误解。origin/HEAD 表示远程默认分支,即您称为 origin 的远程存储库中的 HEAD。当您在仓库中切换分支时,并不会影响到它。远程分支也是如此;您可能在仓库中拥有 master 和 origin/master,其中 origin/master 表示远程存储库中 master 分支的本地副本。
只有当您或其他人实际在远程存储库中更改 origin 的 HEAD 时,它才会发生变化,这基本上永远不会发生——您希望公共 repo 的默认分支保持恒定,保持在稳定分支(可能是主分支)。origin/HEAD 是表示远程存储库中 HEAD 的本地引用。(其完整名称为 refs/remotes/origin/HEAD。)
我认为以上回答了你实际想知道的内容,但是为了回答你明确提出的问题...当你克隆一个仓库时,origin/HEAD会自动设置,就这样。奇怪的是,像
git remote update
这样的命令并不会设置它 - 我相信唯一的改变方法是手动更改它。(通过改变,我指的是指向一个不同的分支;显然,如果那个分支发生变化,它所指向的提交也会发生变化,这可能会在fetch/pull/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
,它会自动确定origin的HEAD如上所述,然后实际设置origin/HEAD以指向适当的远程分支。
refs/origin/HEAD
。这不涉及如何设置存储库自身的符号引用HEAD
。 - clacke