当有两个同名的原始分支时如何修复 git?

How to fix git when there are two origin branches with same name?

首先,我尝试通过将我的 origin/develop 分支移动到特定提交来撤消拉动(不要问我为什么):

git reset --hard <older-commit>
# trying to undo the pull (please don't ask why)
git branch -f origin/develop HEAD

看起来 git 创建了一个名为 origin/develop 的新本地分支:

git log -n 3 --decorate remotes/origin/develop

commit 43187d461a5e2b3a4a3443ac7d91d2414f6ccdd7 (origin/develop)
Author: me <me@me.com>
Date:   Tue Oct 13 17:10:29 2015 -0700

    Commit 3

commit 33187d461a5e2b3a4a3443ac7d91d2414f6ccdd6
Author: me <me@me.com>
Date:   Tue Oct 13 17:01:29 2015 -0700

    Commit 2

commit 23187d461a5e2b3a4a3443ac7d91d2414f6ccdd5 (HEAD, develop, origin/develop)
Author: me <me@me.com>
Date:   Tue Oct 13 17:00:29 2015 -0700

    Commit 1

两个问题:

  1. 你能解释一下为什么会这样吗?
  2. 我怎样才能解决这个问题而不进一步弄乱事情?

是的,您创建了一个名为 origin/develop 的本地分支。这就是 git branch 命令所做的:您要求它创建或替换现有 (-f) 本地分支 origin/develop,以便该特定分支指向与 [=16] 相同的提交=]:

git branch -f origin/develop HEAD

这个 "works"(对于 "works" 的某些值)因为所有本地分支实际上都以隐藏的 refs/heads/ 开头:您创建了 refs/heads/origin/develop。所有远程跟踪分支实际上都以隐藏的 refs/remotes/ 开头,然后是远程名称 (origin),后跟另一个 git 存储库正在使用的名称 (develop ) 与通常的路径名分隔符 /。所以你的本地 origin/develop 实际上是 refs/heads/origin/develop,它与 refs/remotes/origin/develop 有很大的不同,git 可以区分它们。但是当 git 为你缩短名字时,得到的短名字是 origin/developorigin/develop.

解决方法是删除(或重命名)您的本地分支,这样它就不会那么混乱:

git branch -d origin/develop

与此同时,关于 git pull 需要了解的是,它实际上是 git fetch 后跟 git merge1 您永远不需要撤消 git fetch 部分,这是您可能要撤消的 git merge 部分。


1git fetch 后跟 git rebase,如果您告诉它这样做的话。有多种方法可以使 pull 使用 rebase,这可能应该是默认的。 merges 和 rebases 都可以撤销,只是方法有点不同。