为何执行git revert时两个Git项目表现不同?
为什么Git Revert在两个项目中的表现不同?
核心原因是Git执行revert时,会基于目标提交的变更上下文反向应用修改,而两个项目第三次提交的内容对该上下文的影响完全不同。
先拆解关键背景:
- 第二次提交(C2)的唯一变更是:把
test.txt第二行从two改成2,对应的diff上下文为:one -two +2 three git revert C2的本质是:生成一个反向补丁(把2改回two),再尝试将这个补丁应用到当前最新提交(C3)上。
ProjectA触发冲突的原因
ProjectA的第三次提交(C3)修改了第三行,把three改成了3,此时文件内容为:
one 2 3 four
当Git尝试应用反向补丁时,会检查补丁的上下文:它期望第二行2的下一行是three,但实际是3——上下文不匹配,Git无法确定如何安全完成修改,因此触发合并冲突。
ProjectB无冲突的原因
ProjectB的第三次提交(C3)修改的是第四行,把four改成了4,文件内容为:
one 2 three 4
此时反向补丁的上下文(第二行2的上一行是one,下一行是three)和当前文件完全匹配,Git可以顺利将2改回two,因此没有冲突,直接进入提交信息编辑界面。
简单总结:Git revert依赖变更的上下文确认修改位置,当后续提交修改了目标变更的上下文行时,就容易触发冲突;如果后续修改的是无关行,上下文保持一致,就能顺利完成revert。
内容的提问来源于stack exchange,提问作者Zip
相关产品推荐
相关产品推荐

