所有
我的提交日志如下:
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冲突完全破坏了内容,并没有表明正确的差异,我无法根据当前的冲突文件解析出正确的内容。
那么正确的方法是什么?结果输出的分步示例将非常受欢迎。
答案 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)