我有一个分支设置来跟踪ref in origin. git checkout <branchname>切换到那个分支,一个git status将显示我的分支从原点到前方或后方的距离,但我origin/HEAD仍然感到惊讶,仍然指向origin/master,而不是origin/<branchname>
所以我的问题是,在什么情况下起源/ HEAD会被移动?
编辑:
我很欣赏有关如何移动origin/HEAD 的答案,但我对"有机"移动它感兴趣,除了明确告诉它这样做之外.
例如,当我切换分支时,git使HEAD指向我正在检出的分支,所以我很惊讶origin/HEAD不会以相同的方式移动.
Cas*_*bel 162
首先请注意,您的问题显示出一些误解.origin/HEAD表示远程的默认分支,即您正在调用源的远程存储库中的HEAD.当您在回购中切换分支时,您不会影响它.远程分支也是如此; 您可能拥有master并origin/master在您的repo中,其中origin/master表示master远程存储库中分支的本地副本.
如果你或其他人在远程存储库中实际更改了它,那么origin的HEAD只会改变,这基本上永远不会发生 - 你希望默认分支是一个公共仓库,在稳定的分支(可能是master)上保持不变.origin/HEAD是一个本地引用,表示远程存储库中HEAD的本地副本.(它的全名是refs/remotes/origin/HEAD.)
我认为以上回答了你真正想知道的内容,但是继续回答你明确要求的问题...当你克隆一个存储库时,origin/HEAD会自动设置,就是这样.奇怪的是,它不是由命令设置的git remote update- 我相信它会改变的唯一方法是手动更改它.(通过更改,我的意思是指向不同的分支;显然,如果该分支发生更改,则指向更改的提交,这可能发生在fetch/pull/remote update上.)
编辑:下面讨论的问题在Git 1.8.4.3中得到了纠正; 看到这个更新.
不过,有一个小小的警告.HEAD是一个符号引用,指向分支而不是直接指向提交,但git远程传输协议仅报告refs的提交.所以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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,虽然如果遥控器上的东西发生变化,以这种方式打印的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)
Run Code Online (Sandbox Code Playgroud)
因此,即使远程节目知道HEAD是主节点,它也不会更新任何内容.陈旧的foo分支被正确修剪,并且HEAD变得悬空(指向不存在的分支),并且它仍然不会将其更新为指向master.如果要解决此问题,请使用git remote set-head origin -a,如上所述自动确定原点的HEAD,然后实际设置origin/HEAD指向适当的远程分支.
eis*_*eis 67
这是您作为本地仓库所有者的设置.像这样改变它:
git remote set-head origin some_branch
Run Code Online (Sandbox Code Playgroud)
而origin/HEAD将指向您的分支而不是主分支.这将仅适用于您的回购,而不适用于其他回购.默认情况下,它将指向master,除非在远程仓库上配置了其他内容.
远程set-head的手动输入提供了一些很好的信息.
编辑:强调:没有你告诉它,它"移动"的唯一方法就是重命名主分支,我不认为这是"有机".所以,我会说有机它不动.
Rob*_*mer 21
什么移动起源/ HEAD"有机"?
git clone 将它设置为HEAD在原点的位置
git cloneHEAD原产地代表什么?
git clone以这种方式使用它什么设置起源/ HEAD?
git clone 取出并设置它git fetch更新它像任何其他引用一样有意义,但事实并非如此git remote set-head origin -a 取出并设置它
琐事
origin/HEAD 也可以在不联系遥控器的情况下设置为任何其他值: git remote set-head origin <branch>
jub*_*0bs 10
免责声明:这是Jefromi答案的更新,我写这篇文章是为了挽救好奇的一段时间.
我徒劳地试图复制(在Git 2.0.1中)remote HEAD is ambiguousJefromi在他的回答中提到的信息; 所以我做了一些挖掘(通过克隆https://github.com/git/git并搜索日志).它曾经是那样的
Run Code Online (Sandbox Code Playgroud)Determining HEAD is ambiguous since it is done by comparing SHA1s. In the case of multiple matches we return refs/heads/master if it matches, else we return the first match we encounter. builtin-remote needs all matches returned to it, so add a flag for it to request such.
(承诺4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771,日期为2009年2月27日,发现时git log --reverse --grep="HEAD is ambiguous")
但是,有问题的模糊性已被解除:
Run Code Online (Sandbox Code Playgroud)One long-standing flaw in the pack transfer protocol used by "git clone" was that there was no way to tell the other end which branch "HEAD" points at, and the receiving end needed to guess. A new capability has been defined in the pack protocol to convey this information so that cloning from a repository with more than one branches pointing at the same commit where the HEAD is at now reliably sets the initial branch in the resulting repository.
(承诺9196a2f8bd46d36a285bdfa03b4540ed3f01f671,日期为2013年11月8日,发现时git log --grep="ambiguous" --grep="HEAD" --all-match)
编辑(感谢torek):
$ git name-rev --name-only 9196a2f8bd46d36a285bdfa03b4540ed3f01f671
tags/v1.8.4.3~3
Run Code Online (Sandbox Code Playgroud)
这意味着,如果您使用的是Git v1.8.4.3或更高版本,则不应遇到任何模糊的远程HEAD问题.
请记住,我们正在谈论两个独立的git回购.您的本地仓库与您的代码和远程运行在其他地方.
你是对的,当你改变一个分支时,HEAD指向你当前的分支.所有这一切都发生在你当地的git repo上.不是远程仓库,可能由另一个开发人员拥有,或者选址在办公室的服务器上,或github,或文件系统上的其他目录,等等......
您的计算机(本地存储)没有业务更改远程git仓库上的HEAD指针.例如,它可能由不同的开发人员拥有.
还有一件事,你的计算机调用源/ XXX是你的计算机在最后一次获取时对远程状态的理解.
那么什么会"有机地"更新origin/HEAD?这将是远程git仓库的活动.不是你当地的回购.
人们提到过
git symbolic-ref HEAD refs/head/my_other_branch
通常,当服务器上有共享的中央git仓库供开发团队使用时使用.它将是在远程计算机上执行的命令.你会在远程git repo上看到这个活动.
| 归档时间: |
|
| 查看次数: |
152553 次 |
| 最近记录: |