概述
diff3 命令是三文件差异对比工具 ,是 diff 命令的扩展,核心作用是同时对比三个文本文件的内容差异 ,并精准标识出仅在单个文件出现、在两个文件共有、在三个文件都存在的行,还能输出合并冲突标记,是多人协作开发、多版本配置文件对比/合并的核心工具(比如Git多分支合并时的冲突排查,底层会用到类似的三文件对比逻辑)。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、核心特点
- 三文件对比 :区别于
diff(双文件)、comm(双文件),专门处理三个文件的行级差异; - 冲突标识 :支持输出标准化的合并冲突标记,便于人工/工具合并多版本文件;
- 无需提前排序 :与
diff一致,直接按原始行序对比,无排序要求; - 多格式输出 :默认精简格式,还支持合并格式 (用于文件合并)、上下文格式(易读)。
二、基本语法
bash
diff3 [选项] 文件1 文件2 文件3
- 常规使用中,文件2通常作为「基准文件/原始文件」,文件1和文件3是基于基准文件的两个修改版本(这是最常见的使用场景,如多人基于同一版代码修改);
- 支持
-作为文件参数,代表读取标准输入(如diff3 - file2 file3对比标准输入、file2、file3); - 核心输出为差异标记+行内容,通过特殊符号区分三个文件的行归属。
三、核心差异标记(默认精简格式,必记)
diff3 的默认输出用特殊符号前缀 标识行在三个文件中的归属,同时会标注行号范围,核心标记含义是基础(所有格式均基于此逻辑),其中文件2为基准文件是通用约定:
| 标记前缀 | 含义(行的归属) | 场景说明 |
|---|---|---|
=== |
三文件的行内容完全不同 | 合并冲突核心标记,需人工介入解决 |
==1 |
仅文件1包含的行(文件2/3无) | 基于基准的第一个版本新增行 |
==2 |
仅文件2(基准) 包含的行(文件1/3均删除) | 两个修改版本都删除了基准的某行 |
==3 |
仅文件3包含的行(文件1/2无) | 基于基准的第二个版本新增行 |
==12 |
行在文件1+文件2中存在,文件3无 | 第二个版本删除了基准/第一个版本保留的行 |
==13 |
行在文件1+文件3中存在,文件2无 | 两个修改版本都新增了相同的行 |
==23 |
行在文件2+文件3中存在,文件1无 | 第一个版本删除了基准/第二个版本保留的行 |
四、常用选项(高频且实用,无冗余)
diff3 选项围绕输出格式、合并冲突、易读性 设计,数量远少于 diff,重点掌握合并格式 和冲突标记相关选项即可覆盖99%场景:
| 选项 | 核心作用 | 实用场景 |
|---|---|---|
-m |
合并模式 :将三个文件合并为一个输出,用标准化冲突标记标识冲突行,无冲突行直接合并 | 多人协作合并多版本文件(核心用法) |
-E |
配合 -m 使用,忽略所有空行差异 |
合并时忽略无意义的空行增删,减少无效冲突 |
-i |
忽略大小写差异(如A/a、Hello/hello视为相同) | 对比配置文件/代码,忽略大小写笔误导致的伪差异 |
-b |
忽略空格数量差异(多个空格/制表符视为一个,行尾空格忽略) | 合并代码/配置时,忽略缩进/空格的无意义修改 |
-x |
仅输出存在差异的行,隐藏三个文件都相同的行 | 快速排查三文件的差异点,过滤无变更内容 |
-3 |
配合 -m 使用,采用文件3的内容自动解决冲突 |
无人工介入时,默认以其中一个版本为准合并 |
-1 |
配合 -m 使用,采用文件1的内容自动解决冲突 |
同上,默认以文件1为准 |
-2 |
配合 -m 使用,采用文件2(基准)的内容自动解决冲突 |
同上,默认以基准文件为准 |
五、核心使用场景(基准文件+两个修改版本,最常用)
diff3 的经典使用场景 是:文件2为基准原始文件 ,文件1和文件3是两个人/两个分支基于文件2的两个修改版本 ,通过 diff3 对比差异并合并,这也是多人协作中最常见的需求。
准备测试文件(贴合真实协作场景)
设定file2.txt为基准文件,file1.txt和file3.txt是两个修改版本:
txt
# file2.txt(基准/原始文件:初始版本的水果清单)
苹果
香蕉
橙子
葡萄
芒果
txt
# file1.txt(修改版本1:基于基准的修改)
苹果
香蕉
柚子 # 修改:橙子→柚子
葡萄
# 新增:空行
榴莲 # 修改:芒果→榴莲
txt
# file3.txt(修改版本2:基于基准的修改)
苹果
香蕉
橙子
提子 # 修改:葡萄→提子
芒果
草莓 # 新增:最后一行
六、经典实操示例(从对比到合并,覆盖核心流程)
场景1:默认精简格式对比(查看三文件行归属)
直接执行对比,查看每行在三个文件中的归属,快速定位差异:
bash
diff3 file1.txt file2.txt file3.txt
核心输出(关键片段):
3:1c 2:3c 3:3c # 行号:file1第3行、file2第3行、file3第3行内容不同
==1 # 仅file1有:柚子
==2 # 仅file2有:橙子
==3 # 仅file3有:橙子(与基准一致)
4:1c 2:4c 3:4c # file1第4行、file2第4行、file3第4行内容不同
==12 # file1+file2有:葡萄
==3 # 仅file3有:提子
5:1a 2:5c 3:5c # file1第5行新增、file2第5行、file3第5行差异
==1 # 仅file1有:(空行)
6:1c 2:5c 3:5c # file1第6行、file2第5行、file3第5行差异
==1 # 仅file1有:榴莲
==23 # file2+file3有:芒果
3:6a # file3第6行新增
==3 # 仅file3有:草莓
解读:通过标记快速看出------柚子仅在版本1、提子仅在版本2、榴莲仅在版本1、草莓仅在版本2,这是人工合并的核心依据。
场景2:核心用法!合并模式(-m)+ 冲突标记(最常用)
用 -m 选项将三个文件合并为一个输出,用标准化冲突标记标识冲突行,无冲突行直接合并,这是多人协作合并文件的核心操作:
bash
diff3 -m file1.txt file2.txt file3.txt
合并输出(含冲突标记,关键片段):
苹果
香蕉
<<<<<<< file1.txt # 冲突开始:file1的内容
柚子
======= # 冲突分隔符:中间为基准,两侧为两个修改版本
橙子
>>>>>>> file3.txt # 冲突结束:file3的内容
<<<<<<< file1.txt
葡萄
=======
提子
>>>>>>> file3.txt
<<<<<<< file1.txt
榴莲
=======
芒果
>>>>>>> file3.txt
草莓
核心解读:
- 无冲突的行(苹果、香蕉、草莓)已直接合并;
- 有冲突的行用
<<<<<<< 文件名(冲突开始)、=======(分隔符)、>>>>>>> 文件名(冲突结束)标记,这是通用的合并冲突标记(Git/SVN均采用此格式); - 冲突区域内清晰展示两个修改版本的内容,便于人工判断并合并。
场景3:合并时忽略空行/空格(-m -E -b,实用组合)
合并代码/配置文件时,空行、缩进空格的差异会产生伪冲突 ,组合 -E(忽略空行)、-b(忽略空格)可过滤无意义差异:
bash
diff3 -m -E -b file1.txt file2.txt file3.txt
效果:会自动忽略file1中的空行差异,合并结果中无空行相关的伪冲突,更简洁。
场景4:自动解决冲突(-m -3,以某版本为准)
若无需人工介入,可指定以某个文件的内容自动解决冲突(如以file3为准,-3),适合批量合并无核心冲突的场景:
bash
diff3 -m -3 file1.txt file2.txt file3.txt
合并效果 :所有冲突区域都会自动采用file3的内容,输出无冲突标记的合并文件,例如:
苹果
香蕉
橙子 # 自动用file3的内容(替代file1的柚子)
提子 # 自动用file3的内容(替代file1的葡萄)
芒果 # 自动用file3的内容(替代file1的榴莲)
草莓
同理,-1 以file1为准,-2 以基准file2为准。
场景5:仅输出差异行(-x,快速排查)
过滤三个文件都相同的行,仅显示存在差异的行,适合快速定位三文件的核心变更点:
bash
diff3 -x file1.txt file2.txt file3.txt
效果:仅输出柚子、提子、榴莲、草莓、空行等差异行,隐藏苹果、香蕉等无变更行。
场景6:将合并结果写入文件(重定向,实战必备)
将 diff3 的合并结果(含冲突标记/自动解决后的内容)写入新文件,便于后续编辑/使用:
bash
# 含冲突标记的合并结果写入merge_result.txt
diff3 -m -E -b file1.txt file2.txt file3.txt > merge_result.txt
# 以file3为准自动解决冲突,结果写入auto_merge.txt
diff3 -m -3 -E -b file1.txt file2.txt file3.txt > auto_merge.txt
七、与diff的核心区别(易混淆,必分清)
diff3 是 diff 的扩展,二者均为文本差异对比工具,但适用场景完全不同,核心差异体现在文件数量、使用场景、核心目标上:
| 命令 | 对比文件数 | 核心目标 | 典型使用场景 | 核心优势 |
|---|---|---|---|---|
diff |
2个 | 分析两个文件的增删改细节 | 单文件双版本对比、制作补丁、配置文件单变更检查 | 双文件对比精度高、格式丰富、支持目录对比 |
diff3 |
3个 | 分析三个文件的行归属,输出合并冲突标记 | 多人协作(基准+两个修改版本)、多分支合并、三版本配置文件对比 | 原生支持三文件合并、标准化冲突标记、适配多人协作 |
通俗总结:
- 仅对比两个文件 的差异/制作补丁 → 用
diff; - 同时对比三个文件 /多人协作合并多版本文件 → 用
diff3。
八、关键注意事项
- 二进制文件 :与
diff一致,diff3会直接提示「Binary files ... differ」,不输出具体差异,三二进制文件对比无专用基础工具,需借助专业软件; - 换行符兼容 :Windows文件的
\r\n与Linux的\n会导致伪差异,合并前需用dos2unix转换所有文件的换行符; - 基准文件约定 :无强制要求文件2为基准,但这是通用的行业约定,所有工具/文档均以此为标准,建议遵循(避免混淆);
- 冲突标记兼容 :
diff3 -m输出的冲突标记(<<<<<<</=======/>>>>>>>)是Git/SVN的标准冲突标记,可直接用Git/SVN的合并工具编辑; - 超大文件 :
diff3逐行处理,对GB级超大文件处理效率较低,适合处理代码、配置文件、日志等中等大小的文本文件; - 空文件处理:若其中一个文件为空,会被标识为「仅其他文件有」的行,合并时会将非空文件的行全部保留。
九、高频实战组合用法(直接复用)
1. 多人协作核心合并(基准+两个修改版本,含冲突标记)
bash
diff3 -m -E -b 版本1.txt 基准.txt 版本2.txt > 合并结果.txt
2. 批量自动合并(以版本3为准,忽略空行/空格)
bash
diff3 -m -3 -E -b 版本1.txt 基准.txt 版本2.txt > 自动合并结果.txt
3. 快速排查三文件核心差异(仅输出差异行)
bash
diff3 -x -i -b 文件1 文件2 文件3
4. 对比标准输入+两个文件(如命令输出+两个配置文件)
bash
cat 临时文件.txt | diff3 - 文件2.txt 文件3.txt
十、总结
diff3 是Linux三文件差异对比/合并的专属工具 ,核心价值是适配多人协作的多版本文件对比与合并,其核心要点可总结为:
- 经典场景:文件2为基准,文件1/3为两个修改版本(通用约定);
- 核心用法 :
-m合并模式是实战核心,会输出标准化的Git兼容冲突标记; - 冲突处理 :人工合并看冲突标记,自动合并用
-1/-2/-3指定基准版本; - 过滤伪冲突 :组合
-E(忽略空行)、-b(忽略空格)、-i(忽略大小写); - 工具边界 :双文件对比用
diff,三文件对比/合并用diff3。