如何比较两个文本文件并查看改动内容

比较两个文本文件最快的方法,是把两者都粘贴进一个并排显示的 diff 工具, 然后阅读它高亮出的行。绿色表示新增,红色表示删除,而改动的行会同时显示两者。 无需安装、无需上传,几秒钟就能完成。

这能覆盖大多数情况。但屏幕上读起来完全一样的两个文件,逐字节看仍可能不一致, 而这正是人们白白耗掉一个下午的地方。本指南会展示快捷方法、一个实例、 值得了解的看不见的差异,以及像 ChatGPT 这样的 AI 聊天机器人真正能派上用场的场合。 如果你只想要工具,我们的 文本比较页面可以在你的浏览器里完成整个过程。

"比较两个文本文件"到底是什么意思

文本文件是被拆成一行行的字符序列。比较两个文件,就是把匹配的部分对齐、 把不匹配的部分标记出来。做这件事的经典工具是 Unix 的 diff 工具,而包括我们在内的每一款现代 diff 查看器,都是用更友好的方式做同一件事。

大多数 diff 工具先按行工作。这让它们在长文件上保持快速,也符合人的阅读习惯: 你先扫视出移动过的行,再看行内部改动的词。我们的引擎构建在 Google 的 diff-match-patch 之上,它会在查看单个字符之前先跑一遍行模式,所以一千行的日志也能瞬间完成 diff。

比较两个文本文件的几种方法

没有唯一正确的方法。这取决于文件在哪里,以及你需要多精确。

