为什么 git 不能合并一个文本文件,在不同的行中有不同的更改?

Why git cannot merge a text file with different changes in different lines?

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

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

Line1
Line2
Line3 
Line4

然后我从主创建了2个分支。功能 1 和功能 2。

在 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

我不是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 工具中都是如此。

如果更改不重叠,默认合并配置将自动合并。但是 "overlap" 是以包含相邻行的方式定义的。因此,例如,当您对第 1 行进行更改时,这将与第 1 行 上的另一个更改重叠第 2 行(以及第 1 行之前或之后的插入)。