文本对比工具

在浏览器中运行,不上传任何内容

逐行比较文本的两个版本,并高亮显示改动的词。

Original

Modified

Differences

Nothing to compare yet

Paste or open the original text on the left and the modified text on the right. Lines are matched as in diff and git; changed lines show which words changed.
Ready

什么是文本 diff?

diff 显示一段文本的两个版本有何不同:哪些行被删除、哪些行是新增的、哪些行保持不变。git diff、代码评审工具以及大多数编辑器的比较功能都基于这个思路。

本工具和 diff、git 一样使用 Myers 算法来匹配行,找出最少的新增行和删除行。被修改的行会显示为一条删除行和紧挨着的替换它的新增行,行内改动的词会被高亮。

在 API 开发中,diff 能回答这样的问题:某个响应从昨天到现在变了什么,为什么预发布环境和生产环境返回的不一样,或者新版本的 API 增加或删掉了哪些字段。先用同样的方式格式化两个 JSON 响应(例如用 JSON 格式化工具),这样只会显示真正的改动。

使用方法

  1. 1把旧版本粘贴或打开到 Original,新版本放到 Modified。两个编辑器都可以拖入文件。Examples 中有三组示例可以试用。
  2. 2查看 Differences 面板:删除的行显示为红色并带 −,新增的行显示为绿色并带 +,行内改动的词会被高亮。在面板标题栏中切换 Side by side 和 Unified。
  3. 3Only changes 会把大段未改动的行折叠起来,只在每处改动周围保留三行;点击折叠行即可展开。用 F7 和 Shift+F7 或箭头按钮在改动之间跳转。
  4. 4用 Ignore 忽略空白、大小写或换行符(CRLF 与 LF)的差异。如果两段文本只有换行符不同,状态栏会给出提示。
  5. 5Copy patch 或 Download patch 会把改动输出为 git apply 和 patch 都能接受的 unified diff。Swap 交换两侧内容;Ctrl+Z 可逐侧撤销,也能撤销 Clear。

问题排查

每一行都显示为已修改
两段文本很可能使用了不同的换行符(Windows 的 CRLF 与 LF)或不同的缩进。状态栏会显示换行符类型;请打开 Ignore line endings 或 Ignore whitespace。
两个 JSON 响应看起来完全不同
其中一个可能是压缩过的,或者缩进方式不同。先在 JSON 格式化工具中用相同缩进格式化两者,再进行比较。它的 Compare 标签页还能按键比较 JSON,忽略键的顺序。
最后一行看起来一样,却显示为已修改
一段文本以换行结尾,另一段没有。diff 工具会把这算作改动(patch 中会出现 \ No newline at end of file)。Ignore line endings 会忽略它。
粘贴的文本从不显示 CRLF 换行符
浏览器会把文本框中输入或粘贴的所有换行都转换为 LF,所以 CRLF 无法通过粘贴保留。请用 Open 或拖放来打开文件:工具会按磁盘上的原样比较它们的换行符。
内容太大,无法比较
每一侧最多可容纳 50,000 行或 500 万个字符。更大的文件请在命令行使用 git diff --no-index a.txt b.txt 或 diff -u。

常见问题

为什么修改过的一行会显示为一次删除加一次新增?

diff 按整行比较。一行中只要有任何改动,旧行就不再匹配,所以它会被列为删除,新行列为新增,两者挨在一起。高亮的词显示了行内具体改了什么。

patch 会遵循 Ignore 选项吗?

不会。patch 总是描述精确的差异,包括空白、大小写和换行符,这样 git apply 和 patch 才能应用它。Ignore 选项只影响 Differences 面板显示的内容。

"shown as replaced" 是什么意思?

当两段很大的文本几乎没有共同点时,找出最小 diff 可能要花很长时间。在完成一定量的计算后,工具会把剩余区域整体显示为删除和新增。结果仍然是正确的 diff,只是粒度更粗。

我的文本会被上传吗?

不会。比较在你的浏览器中完成。为了刷新后不丢失,粘贴的内容会保存在当前标签页的 session storage 中,直到你清除它或关闭标签页。Copy link 会把输入放在链接的 # 之后,浏览器从不把这部分发送给服务器,但拿到链接的人都能看到内容。布局和 Ignore 选项等设置会保存在当前浏览器中。