直接结论:diff 与 vimdiff 分工明确——diff -u 生成机器可读补丁,vimdiff 用于人工审阅合并;默认 diff 输出不友好,-u 是自动化和协作标配。

直接结论:用 diff 快速判断差异并生成可复用的补丁,用 vimdiff 人工审阅、编辑或合并差异——两者不是替代关系,而是分工明确。
什么时候该用 diff -u 而不是默认 diff
默认 diff 输出是“ed 风格”的指令格式(a/d/c),对人不友好,也不适合被其他工具消费。而 diff -u 输出统一格式(unified diff),每处差异带前后三行上下文,Git、patch、CI 日志都认它。
- 脚本里做自动化比对,必须加
-u,否则解析困难 - 想把差异保存成补丁文件供他人应用,命令得是
diff -u file1.txt file2.txt > change.patch - 如果文件只差一行,但上下文完全一样,
-u能一眼看出“改了哪一行”,默认输出可能只显示行号范围,容易误判 - 注意:
-u不影响判断逻辑,只改输出格式;若只想知道“是否不同”,用diff -q更轻量
vimdiff 启动后光标没停在差异处?试试这些操作
vimdiff 默认会高亮差异块,但有时光标卡在文件开头,尤其当首行就不同却没自动跳转时。这不是 bug,是 vim 的行为惯性。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 启动后立刻按
]c(不是]+c连按,而是组合键),跳到下一个差异块;[c返回上一个 - 如果两个文件长度差异大,某些“空行 vs 有内容”会被标为差异,但实际可能是缩进或换行符问题——这时先用
:set list显示不可见字符再判断 - 想把右侧修改同步到左侧?确保光标在左侧窗口,输入
:diffgetbuf(不是:diffget,后者不生效) - 退出前没保存又不想丢改动?用
:qa!强制退出,避免误存中间状态
忽略空格、大小写或空白行?别硬记参数,按场景选
真实工作里,配置文件或日志比对常被无关字符干扰。关键是分清:你到底想“过滤噪声”还是“承认语义等价”。
- 仅忽略空格和制表符:用
-w,比如比对 JSON 格式化前后;但注意它也会吞掉有意义的缩进差异 - 忽略所有空白行(比如多出的换行):用
-B,比-w更激进,适合比对模板生成结果 - 忽略大小写:用
-i,常见于比对 SQL 或 HTML 标签名,但小心Id和ID在代码中可能语义不同 - 慎用
-b(忽略空白字符变化):它和-w行为接近但不等价,-b不处理制表符,-w处理;日常优先选-w
比对目录或二进制文件?diff 有边界
diff 本质是文本行比较器,超出这个范围就得换思路。
- 递归比目录:用
diff -r dir1/ dir2/,但它只会比同名文件,且遇到二进制文件只报Binary files X and Y differ,不展开 - 真要确认二进制文件是否被篡改:用
cmp file1.bin file2.bin,它逐字节比,输出第一个不同字节的位置;或者用sha256sum file1.bin file2.bin看哈希是否一致 - 想排除某些文件(如日志、缓存):加
--exclude='*.log',注意引号防止 shell 展开 -
vimdiff不支持目录比对,强行传入目录会报错或静默失败,别试
最常被忽略的一点:无论用 diff 还是 vimdiff,如果两个文件编码不同(比如 UTF-8 vs GBK),差异输出可能全是乱码或误报——比对前先用 file -i file1.txt 确认编码,必要时用 iconv 统一转换。










