我设置了一个分支来跟踪origin中的引用。git checkout <branchname>
切换到该分支,git status
将显示我的分支距离origin有多远,但令我惊讶的是,origin/HEAD
仍然指向origin/master
,而不是origin/<branchname>
所以我的问题是,在什么情况下origin/HEAD会被移动?
编辑:
我很欣赏关于 * 如何 * 移动origin/HEAD的答案,但我感兴趣的是什么“有机地”移动它,在我明确告诉它这样做之外。
例如,当我切换分支时,git会让HEAD指向我要 checkout 的分支,所以我很惊讶origin/HEAD不会以同样的方式移动。
7条答案
按热度按时间cygmwpex1#
首先要注意你的问题有点误解。origin/HEAD代表远程上的默认分支,也就是你调用origin的远程仓库中的HEAD。当你在仓库中切换分支时,你不会影响它。远程分支也是如此;您的存储库中可能有
master
和origin/master
,其中origin/master
表示远程存储库中master
分支的本地副本。origin的HEAD只有在您或其他人在远程仓库中更改时才会更改,这基本上不应该发生-您希望默认分支public repo在stable分支(可能是master)上保持不变。origin/HEAD是一个本地ref,表示远程仓库中HEAD的本地副本。(它的全名是refs/remotes/origin/HEAD。
我认为上面的答案是你真正想知道的,但是继续回答你明确提出的问题... origin/HEAD是在你克隆一个仓库时自动设置的,仅此而已。奇怪的是,它 * 不是 * 由
git remote update
这样的命令设置的--我相信唯一的改变它的方法是你手动改变它。(我所说的改变是指向一个不同的分支;很明显,如果分支发生变化,那么它所指向的提交也会发生变化,这可能发生在获取/拉取/远程更新时。)编辑:下面讨论的问题已在Git 1.8.4.3中更正;请参阅this update。
但有一点需要注意。HEAD是一个符号引用,指向分支而不是直接指向提交,但Git远程传输协议只报告引用的提交。所以Git知道HEAD和所有其他引用指向的提交的SHA1;然后,它必须通过找到指向同一提交的分支来推导HEAD的值。这意味着如果两个分支碰巧指向那里,它是不明确的。(我相信如果可能的话,它会选择master,然后按字母顺序福尔斯到第一个。)您将在
git remote show origin
的输出中看到以下报告:奇怪的是,尽管以这种方式打印的HEAD的概念会随着远程数据库的变化而变化(例如,如果foo被删除),但它实际上并没有更新
refs/remotes/origin/HEAD
。这可能会导致非常奇怪的情况。假设在上面的例子中,origin/HEAD实际上指向foo,然后origin的foo分支被删除。我们可以这样做:因此,即使remote show知道HEAD是master,它也不会更新任何内容。过时的foo分支被正确地修剪,HEAD变成了悬空的(指向一个不存在的分支),它 * 仍然 * 不会更新它以指向master。如果你想修复这个问题,使用
git remote set-head origin -a
,它会自动确定origin的HEAD,然后实际上设置origin/HEAD以指向相应的remote分支。wnavrhmk2#
这是您作为本地存储库所有者的设置。请按以下方式更改它:
origin/HEAD将指向您的分支而不是master。这将只适用于您的存储库而不适用于其他存储库。默认情况下,它将指向master,除非在远程存储库上配置了其他内容。
Manual entry for remote set-head提供了一些有关此方面的有用信息。
编辑:强调:如果没有你的命令,它“移动”的唯一方式是renaming the master branch,我认为这不是“有机的”,所以,我会说有机地,它不会移动。
46qrfjad3#
什么会“有机地”移动原点/HEAD?
git clone
将其设置为HEAD位于原点的点一次git clone
进行克隆后,它将作为默认的 checkout 分支原点上的HEAD表示什么?
git clone
以这样的方式使用它什么设置原点/HEAD?
git clone
获取并设置它git fetch
像更新其他引用一样更新它,则会有意义,但它没有git remote set-head origin -a
获取并设置它琐事
origin/HEAD
也可以设置为任何其他值,而无需联系远程:git remote set-head origin <branch>
origin/HEAD
仅在命名远程时用作分支的快捷方式busg9geu4#
免责声明:这是对Cascabel's answer的更新,我写这篇文章是为了保存好奇的人一些时间。
我试图(在Git 2.0.1中)复制Cascabel在他的回答中提到的
remote HEAD is ambiguous
消息,但没有成功;所以我做了一些挖掘(通过克隆https://github.com/git/git和搜索日志)。(提交
4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771
,日期为2009年2月27日,与git log --reverse --grep="HEAD is ambiguous"
一起找到)然而,问题中的模糊性已被消除:
(提交
9196a2f8bd46d36a285bdfa03b4540ed3f01f671
,日期为2013年11月8日,与git log --grep="ambiguous" --grep="HEAD" --all-match
一起找到)编辑(感谢torek):
这意味着,如果你使用的是Git v1.8.4.3或更高版本,你应该不会遇到任何ambiguous-remote-HEAD问题。
uidvcgyl5#
记住我们讨论的是两个独立的git repo。你的本地repo和你的代码以及在其他地方运行的远程repo。
你是对的,当你改变一个分支时,HEAD会指向你当前的分支。所有这些都发生在你的本地git repo上。而不是远程repo,它可能属于另一个开发者,或者位于你办公室的服务器上,或者github,或者文件系统上的另一个目录,等等。
您的计算机(本地存储库)没有权利更改远程git存储库上的HEAD指针。例如,它可能属于其他开发者。
还有一件事,你的计算机称之为origin/XXX的东西是你的计算机对上次获取时遥控器状态的理解。
那么,用什么来“有机地”更新origin/HEAD呢?应该是远程git存储库上的活动,而不是本地存储库。
人们提到
git symbolic-ref HEAD引用/head/我的其他分支
通常,当服务器上有一个共享的中央git存储库供开发团队使用时,会使用这个命令。它是在远程计算机上执行的命令。您会在远程git存储库上看到这个活动。
xzlaal3s6#
从git CLI运行以下命令:
ncgqoxb07#
它由
git clone
和git remote add -m master $url
设置。除此之外,您必须手动设置它。我也发送了一些补丁来更新
git fetch
(取决于一些配置)。在我看来,这将是最有机的更新方式。不幸的是,他们还没有被合并。