diff3用于三路文件对比与冲突合并,以base.txt为原始版本,mine.txt和theirs.txt为两个修改版本,识别重叠冲突并输出带标记的合并结果。

直接用 diff 看不到可编辑的差异内容,也做不到合并;真正能“边看边合”的,得靠 sdiff 或 vimdiff。别指望 cat 或 diff -u 自动帮你选哪行留、哪行删——它们只告诉你“不同”,不替你做决定。
用 sdiff 交互式并排对比+合并
sdiff 是最轻量、最接近“所见即所得”的合并方式,适合小文件、人工确认场景。
- 基础并排查看:
sdiff file1.txt file2.txt,左侧是file1.txt,右侧是file2.txt,中间符号含义:|表示该行内容不同,表示仅左有,<code>>表示仅右有 - 忽略空行干扰(避免被空白行带偏判断):
sdiff -B file1.txt file2.txt - 交互式合并到新文件:
sdiff -o merged.txt file1.txt file2.txt,运行后会逐行提示输入:l(取左)、r(取右)、e(编辑该行),Ctrl+D 保存退出 - 终端太窄导致换行错位?加
-w 160指定宽度:sdiff -w 160 -o merged.txt file1.txt file2.txt
用 vimdiff 直接编辑+同步写入
vimdiff 不是“看完了再合”,而是打开即进入双窗编辑态,改完就能存,适合需要精细调整或保留部分冲突内容的场景。
- 启动:
vimdiff file1.txt file2.txt,两窗并列,差异行自动高亮(通常粉底) - 跳转:
]c到下一个差异块,[c回上一个;光标停在哪一窗,就默认编辑哪一窗 - 把左窗当前行复制到右窗对应位置:
:diffgetbuf(注意冒号);反之亦然,先切到右窗再执行 - 想丢弃某侧修改、完全用另一侧覆盖?在对应窗口执行
:e! | set nomodified,重载原始内容并清除修改标记 - 保存退出:
:wqa(全部写入并退出),:qa!(不保存强制退出)
diff3 处理三方合并(比如 Git 冲突后手动解)
当你要合并的是“原始版 + A 修改版 + B 修改版”时,diff3 才是正解。它不是比两个文件,而是识别谁改了哪段、有没有重叠冲突。
- 标准三路比对:
diff3 base.txt mine.txt theirs.txt,其中base.txt是共同祖先(原始文件) - 生成带冲突标记的合并结果(类似 Git 的 diff3 -A base.txt mine.txt theirs.txt
- 只输出无冲突的合并内容(静默跳过冲突段):
diff3 -B base.txt mine.txt theirs.txt - 自定义标签让输出更清晰:
diff3 -L "BASE" -L "MINE" -L "THEIRS" base.txt mine.txt theirs.txt - 注意:
diff3输出里====开头的块就是冲突区,====1表示只有第一个文件不同,====(无数字)表示三者全不同——这才是真冲突,必须人工介入
真正麻烦的从来不是“怎么显示差异”,而是“同一段文本被两边都改了”——这种冲突 sdiff 会卡住让你选,vimdiff 会高亮但不自动标注来源,diff3 能标出三方关系却没法直接编辑。选哪个工具,取决于你手里的文件结构和是否接受命令行交互节奏。











