3

在 rebase 一个我几周没碰过的特性分支之前,它比 master 提前了 25 次提交。变基后,现在是 18 次提交。在此过程中,我必须解决几个冲突。可能正好是7。

什么可能导致这个数字变化?沿途发现并变成 NOOP 提交的樱桃精选?上述冲突解决方案?

4

2 回答 2

4

有几种可能的方式可能会发生这种情况 - 这不是一个详尽的列表,但应该让您了解这是如何发生的:

1. 精心挑选的提交

首先,您提到了来自您的分支的提交已被挑选到您要重新定位的上游分支的可能性:只是为了确认这一点,git rebase将跳过任何此类提交,这可能是差异的一部分。VonC对此问题的回答中对此进行了更多说明。

2. 冲突完全解决到上游版本

我最初的怀疑是,发生的事情是,当您在变基时发现冲突,您总是通过选择上游版本而不是您的更改来解决它们。(如果这没有响起,那么我的怀疑可能完全错误:))如果该提交没有引入其他非冲突更改,那么您的冲突解决方案将做的就是使树相同就像在它尝试从您的更改中应用补丁之前一样,所以没有什么可以提交的。

不幸的是,当这种情况发生时 git 给你的提示可能相当混乱。这是您将在 git 1.7.1 中看到的示例。首先,提交一个将与尚未从 origin/master 合并的更改发生冲突的更改:

$ git commit
[master 1efa20f] Add a change designed to conflict
 1 files changed, 1 insertions(+), 1 deletions(-)

...现在开始变基:

$ git rebase origin/master 
First, rewinding head to replay your work on top of it...
Applying: Add a change designed to conflict
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
CONFLICT (content): Merge conflict in src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
Failed to merge in the changes.
Patch failed at 0001 Add a change designed to conflict

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

看看冲突是什么:

$  git diff
diff --cc src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
index 36ec046,f4841ec..0000000
--- a/src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
+++ b/src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
@@@ -264,7 -264,7 +264,11 @@@ public class Image3DUniverse extends De
        public void cleanup() {
                timeline.pause();
                removeAllContents();
++<<<<<<< HEAD
 +              contents.clear();
++=======
+               contents.clear(); // A change designed to conflict
++>>>>>>> Add a change designed to conflict
                universes.remove(this);
                adder.shutdownNow();
                executer.flush();

我决定我喜欢上游的版本,所以编辑文件来解决这个问题:

$  vim src-plugins/3D_Viewer/ij3d/Image3DUniverse.java

分阶段解决该冲突:

$ git add src-plugins/3D_Viewer/ij3d/Image3DUniverse.java

现在尝试像往常一样继续使用变基:

$ git rebase --continue
Applying: Add a change designed to conflict
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

我认为在最新版本的 git 中,它表明您可能刚刚解决了对已经存在的内容的提交,并且您应该考虑正在做git rebase --skip. 然而,通常人们认为这是摆脱这种情况的唯一方法,所以:

$  git rebase --skip
HEAD is now at f3a2de3 3D Viewer: Avoid NPE when closing the viewer window.
Nothing to do.

该提交现在不会出现在git log.

3. 合并提交

您在下面的评论中提到,您在之后检查两个分支时看到了几个合并提交 - 这也可能是丢失提交的原因,因为git rebase默认情况下,当它准备提交列表以重新应用到上游时​​会忽略任何合并提交。

于 2011-02-16T06:30:15.917 回答
1

要稍微扩展 Jefromi 的评论,您可以比较git log --pretty=oneline -n18 <branch>with的输出,git log --pretty=oneline -n25 <branch>@{1}看看哪些提交丢失了。git reflog正如他所提到的,如果你已经完成了一些工作,你可能需要使用一点来确定哪个条目是你的 pre-rebase 分支头。

于 2011-02-16T07:40:17.547 回答