Linux 命令:diff3

概述

diff3 命令是三文件差异对比工具 ,是 diff 命令的扩展,核心作用是同时对比三个文本文件的内容差异 ,并精准标识出仅在单个文件出现、在两个文件共有、在三个文件都存在的行,还能输出合并冲突标记,是多人协作开发、多版本配置文件对比/合并的核心工具(比如Git多分支合并时的冲突排查,底层会用到类似的三文件对比逻辑)。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

一、核心特点

  1. 三文件对比 :区别于 diff(双文件)、comm(双文件),专门处理三个文件的行级差异;
  2. 冲突标识 :支持输出标准化的合并冲突标记,便于人工/工具合并多版本文件;
  3. 无需提前排序 :与 diff 一致,直接按原始行序对比,无排序要求;
  4. 多格式输出 :默认精简格式,还支持合并格式 (用于文件合并)、上下文格式(易读)。

二、基本语法

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的核心区别(易混淆,必分清)

diff3diff 的扩展,二者均为文本差异对比工具,但适用场景完全不同,核心差异体现在文件数量、使用场景、核心目标上:

命令 对比文件数 核心目标 典型使用场景 核心优势
diff 2个 分析两个文件的增删改细节 单文件双版本对比、制作补丁、配置文件单变更检查 双文件对比精度高、格式丰富、支持目录对比
diff3 3个 分析三个文件的行归属,输出合并冲突标记 多人协作(基准+两个修改版本)、多分支合并、三版本配置文件对比 原生支持三文件合并、标准化冲突标记、适配多人协作

通俗总结

  • 仅对比两个文件 的差异/制作补丁 → 用 diff
  • 同时对比三个文件 /多人协作合并多版本文件 → 用 diff3

八、关键注意事项

  1. 二进制文件 :与 diff 一致,diff3 会直接提示「Binary files ... differ」,不输出具体差异,三二进制文件对比无专用基础工具,需借助专业软件;
  2. 换行符兼容 :Windows文件的\r\n与Linux的\n会导致伪差异,合并前需用dos2unix转换所有文件的换行符;
  3. 基准文件约定 :无强制要求文件2为基准,但这是通用的行业约定,所有工具/文档均以此为标准,建议遵循(避免混淆);
  4. 冲突标记兼容diff3 -m 输出的冲突标记(<<<<<<</=======/>>>>>>>)是Git/SVN的标准冲突标记,可直接用Git/SVN的合并工具编辑;
  5. 超大文件diff3 逐行处理,对GB级超大文件处理效率较低,适合处理代码、配置文件、日志等中等大小的文本文件;
  6. 空文件处理:若其中一个文件为空,会被标识为「仅其他文件有」的行,合并时会将非空文件的行全部保留。

九、高频实战组合用法(直接复用)

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

十、总结

diff3Linux三文件差异对比/合并的专属工具 ,核心价值是适配多人协作的多版本文件对比与合并,其核心要点可总结为:

  1. 经典场景:文件2为基准,文件1/3为两个修改版本(通用约定);
  2. 核心用法-m 合并模式是实战核心,会输出标准化的Git兼容冲突标记;
  3. 冲突处理 :人工合并看冲突标记,自动合并用 -1/-2/-3 指定基准版本;
  4. 过滤伪冲突 :组合 -E(忽略空行)、-b(忽略空格)、-i(忽略大小写);
  5. 工具边界 :双文件对比用 diff,三文件对比/合并用 diff3
相关推荐
代码AI弗森2 小时前
WSL2:在 Windows 上获得一整套可托付的 Linux 工程环境
linux·运维·服务器
不会代码的小猴2 小时前
Linux环境编程第五天笔记
linux·笔记
firstacui3 小时前
搭建harbor仓库
linux·docker
niceffking3 小时前
Linux信号相关函数
linux·运维·服务器·linux信号
蚰蜒螟3 小时前
Linux 7 中的系统调用原理
linux·运维·服务器
Reuuse3 小时前
【linux】进程间通信
linux·运维·服务器
code monkey.3 小时前
【Linux之旅】Linux 动静态库与 ELF 加载全解析:从制作到底层原理
linux·服务器·c++·动静态库
Pluto_CSND3 小时前
CentOS系统中创建定时器
linux·运维·centos
好好沉淀3 小时前
Docker 部署 Kibana:查 ES 版本 + 版本匹配 + 中文界面
linux·docker