git pull origin HEAD
Posted
技术标签:
【中文标题】git pull origin HEAD【英文标题】:Git pull origin HEAD 【发布时间】:2012-09-14 00:24:24 【问题描述】:有人告诉我,您可以通过以下方式向与当前 Git 分支名称匹配的远程分支推送和拉取:
git push origin HEAD
或
它以前一直对我有用,但奇怪的是有时不起作用,而是推迟从 master 分支推/拉(这会导致拉时合并...不是我想要做)。我知道您可以通过简单地使用分支名称轻松地从您所在的分支推/拉,例如:
git pull origin name-of-branch-i-want-to-pull-from
无论如何:
-
是否有某些原因导致 HEAD 丢失跟踪/未指向我当前的分支,就像它几乎总是这样?
有没有什么方法可以推/拉到我当前正在处理的分支(只要远程分支的名称匹配)而不在命令中明确命名分支?
【问题讨论】:
【参考方案1】:问题是,当你这样做时:
git push origin HEAD
HEAD
在这里表示您的 本地 存储库上的默认分支。
但是,当你这样做时:
git pull origin HEAD
HEAD
在这里表示您的 remote 存储库中的默认分支。
这 2 个 HEAD 可以具有相同的分支名称,但通常它们不同。
例如,如果你的本地仓库和远程仓库的默认分支都是master
,那么你在本地仓库上切换到一个新的分支feature
,然后通过git push origin HEAD
将其推送到远程,默认远程分支不会神奇地更改为feature
。相反,它将保留在master
。此时,如果您在功能分支上执行git pull origin HEAD
,您实际上是在执行git pull origin master
。
所以我建议避免使用git pull origin HEAD
,因为远程上的默认分支是什么并不明显,并且可能导致意外问题。
【讨论】:
【参考方案2】:感谢@abackstrom 的大力帮助,我得以解决我的问题。 本质上,这篇文章是我的问题和解决方案:
Git branch named origin/HEAD -> origin/master
正确“重新创建”/跟踪本地 HEAD 分支/指针的确切命令是:
git remote set-head origin -a
我希望这对遇到此问题的其他人有所帮助。
【讨论】:
【参考方案3】:HEAD 并不是真正的分支。它是一个指向您当前已签出的提交的指针,并且通常会引用一个分支,但是如果您执行git checkout <sha>
或git checkout <tag>
之类的操作,那么 HEAD 会直接引用一个提交,而与分支无关 - 这是称为“分离的 HEAD”状态,当您进入这种状态时,您通常应该收到来自 git checkout
的警告。在那种状态下,尝试推/拉 HEAD 没有意义,因为您不在分支上。
【讨论】:
是的,这绝对是有道理的,因为那时你正在跟踪一个非分支,但这不是这里发生的事情。相反,我目前正在跟踪一个分支(例如标题为'patch'),我提交,然后我:git push origin HEAD
并推送到 origin/master 它也发生在拉取上。奇怪。以上是关于git pull origin HEAD的主要内容,如果未能解决你的问题,请参考以下文章
`git fetch` 和 `git remote update origin --prune` 的区别(以及跟`git pull` 的区别)
git pull origin master,在没有pull的情况下检查是不是有冲突