You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git Merge:conflictStyle的diff3与merge模式差异及原理

Git Merge默认算法与Diff3的差异及工作原理

Git合并冲突时,merge.conflictStyle配置决定了冲突内容的展示形式,可选值为默认的merge和diff3。很多人会发现diff3有时会生成范围更大的冲突块,本文将明确两者的算法差异,并解释默认merge算法的工作原理。

示例对比

基础文件(Base)

1
2
3

本地修改文件(Yours)

1
change1
change2
input1OnlyChange1
change3
change4
change5
change6
input1OnlyChange2
change7
change8
change9
2
3

远端修改文件(Theirs)

1
change1
change2
input2OnlyChange1
change3
change4
change5
change6
input2OnlyChange2
change7
change8
change9
2
3

默认merge模式的冲突结果

生成2处独立的冲突标记:

1
change1
change2
<<<<<<< HEAD
input1OnlyChange1
=======
input2OnlyChange1
>>>>>>> input2
change3
change4
change5
change6
<<<<<<< HEAD
input1OnlyChange2
=======
input2OnlyChange2
>>>>>>> input2
change7
change8
change9
2
3

diff3模式的冲突结果

仅生成1处大范围冲突标记:

1
<<<<<<< HEAD
change1
change2
input1OnlyChange1
change3
change4
change5
change6
input1OnlyChange2
change7
change8
change9
||||||| 0fcee2c
=======
change1
change2
input2OnlyChange1
change3
change4
change5
change6
input2OnlyChange2
change7
change8
change9
>>>>>>> input2
2
3

算法差异与默认merge原理

两者都基于三路合并逻辑(以Base为基准,对比Yours和Theirs的修改),但冲突块的划分逻辑有核心区别:

默认merge算法工作原理

  1. 先分别对比Base与Yours、Base与Theirs,定位出各自的修改区间。
  2. 当两个修改区间不重叠但相邻/接近时,算法会进一步对比Yours和Theirs在修改区间外的内容:如果存在连续的匹配内容,就会把冲突范围拆分到最小的独立差异点,生成多个小冲突块。
  3. 本质是在三路合并的基础上,增加了“冲突拆分”的逻辑,尽量缩小冲突范围,只保留真正有差异的行,方便用户逐个解决。

Diff3算法逻辑

  1. 直接定位Base中被Yours和Theirs共同修改的连续整体区间,只要两端的修改属于同一变更上下文,即使中间有大量相同内容,也会把整个区间包裹成一个冲突块。
  2. 会在冲突块中插入Base的原始内容(|||||||标记部分),帮助用户理解修改的上下文,但不会拆分相邻的独立差异点,因此冲突范围通常更大。

示例差异的原因

示例中Base的2和3之间为空,Yours和Theirs都在该区域插入了一整段内容,仅两处行不同:

  • 默认merge算法识别到这两处差异是独立的,周围内容完全一致,因此将冲突拆分成两个小块;
  • Diff3则把整个插入区间视为Base被修改的连续范围,因此将整段内容包裹成一个大冲突块,同时展示Base的空原始内容。

测试脚本(PowerShell)

rm -Force -r ./repo -ErrorAction Ignore
mkdir ./repo
cd ./repo
git init

# git config merge.conflictStyle diff3

cp ../../base.txt content.txt
git add *; git commit -m first

git branch base

git checkout -b input2
cp ../../input2.txt content.txt
git add *; git commit -m input2

git checkout base
cp ../../input1.txt content.txt
git add *; git commit -m input1

git merge input2

内容的提问来源于stack exchange,提问作者Henning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:46:02