You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何修改文件不同行仍出现Git合并冲突?

Git合并冲突疑问

Atlassian的说明提到:冲突通常发生在两人修改了文件的同一行,或一人删除文件而另一人修改该文件时。

但在以下Git操作序列中,两个分支(master-dev5和master-dev6)分别修改了readme文件的不同行(第3行和第4行),然而将master-dev6合并到master或反向合并时却出现了冲突。这与上述说明不符,请问该冲突为何会发生?

$ git checkout -b master-dev5 master
$ git checkout -b master-dev6 master
$ git checkout master-dev5
$ cat readme
begin
added by dev1, added by dev2
added by dev3, added by dev4
$ echo "added by dev5">>readme
$ cat readme
begin
added by dev1, added by dev2
added by dev3, added by dev4
added by dev5
$ git add readme
$ git commit -m "dev5 add something on line4"
$ git checkout master-dev6
$ cat readme
begin
added by dev1, added by dev2
added by dev3, added by dev4
$ vim readme
$ cat readme
begin
added by dev1, added by dev2
added by dev3, added by dev4, added by dev6
$ git add readme
$ git commit -m "dev6 add something on line3"
$ git checkout master
$ cat readme
begin
added by dev1, added by dev2
added by dev3, added by dev4
$ git merge master-dev5
Updating 3b87e7c..28e91e1
Fast-forward
 readme | 1 +
 1 file changed, 1 insertion(+)

$ git merge master-dev6
Auto-merging readme
CONFLICT (content): Merge conflict in readme
Automatic merge failed; fix conflicts and then commit the result.

$ cat readme
begin
added by dev1, added by dev2
<<<<<<< HEAD
added by dev3, added by dev4
added by dev5
=======
added by dev3, added by dev4, added by dev6
>>>>>>> master-dev6

$ git merge --abort
$ cat readme
begin
added by dev1, added by dev2
added by dev3, added by dev4
added by dev5
$ git checkout master-dev6
$ git merge master
Auto-merging readme
CONFLICT (content): Merge conflict in readme
Automatic merge failed; fix conflicts and then commit the result.

$ cat readme
begin
added by dev1, added by dev2
<<<<<<< HEAD
added by dev3, added by dev4, added by dev6
=======
added by dev3, added by dev4
added by dev5
>>>>>>> master
冲突原因解析

Git判断合并冲突,看的不是最终文件里的行号,而是相对于共同祖先版本的变更上下文。

具体到这个场景:

  • 两个分支的共同祖先版本中,readme的最后一行是:added by dev3, added by dev4
  • master-dev5分支的变更是:在这一行的后面新增了一行(added by dev5)
  • master-dev6分支的变更是:修改了这一行的内容(末尾加上added by dev6)

当合并时,Git需要把这两个变更合并到一起。但master-dev5的新增操作,让原祖先版本的最后一行,在当前分支里变成了倒数第二行;而master-dev6的修改是针对祖先版本的最后一行。Git无法自动确定:是应该先修改原行再新增,还是先新增再修改哪一行?两个变更的上下文区域出现了重叠,所以触发了冲突。

Atlassian的说明只是常见冲突场景的简化总结,实际Git的冲突判断逻辑更关注变更的上下文关联,而非最终文件的行号。你的操作里,两个分支的变更在共同祖先的视角下,刚好影响了关联的上下文区域,所以出现了看似“不同行却冲突”的情况。

内容的提问来源于stack exchange,提问作者techie11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:07:18