文本处理77 条

diff3 三方合并

把「我方 + 基线 + 对方」三份文件做三方比较合并,输出冲突标记结果:手工合并两处独立修改、核对配置变更。

Linux 运维命令速查系统更新于 2026-10-13

diff3 是什么

diff3 把三份文件放在一起比较:我方修改版、共同基线、对方修改版,并用 -m 输出合并结果,冲突处用标记括起来。手工合并两处各自独立的修改、核对配置变更时很有用;版本控制工具内部的合并策略,本质上也是这类三方比较。

基本信息

用途三路比较与合并(我方 / 基线 / 对方)
语法diff3 -m 我方文件 基线文件 对方文件
冲突标记小于号、竖线、等号、大于号组成的四类标记
输出特点-m 只写标准输出,需自行重定向

典型使用场景

  • 两个环境各自改过同一份配置,需要合并
  • 核对两处变更是否互相覆盖
  • 迁移前比对模板与两份实例配置
  • 手工合并后确认冲突段是否都已处理
  • 排查「合并完配置却没生效」的原因
  • 小规模三方对比,不必引入完整版本控制

常用示例

常用示例
diff3 -m config.local config.base config.remote > config.merged   # 合并输出
diff3 config.local config.base config.remote | head               # 只看差异描述
diff config.local config.base | head                              # 先看差异规模
grep -n '<<<<<<<' config.merged                                   # 检查是否还有冲突
diff config.merged config.remote | head                           # 复核合并结果
vimdiff config.local config.remote                                # 交互式合并替代方案

冲突标记读法

标记含义处理方式
小于号段起点冲突段开始,附我方文件名人工决定保留哪一侧
竖线分隔段共同基线的内容用于判断改动来源
等号分隔行左右两侧的分界上方为我方,下方为对方
大于号段终点冲突段结束,附对方文件名处理完要确认标记已清空
无标记输出自动合并成功仍需复核语义是否正确
顺序必须记牢:先「我的文件」、再「共同基线」、最后「对方文件」。顺序颠倒合并结果就会反过来,而且不容易一眼看出来。
-m 只输出到标准输出:要落地必须重定向;冲突段处理完之后还要再验证内容,别把冲突标记一起交付。
两边都大改过的文件做三方合并价值有限:先用 diff 看一眼差异规模,再决定是耐心合并,还是直接重新配置。

易错点

  • 参数顺序写错:合并结果方向反过来,与预期逻辑相反
  • 把 -m 的输出当最终文件:没有重定向等于白跑
  • 合并后不检查冲突标记:标记残留在配置里,程序解析直接报错
  • 对差异巨大的文件强行三方合并:耗费大量人工核对,不如重新配置

数据来源与参考

  • man 1 diff3(GNU diffutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