当有两个同名的原始分支时如何修复 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
两个问题:
- 你能解释一下为什么会这样吗?
- 我怎样才能解决这个问题而不进一步弄乱事情?
是的,您创建了一个名为 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/develop
和 origin/develop
.
解决方法是删除(或重命名)您的本地分支,这样它就不会那么混乱:
git branch -d origin/develop
与此同时,关于 git pull
需要了解的是,它实际上是 git fetch
后跟 git merge
。1 您永远不需要撤消 git fetch
部分,这是您可能要撤消的 git merge
部分。
1或 git fetch
后跟 git rebase
,如果您告诉它这样做的话。有多种方法可以使 pull 使用 rebase,这可能应该是默认的。 merges 和 rebases 都可以撤销,只是方法有点不同。
首先,我尝试通过将我的 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
两个问题:
- 你能解释一下为什么会这样吗?
- 我怎样才能解决这个问题而不进一步弄乱事情?
是的,您创建了一个名为 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/develop
和 origin/develop
.
解决方法是删除(或重命名)您的本地分支,这样它就不会那么混乱:
git branch -d origin/develop
与此同时,关于 git pull
需要了解的是,它实际上是 git fetch
后跟 git merge
。1 您永远不需要撤消 git fetch
部分,这是您可能要撤消的 git merge
部分。
1或 git fetch
后跟 git rebase
,如果您告诉它这样做的话。有多种方法可以使 pull 使用 rebase,这可能应该是默认的。 merges 和 rebases 都可以撤销,只是方法有点不同。