为什么git无法合并在不同行中具有不同更改的文本文件?

时间:2018-08-17 14:11:34

标签: git git-merge git-merge-conflict

我想知道你们中的某些人是否遇到过这个问题。

我的主分支中有一个txt文件。我加了四行

Line1
Line2
Line3 
Line4

然后我从主节点创建了2个分支。 Feature1和Feature2。

在feature1中,我将第一行从 Line1 更改为 Line1changed
在feature2中,我将第二行从 Line2 更改为 Line2changed

我将feature1合并到主分支中没有任何问题,然后当我尝试将feature2合并到主分支时,检测到冲突。

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

我想知道为什么。

$ git diff
diff --cc file.txt
index cd3d4bb,bb25698..0000000
--- a/file.txt
+++ b/file.txt
@@@ -1,4 -1,4 +1,9 @@@
++<<<<<<< HEAD
 +Line1changed
 +Line2
++=======
+ Line1
+ Line2changed
++>>>>>>> feature2
  Line3
  Line4

2 个答案:

答案 0 :(得分:2)

如果更改不重叠,则默认合并配置将自动合并。但是,“重叠”是以包含相邻行的方式定义的。因此,例如,当您更改第1行时,它将与第1行第2行(以及第1行之前或之后的插入)重叠。

答案 1 :(得分:0)

我不是Git合并算法的专家,但是我似乎想起了对于相邻线的更改有一个接近阈值,这会引发冲突。回顾一下,首先您在main分支中添加了四行:

Line1
Line2
Line3 
Line4

然后,您分支到feature1feature2,编辑feature1中的第一行:

Line1changed
Line2
Line3 
Line4

当您将此内容重新合并到main分支中时,没有冲突,因为仅更改了第一行。但是,当您将feature2合并到main中时,第一行和第二行都有不同的版本,即

Line1changed (feature1)   Line1        (feature1)
Line2        (feature1)   Line2changed (feature2)

这引发了合并冲突,因为这两行彼此直接相邻。我认为在相隔一定数量的行内进行类似的更改也会发生这种情况。

但是最重要的是,合并冲突是软件开发,Git以及其他任何VCS工具中都存在的事实。