git pull origin HEAD

Posted

技术标签:

【中文标题】git pull origin HEAD【英文标题】:Git pull origin HEAD 【发布时间】:2012-09-14 00:24:24 【问题描述】:

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

git push origin HEAD


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

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 pull origin master命令后发生冲突

`git fetch` 和 `git remote update origin --prune` 的区别(以及跟`git pull` 的区别)

git pull origin HEAD

git pull origin master,在没有pull的情况下检查是不是有冲突

Git rebase local vs git pull --rebase origin

git.exe pull --progress -v --no-rebase "origin" master