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 看一眼差异规模,再决定是耐心合并,还是直接重新配置。