在交互式rebase中挤压时的Git冲突

时间:2017-03-09 21:11:25

标签: git rebase merge-conflict-resolution

我有以下git历史记录

cd

我想将* bee55e9 (HEAD -> WM-290) - Jepessen : Little refactoring. (4 minutes ago) * 1a4470a - Jepessen : Project refactoring (5 minutes ago) * 399f769 - Jepessen : Added some documentation. (15 minutes ago) * cb1055e - Jepessen : Another Test passed. (21 minutes ago) * 549f147 - Jepessen : Another test passed. (24 minutes ago) * b77c862 - Jepessen : First test passed. (29 minutes ago) * d2c9d86 - Jepessen : Integer -> IntegerValue: Failing test added. (31 minutes ago) * 678c0b1 - Jepessen : ExpressionTest added. (2 hours ago) * b65284b - Jepessen : Refactored. (2 hours ago) * 29ccc99 - Jepessen : Solution Refactored. (2 hours ago) * 83f7a45 - Jepessen : Some Refactoring (2 hours ago) * c33b81f - Jepessen : Integer class added. (2 hours ago) * 1415bb4 - Jepessen : Leaf class added. (2 hours ago) * a25da8b - Jepessen : Added Expression project (2 hours ago) * aa9c4e8 (origin/master, origin/HEAD, master) - Jepessen : WMathTest C# solution added. (2 hours ago) * b31dc4d - Jepessen : .gitignore updated. (2 hours ago) * f7285b1 - Jepessen : Removed old files. (2 hours ago) * 8d1213c - Jepessen : .gitignore updated. (23 hours ago) * ed5a67a - Jepessen : WSchool project added. (24 hours ago) 分支压缩成一个提交。我使用命令

WM-290

在交互式变基中,我写道:

git rebase -i master

在变基期间,我收到以下错误消息:

pick a25da8b Added Expression project
s 1415bb4 Leaf class added.
s c33b81f Integer class added.
s 83f7a45 Some Refactoring
s 29ccc99 Solution Refactored.
s b65284b Refactored.
s 678c0b1 ExpressionTest added.
s d2c9d86 Integer -> IntegerValue: Failing test added.
s b77c862 First test passed.
s 549f147 Another test passed.
s cb1055e Another Test passed.
s 399f769 Added some documentation.
s 1a4470a Project refactoring
s bee55e9 Little refactoring.

但如果我使用命令error: Your local changes to the following files would be overwritten by merge: WMathTest/Expression/Expression.csproj Please commit your changes or stash them before you merge. Aborting Could not apply 83f7a45... Some Refactoring ,我会收到以下消息:

git mergetool

我唯一可以做的就是中止变基。

为什么会出现冲突,考虑到分支位于$ git mergetool No files need merging 分支的顶部,如果没有文件需要合并,我该如何解决呢?

编辑:

在冲突期间,这是命令master

的输出
git status

1 个答案:

答案 0 :(得分:1)

(我假设顶部的图形片段是git log --oneline --decorate或类似的输出。)

我不能立即明白是什么让你进入的情况,但情况本身已经足够清楚了: 1 在交互式rebase失败时,文件WMathTest/Expression/Expression.csproj在您的工作树中,但不在您的索引中。

据推测,提交83f7a45包含(包括或包括)添加新文件WMathTest/Expression/Expression.csproj,该文件不在存储在提交c33b81f Integer class added.中的快照中。但是,&#39 ;提交83f7a45中的s与您现在的工作树中的内容不匹配。具体来说,这个文件如何进入你的工作树,它处于现在的状态,当它在某些中间提交中时 - 是我发现有点不清楚的部分。对于这种情况,同一文件必须不在提交bee55e9 Little refactoring.中(如果 在该提交中,而不是a25da8b Added Expression project },Git会在rebase开始时安全地删除它。如果它在 bee55e9a25da8b中,Git会替换 带有起始版本的工作树文件,并且我们不再处于这种情况。唯一剩下的可能性是它不在提交 - 不在分支中提示而不是在第一个pick提交中 - 但由于某种原因现在正坐在工作树中。只有你可以解释。)

在任何情况下,由于此文件,交互式rebase用于挑选或压缩每个提交到当前索引和工作树的基础git cherry-pick操作失败。此文件没有合并冲突,因为它没有合并:它仅仅是以rebase的方式。

一个解决方案是提交它(跟踪它),或者在工作树中删除它,当它位于WM-290的顶端时,这样Git本身就会将其删除,或者它是&#39不要坐在路上。

另一个是跳过所有的rebase东西。如果您只是想让当前索引内容在分支WM-290的尖端成为单个提交,并且该单个提交具有作为其父级的提交,那么当前是master的提示,您可以只是做:

git reset --soft master
git commit

并编写一个全新的提交消息(请注意,这不会像git rebase -i那样为您构建中间压缩的提交消息)。 --soft告诉Git不要触摸索引(当然也不是工作树),因此索引继续包含WM-290引用提交bee55e9时的快照。这个reset只是将分支标签移回去,以便下一个新提交有aa9c4e8作为其父级:

                      newnewn        <-- WM-290
                     /
...--b31dc4d--aa9c4e8                <-- master
                     \
                      a25da8b--1415bb4--...--bee55e9   [was WM-290]

提交newnewn快照(我们目前还不知道的ID)将是与{{1}的快照相同的 }。 提交将为bee55e9。这就是aa9c4e8的作用:保持索引不变,以便新的提交将重新使用它,但移动分支名称,以便新的提交将继续其他一些提交。

1 嗯,对于那些与Git一起工作多年 fight 的人来说很清楚。 : - )