为什么 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
然后,您分支到 feature1
和 feature2
,编辑 feature1
中的第一行:
Line1changed
Line2
Line3
Line4
当你将它合并回 main
分支时,没有冲突,因为只有第一行被改变了。但是,当您将 feature2
合并到 main
时,第一行和第二行都有不同的版本,即
Line1changed (feature1) Line1 (feature1)
Line2 (feature1) Line2changed (feature2)
这引发了合并冲突,因为这两条线直接相邻。我认为对于相距一定数量的行内的类似更改也会发生这种情况。
但归根结底,合并冲突是软件开发中的常态,在 Git 以及任何其他 VCS 工具中都是如此。
如果更改不重叠,默认合并配置将自动合并。但是 "overlap" 是以包含相邻行的方式定义的。因此,例如,当您对第 1 行进行更改时,这将与第 1 行 或 上的另一个更改重叠第 2 行(以及第 1 行之前或之后的插入)。
我想知道你们中的一些人是否遇到过这个问题。
我的主分支中有一个 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
然后,您分支到 feature1
和 feature2
,编辑 feature1
中的第一行:
Line1changed
Line2
Line3
Line4
当你将它合并回 main
分支时,没有冲突,因为只有第一行被改变了。但是,当您将 feature2
合并到 main
时,第一行和第二行都有不同的版本,即
Line1changed (feature1) Line1 (feature1)
Line2 (feature1) Line2changed (feature2)
这引发了合并冲突,因为这两条线直接相邻。我认为对于相距一定数量的行内的类似更改也会发生这种情况。
但归根结底,合并冲突是软件开发中的常态,在 Git 以及任何其他 VCS 工具中都是如此。
如果更改不重叠,默认合并配置将自动合并。但是 "overlap" 是以包含相邻行的方式定义的。因此,例如,当您对第 1 行进行更改时,这将与第 1 行 或 上的另一个更改重叠第 2 行(以及第 1 行之前或之后的插入)。