首先请注意,您的问题有点误解。origin / HEAD表示远程站点上的默认分支,即您称为origin的远程存储库中的HEAD。当您在存储库中切换分支时,您不会受到影响。远程分支机构也是如此。您的仓库中可能有masterand origin/master,其中origin/master代表master远程存储库中分支的本地副本。
仅当您或其他人在远程存储库中实际更改了origin的HEAD时,才会更改HEAD,这基本上是不会发生的-您希望默认分支是公共仓库中稳定分支(可能是master)上的常数。origin / HEAD是本地引用,表示远程存储库中HEAD的本地副本。(其全名是refs / remotes / origin / HEAD。)
我认为以上内容回答了您实际上想知道的内容,但继续回答您明确提出的问题...克隆存储库时,将自动设置origin / HEAD,仅此而已。奇怪的是,它不是由类似的命令设置的git remote update-我相信它将更改的唯一方法是手动更改它。(通过更改,我的意思是指向另一个分支;很明显,如果该分支发生更改,它所指向的提交将指向更改,这可能发生在获取/拉动/远程更新时。)
编辑:下面讨论的问题已在Git 1.8.4.3中得到纠正;看到这个更新。
不过,有一个小小的警告。HEAD是一个符号引用,指向分支而不是直接指向提交,但是git远程传输协议仅报告引用的提交。因此,Git知道HEAD和所有其他引用所指向的提交的SHA1;然后,它必须通过找到指向同一提交的分支来推断HEAD的值。这意味着,如果有两个分支恰好指向那里,那就是模棱两可的。(我相信,如果可能的话,它会选择master,然后按字母顺序退回到第一。)您将在以下输出中看到此报告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
奇怪的是,尽管如果远程设备发生了更改(例如,如果foo被删除),以这种方式打印的HEAD的概念将会改变,但实际上并没有更新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变得悬空了(指向不存在的分支),并且它仍然没有更新它以指向master。如果要解决此问题,请使用git remote set-head origin -a,它会如上所述自动确定原点的HEAD,然后实际将origin / HEAD设置为指向相应的远程分支。
refs/origin/HEAD。这与存储库自己的符号引用HEAD的设置无关。