为什么我在做git rebase时得到一个奇怪的混乱

时间:2016-09-29 17:07:17

标签: git

所有

我的提交日志如下:

commit 1e17b836cce12d497ef86e5b2c45410c93caf3a2
    add 4
commit cbf7e720313ef6c918a8d4117df007eabe2ef92b
    add 3
commit 951f86964102e17cdf3e3c2978c1adf8d5cdfab7
    add 2
commit a275ad4e6716b950d86ce8885d766bba803fc9e0
    add 1
commit d14904ad7fa9142cbc38489d1d621d1a157aa0cd
    init commit

基本上,init commit是一个空白文件,每次提交我都会添加一行数字。现在,假设我要删除add 2操作但保留其他操作,有人告诉我应该使用git rebase -i HEAD~3

rebase向我显示要修改的历史记录,我将其更改为:

drop 951f869 add2
pick cbf7e72 add3
pick 1e17b83 add4

并保存。然后我遇到了冲突错误:

error: could not apply cbf7e72... add3

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

然后我使用git diff检查冲突的位置,我得到了:

diff --cc test
index 56a6051,5f5fbe7..0000000
--- a/test
+++ b/test
@@@ -1,1 -1,3 +1,7 @@@
- 1
++<<<<<<< HEAD
++1
++=======
+ 1
+ 2
 -3
++3
++>>>>>>> cbf7e72... add3

我的问题是:

如何计算出这个冲突?我的4号线在哪里?这个rebase冲突完全破坏了内容,并没有表明正确的差异,我无法根据当前的冲突文件解析出正确的内容。

那么正确的方法是什么?结果输出的分步示例将非常受欢迎。

3 个答案:

答案 0 :(得分:2)

如果我们在代码行中使用一些文本,可能会更容易解释。我只是创建一个文件,每次提交都会添加一个带有相应提交的新行。 e.g。

最终文件如下所示:

First Line
Second Line
Third Line
Fourth Line

然后,当我进行交互式rebase时,我会收到此提示:

<<<<<<< HEAD
First Line
=======
First Line
Second Line
Third Line
>>>>>>> 8ba3272... Added Third Line

以上所有内容=============是原始的,之后的所有内容都是第三次提交后的状态。存在合并冲突,因为它试图在第三行添加一行,而且还没有。所以这是您需要解决冲突的地方。如果您希望输出为:

First Line
Third Line

您只需要删除&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;和&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;标记并输入您希望文件显示的方式,然后执行git add然后git rebase --continue

然后它会尝试添加第4次提交,并且你会发现另一个合并冲突,因为它试图添加第四行。因此,您只需要以同样的方式解决冲突。接下来是另一个git rebase --continue来完成交互式rebase。

最终文件应如下所示:

First Line
Third Line
Fourth Line

并且git log会显示此信息(添加第二行的提交已被删除):

commit 9064bd9d9efece49c0cf2dacd41be98e8cb70d01
Author: Kief Kraken
Date:   Thu Sep 29 11:05:44 2016 -0700

    Added fourth Line

commit cdcd1a33fb7b41e583fdb8098b266b0fb6898aca
Author: Kief Kraken
Date:   Thu Sep 29 11:05:21 2016 -0700

    Added Third Line

commit 7744551b481d4c6f7f5da038c56f3044d8b000d2
Author: Kief Kraken
Date:   Thu Sep 29 10:52:20 2016 -0700

    Added first line

commit e8e76881002e361401bbaaa22140660ed026fd04
Author: Kief Kraken
Date:   Thu Sep 29 10:51:56 2016 -0700

    first commit

虽然这对于学习交互式变基的练习很有用,但我强烈建议使用合并工具,以便更轻松地管理这些任务并减少出错的空间。

答案 1 :(得分:1)

将提交add3重新定位到提交add1时,会发生冲突。在历史的这一点上,没有第4行。稍后将add4重新引用到重写的提交add3时将添加。

因此,只需修复您的文件以包含第1行和第3行,然后git add结果,然后继续git rebase --continue。我相信,你会再次遇到类似的冲突,这次是因为引入第4行的背景发生了变化。哪个可以轻松解决。

顺便说一句:我强烈建议使用diff3样式的提交标记。它们由

启用
git config merge.conflictstyle diff3

这将包括=======|||||||之间冲突行的第三个版本,其中显示了引入冲突更改之前的状态。这使您可以轻松查看每个方面实际更改的内容,从而提供更加明智,更可能正确的冲突解决方案。

答案 2 :(得分:0)

执行:

git mergetool

预计mergetool会“自动”解决冲突。然后执行:

git rebase --continue

你已经完成了。

考虑安装一些图形合并工具,例如“kdiff3”。