方法适合场景精确吗?工作量
并排阅读几行内容,一处明显的改动由你来判断
在线 diff 工具快速检查,随处粘贴是,逐字符精确
命令行(diffgit diff磁盘上的文件、脚本处理、超大文件
代码编辑器(VS Code "比较")已经在编辑器里打开的文件
AI 聊天机器人(ChatGPT)用大白话概述改动否,可能遗漏或改写

对一次性的检查来说,浏览器工具在速度上占优,因为没有东西要安装,你可以直接从邮件、 日志或代码评审里粘贴。对于已经在仓库里被跟踪的文件, git diff 就在手边。我们稍后会回到 AI 这个选项, 因为它在合适的场合确实有用,在不合适的场合则是个陷阱。

在浏览器中比较两个文本文件,分步操作

当有人发给你一份文档的两个版本、问"哪里不一样?"时,这就是你要走的流程。 大约十秒钟。

  1. 打开文本比较工具
  2. 把原文粘贴到左侧,新版本粘贴到右侧。或者用上传直接从磁盘加载文件。
  3. 阅读高亮。新增行是绿色,删除行是红色,改动过的行显示为一红一绿的一对。
  4. 滚动查看改动的行。每一行内部会标出确切不同的词,这样你就不用重读整行。
  5. 如果两个文件看起来差异远大于本应有的程度,请跳到下面的看不见的差异一节。

一个实例

假设一位同事把编辑过的段落发回来,请你核对他们的改动。这是你的原文:

The service starts at 9am on weekdays.
Refunds are processed within 14 days.
Contact [email protected] for help.

这是他们的版本:

The service starts at 8am on weekdays.
Refunds are processed within 30 days.
Contact [email protected] for help.
Priority support is available on request.

把两者都放进 diff,真实的情况其实很简短,尽管在散文里很容易一扫而过:

实际改动了什么
之前之后改动
开始时间9am8am已修改
退款期限14 days30 days已修改
支持渠道[email protected][email protected]无改动
优先支持Priority support is available on request.已新增

两个数字变了,加了一句话。退款期限从 14 天翻倍到 30 天,正是那种你想在上线前抓住的改动, 而它离在快速阅读中隐形只差一个字符。这就是用 diff 处理文本、而不是相信自己眼睛的全部理由。

让人栽跟头的看不见的差异

有时 diff 会把屏幕上看起来完全相同的两个文件画成截然不同的样子。原因几乎总是一个你看不见的字符。 下面是常见的嫌疑对象。

看不见的差异从何而来该怎么办
换行符:CRLF vs LF一个文件保存在 Windows 上,另一个保存在 macOS 或 Linux 上统一换行符;参见换行约定
行尾空白留在行末的空格或制表符去掉行尾空白,或在工具支持时忽略它
字节顺序标记(BOM)编辑器在第一行加了一个看不见的标记保存为不带 BOM 的 UTF-8
制表符 vs 空格不同的编辑器或缩进设置选一种并转换;两者在屏幕上看起来一样
文本编码一个文件是 UTF-8,另一个是 Latin-1,导致带重音的字符字节不同把两者都重新保存为 UTF-8
不换行空格从网页或字处理软件粘贴而来查找并替换为普通空格

咬得最狠的是换行符。Windows 文件在每行末尾用回车加换行(CRLF);Mac 或 Linux 文件只用换行(LF)。 在同一个编辑器里打开两者,它们看起来一样,但每一行在字节层面都不同, 于是一个天真的 diff 会像圣诞树一样亮起来。如果整个文件都显示为已改动,请先查这一项。

ChatGPT 能比较两个文件吗?

能,而且现在很多人正是这么做:把两个版本粘进 ChatGPT (或另一个 AI 助手),问"改了什么?"对短文件来说效果不错,还能给你普通 diff 给不了的东西: 一段用日常语言写成的概述。"退款期限从 14 天变成了 30 天,并新增了一条优先支持", 对一位忙碌的读者来说,往往比一堵红绿相间的墙更有用。

问题在于精确度。语言模型不是 diff 算法。它可能漏掉一个字符的改动,在概述时悄悄改写某一行, 或在长文件上空间耗尽而跳过中间部分。这还意味着把你的文本交给第三方, 对任何敏感内容你可能都不愿意。所以这两类工具是互补的,而非对手。

一个好的工作流程:先把文件跑一遍确定性的 diff 工具,得到精确、逐字符准确的改动清单, 再把这份简短的清单粘进 AI 聊天机器人,让它用大白话解释影响。你既得到 diff 的准确, 又得到概述的可读性,而不必指望其中任何一方去做另一方的工作。

在命令行比较文件

如果文件已经在磁盘上,内置的 diff 命令只需一行:

diff old.txt new.txt

-u 得到 Git 使用的统一格式,或加 -w 忽略空白差异。 对仓库里的文件,git diff old.txt new.txt 做同样的事,并带颜色和词级高亮。 浏览器工具就是它的免终端版本:粘贴、阅读、完成。

相关工具

你要比较的很少只有纯文本。如果文件是结构化的,一个能理解格式的视图读起来更好: 比较 JSON 能处理重新排序的键和缩进噪声, 比较 CSV 能对齐行和列。在 diff 之前先清理一份杂乱的列表, 是 删除重复行行排序的活儿。

常见问题

在线比较文本文件会把它们上传到什么地方吗?
在 comparetext.org 上,比较是在你的浏览器里运行的。两个文件都由你自己机器上的 JavaScript 做 diff,所以除非你特意点击保存或分享,否则不会有任何内容被发送到服务器。这让它对草稿、合同、配置文件,以及任何你不愿粘进那种每敲一次键就上传的网站的内容,都是安全的。
为什么我的两个文本文件每一行都显示为不同?
几乎总是换行符的问题。一个文件保存在 Windows(CRLF)上,另一个保存在 macOS 或 Linux(LF)上,所以尽管看起来完全一样,每一行在字节层面都不同。第一行上一个隐藏的字节顺序标记(BOM),或制表符与空格之别,也会造成同样的结果。统一换行符,把两者都重新保存为 UTF-8,然后再做一次 diff。
我能不安装任何东西就比较两个文本文件吗?
可以。打开文本比较工具,把一个文件粘到左侧、另一个粘到右侧,或用上传从磁盘加载它们。diff 会即时出现,就在浏览器里,改动的行会被高亮。没有东西要下载,也不用创建账号。
ChatGPT 能替我比较两个文件吗?
能,对短文件用大白话概述改了什么,它很方便。但语言模型不是 diff 算法:它可能漏掉一处小改动,在概述时改写某一行,或跳过长文件的中间部分。想要精确、逐字符准确的比较,请用 diff 工具,然后如果你想要文字解释,再把结果交给 AI。
我该如何比较两个文件并忽略空白?
在命令行上,diff -w old.txt new.txt 会忽略空白差异,而 diff -b 会忽略空白数量的变化。在浏览器里,粘贴之前先去掉行尾空格并统一换行符,因为那些正是最常把 diff 弄乱的空白改动。目标是只留下会改变含义的编辑。
比较文本和比较代码有什么区别?
机制是一样的:两者都对齐匹配的行、标出其余部分。区别在于什么算作真正的改动。在散文里,一段重新排版的文字可能看起来像一处大改动,其实只挪动了一个词。在代码里,缩进和被挪动的函数很重要。像 JSON 比较这样能理解格式的视图,或一个能理解语言的编辑器,能为结构化文件减少这种噪声。

想试试吗?把你的两个文件粘进 文本比较工具,看看改动了什么。