29

有人告诉我,您可以通过执行以下操作向与当前 Git 分支名称匹配的远程分支推送和拉取:

git push origin HEAD

或者

git pull origin HEAD

它以前一直对我有用,但奇怪的是有时它不起作用,而是推迟从分支推/拉(这会导致拉合并......不是我想要做的)。我知道您可以通过简单地使用分支名称轻松地从您所在的分支推/拉,例如:

git pull origin name-of-branch-i-want-to-pull-from

无论如何

  1. 是否有某些原因导致 HEAD 丢失跟踪/未指向我当前的分支,就像它几乎总是这样?
  2. 有没有什么方法可以推送/拉到我当前正在处理的分支(只要远程分支的名称匹配)而不在命令中明确命名分支?
4

3 回答 3

7

感谢@abackstrom 的一些认真帮助,我能够解决我的问题。本质上,这篇文章是我的问题和解决方案:

Git 分支名为 origin/HEAD -> origin/master

正确“重新创建”/跟踪本地 HEAD 分支/指针的确切命令是:

git remote set-head origin -a

我希望这对遇到此问题的其他人有所帮助。

于 2012-11-15T22:29:31.120 回答
6

HEAD 并不是一个真正的分支。它是指向您当前已签出的提交的指针,并且通常会引用分支,但如果您执行类似git checkout <sha>or的操作git checkout <tag>,则 HEAD 会直接引用提交,与分支无关 - 这称为“分离的 HEAD”状态,并且您通常应该git checkout在进入这种状态时收到警告。在那种状态下,尝试推/拉 HEAD 没有意义,因为您不在分支上。

于 2012-09-21T15:47:11.837 回答
6

问题是,当你这样做时:

git push origin HEAD

HEAD这里表示本地存储库上的默认分支。

但是,当您这样做时:

git pull origin HEAD

HEAD这里表示远程存储库上的默认分支。

这 2 个 HEAD 可以具有相同的分支名称,但通常它们是不同的。

例如,如果你的本地仓库和远程仓库的默认分支都是master,那么你切换到feature本地仓库上的一个新分支,然后通过 do 将其推送到远程,远程git push origin HEAD上的默认分支不会被feature神奇地更改为。相反,它将停留在master. 在这一点上,如果你git pull origin HEAD在你的特性分支上做,你实际上是在做git pull origin master.

所以我建议避免这样做git pull origin HEAD,因为远程上的默认分支是什么并不明显,并且可能会导致意想不到的问题。

于 2020-11-16T16:42:22.443 回答