应使用 diff -u file1 file2 而非默认格式,因其提供上下文行、明确标识增删行(-/+)、准确定位变更位置,避免默认格式中3c3等晦涩符号、无上下文、误报空格/大小写差异及静默跳过二进制文件等问题。

直接用 diff -u file1 file2,别用默认格式——它不显示上下文、难定位、易误读。
为什么默认 diff file1 file2 输出看不懂
它用 3c3、2d1 这类符号表示行操作(c=change, d=delete, a=add),但不带上下文,光看数字和 /<code>> 很难判断哪几行实际变了。比如:
2c2 Hello World
你得自己数行号、对照原文件才能确认改的是第几行。更糟的是,如果两个文件只有空格或大小写差异,它还会报“不同”,但你根本看不出是哪类差异。
- 默认输出不显示未变动的上下文行,无法确认修改位置是否准确
- 遇到空格缩进变化、行尾空格、大小写混用时,会误报差异
- 二进制文件或非文本文件(如 PDF、.so)会被静默跳过,不报错也不提示
用 diff -u 看真实改动,带上下文才可靠
-u 格式是事实标准:Git、patch、CI 脚本都依赖它。它用 - 表示旧文件删掉的行,+ 表示新文件新增的行,没符号的是共有的上下文(默认 3 行),能准确定位变更位置。
例如对比配置文件:
diff -u nginx.conf.bak nginx.conf
输出中:
-
--- nginx.conf.bak是第一个参数(基准文件) -
+++ nginx.conf是第二个参数(目标文件) -
@@ -10,5 +10,6 @@表示:从旧文件第 10 行起取 5 行,对应新文件第 10 行起取 6 行 - 真正改了的内容只出现在
-和+行,其余是辅助定位的“锚点”
如果上下文太少导致 patch 失败(比如两处改动只隔 1 行),可加大行数:diff -U5 file1 file2。
目录对比必须加 -r,但要搭配 -q 或 -u 才有用
diff -r dir1 dir2 单独用,会递归列出所有同名文件的默认格式差异,信息爆炸且难读;而 diff -rq dir1 dir2 只告诉你“哪些文件内容不同”,适合快速巡检。
- 想看具体哪几行不同:用
diff -ru dir1 dir2(-r+-u) - 想忽略空格/大小写干扰:加
-w或-i,如diff -ruw dir1 dir2 - 遇到只在一边存在的文件(如
Only in dir1: new.conf),diff不会比对——这不是 bug,是设计行为;真要强制生成“补丁流”才用-N,日常排查反而增加噪音
容易被忽略的三个细节
第一,diff 默认跳过二进制文件。如果 file1 实际是 zip 或 ELF,而你又没意识到,diff file1 file2 可能安静地啥也不输出,你以为相同,其实完全不是一回事。先用 file file1 确认类型。
第二,diff -u 的上下文行数是硬编码的,默认 3 行。如果两个文件结构高度相似、仅局部微调,3 行可能不足以唯一锚定变更块,这时 -U5 比 -u 更稳。
第三,顺序敏感——diff a b 和 diff b a 输出的 -/+ 方向相反,但语义一致。别靠符号方向猜“谁改了谁”,看参数顺序:第一个是源,第二个是目标。











