Git pull origin HEAD

时间:2012-09-21 14:50:36

标签: git version-control git-branch git-pull

我被告知你可以通过以下方式从与当前Git分支名称匹配的远程分支推送和拉出:

git push origin HEAD

git pull origin HEAD

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

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

反正

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

Git branch named origin/HEAD -> origin/master

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

git remote set-head origin -a

我希望这可以帮助遇到这个问题的其他任何人。

答案 2 :(得分:0)

问题是,当您这样做时:

git push origin HEAD

HEAD表示您的本地存储库中的默认分支。

但是,当您这样做时:

git pull origin HEAD

HEAD表示远程存储库中的默认分支。

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

例如,如果本地存储库和远程存储库的默认分支都是master,则您切换到本地存储库上的新分支feature,然后通过执行{{ 1}},远程的默认分支不会神奇地更改为git push origin HEAD。相反,它将停留在feature。此时,如果您在功能分支上执行master,则实际上是在执行git pull origin HEAD

因此,我建议避免执行git pull origin master,因为远程分支上的默认分支并不明显,并且可能导致意外问题。