Git pull origin HEAD

Ric*_*an7 20 git version-control git-pull git-branch

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

git push origin HEAD
Run Code Online (Sandbox Code Playgroud)

要么

git pull origin HEAD
Run Code Online (Sandbox Code Playgroud)

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

git pull origin name-of-branch-i-want-to-pull-from
Run Code Online (Sandbox Code Playgroud)

无论如何:

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

zhe*_*yue 11

问题是,当你这样做时:

git push origin HEAD
Run Code Online (Sandbox Code Playgroud)

HEAD这里指的是本地存储库上的默认分支。

但是,当您这样做时:

git pull origin HEAD
Run Code Online (Sandbox Code Playgroud)

HEAD这里指的是远程存储库上的默认分支。

这两个 HEAD 可以具有相同的分支名称,但很多时候它们是不同的。

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

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


twa*_*erg 5

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


Ric*_*an7 5

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

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

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

git remote set-head origin -a
Run Code Online (Sandbox Code Playgroud)

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