【发布时间】:2020-12-21 05:57:47
【问题描述】:
我的存储库中有一个文件 data.csv,它代表一个 CSV 格式的数据库。为了举例,我们假设data.csv的内容是
1,2,3
2,3,4
4,5,6
原来我只有master分支,我创建了两个分支A和B,分别修改data.csv。我注意到有时,3-way diff 算法会识别出在我看来根本不应该是冲突的冲突。例如,如果A将文件修改为
1,4,5
2,3,4
4,5,6
和B修改文件为
1,2,3
2,6,7
4,5,6
当我从分支 B 发出 git merge A,而不是自动合并这些版本时,它实际上报告了以下冲突:
<<<<<<< HEAD
1,2,3
2,6,7
=======
1,4,5
2,3,4
>>>>>>> A
4,5,6
但在我看来,实际上这些版本应该可以与 3-way diff 逻辑在逐行级别上自动合并,因为 A 只修改第一行,而 B 只修改第二行。
我的问题:为什么会这样?有没有办法强制 Git 做一个更细粒度的差异(例如逐行)? (或者,有什么方法可以强制 Git 意识到这些更改实际上是可自动合并的?)
【问题讨论】:
-
@matt 感谢您的链接。它回答了我为什么会发生这种情况的问题,但我想知道是否有办法强制 git 更改其算法以逐行检查这些更改。例如,我注意到可以指定
git merge的diff-algorithm参数。这有帮助吗? -
虽然 diff 算法定义了每个更改的 范围,但选择如何组合这些范围的是 合并策略。理论上可以编写新的合并策略,但这非常困难:Git 现在(可能是今年或明年)近 20 年来第一次获得新的合并策略。也可以编写一个 merge driver 与现有的默认合并策略一起使用,这更加现实。这将是您的特定案例的方法。
-
@paulinho 我想知道new Git 2.30 Q1 2021 ORT merge strategy 是否会在这里改变任何东西(“表面上递归的双胞胎”)。
标签: git merge diff git-merge git-diff