为何修改文件不同行仍出现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
相关产品推荐
相关产品推荐

