删除该行将与更高版本产生冲突,这将改变same line.
正如“当 git revert 中止并显示错误消息时,我该怎么办? https://stackoverflow.com/a/6084535/6309",你需要解决合并、添加和提交。
恢复该提交的一种更简单的方法是交互式变基:
git rebase -i <SHA1 commit a>
然后你放弃提交b
.
但这仅在您尚未将分支推送到上游回购 https://stackoverflow.com/a/2749166/6309,因为它确实重写了提交的历史记录。
如果你已经推送了,那么git revert
是正确的方法,以便生成新的提交取消b
(并将新提交推送到上游存储库)。
详细信息:您的示例生成以下合并冲突:
C:\Users\VonC\prog\git\tests\18779372\r1>git lg
* 10b9953 - (HEAD)
* 07fff99 - c
* 3d888c4 - b
* 8c7155f - a
(git lg
is an 幻想的别名git log https://gist.github.com/VonC/972690#file-gitconfig-L9)
如果存在冲突,我更喜欢同时看到源(他们的)和目的地(我们的)and合并或恢复之前的原始部分:
git config merge.conflictstyle diff3
然后恢复:
git revert -n master~2
那会给出:
line1
line2
<<<<<<< HEAD
line3
line4
line5
||||||| 3d888c4... b
line3
=======
>>>>>>> parent of 3d888c4... b
这样,你就会看到什么git revert
做:一个merge之间:
- 提交的父级
b
(这显然不包含b
修改)
- and
HEAD
合并不能决定做什么section从第三行开始:
- 该部分不存在于
a
(the === >>>>
部分:“他们的”一方)
- 它被修改为
b
(原始部分之间||||
and ====
, 像之前一样revert
,只需line3
)
- 它是also修改于
HEAD
(the <<<< ||||
部分,加上line4
and line5
, 虽然line3
看起来没有变化)
如果从 commit 开始,合并冲突会更加明显a
as:
line1
line2
line3
line4
line5
并最终提交d
as:
line1
line2
line3b
line4c
line5d
(commit b
add 'd
' 到第 3 行,提交c
adds 'c
' 到第 4 行,提交d
adds 'd
' 到第 5 行)
然后恢复会给你:
git config merge.conflictstyle diff3
git revert -n master~2
cat afile.txt
line1
line2
<<<<<<< HEAD
line3b
line4c
line5d
||||||| 4ddccc1... b
line3b
line4
line5
=======
line3
line4
line5
>>>>>>> parent of 4ddccc1... b
这是从第 3 行开始的部分:
- equals
line3 -line4 -line5
在“他们的”中=== >>>
,它是b
,或提交a
)
- equals
line3b-line4 -line5
提交中b
(原部分||| ===
,合并/恢复之前)
- equals
line3b-line4c-line5d
in HEAD
'ours' <<< |||
三个不同的内容,合并者无法知道要做什么。