文本对比工具
在浏览器中运行,不上传任何内容
逐行比较文本的两个版本,并高亮显示改动的词。
Original
Modified
Differences
Nothing to compare yet
什么是文本 diff?
diff 显示一段文本的两个版本有何不同:哪些行被删除、哪些行是新增的、哪些行保持不变。git diff、代码评审工具以及大多数编辑器的比较功能都基于这个思路。
本工具和 diff、git 一样使用 Myers 算法来匹配行,找出最少的新增行和删除行。被修改的行会显示为一条删除行和紧挨着的替换它的新增行,行内改动的词会被高亮。
在 API 开发中,diff 能回答这样的问题:某个响应从昨天到现在变了什么,为什么预发布环境和生产环境返回的不一样,或者新版本的 API 增加或删掉了哪些字段。先用同样的方式格式化两个 JSON 响应(例如用 JSON 格式化工具),这样只会显示真正的改动。
使用方法
- 1把旧版本粘贴或打开到 Original,新版本放到 Modified。两个编辑器都可以拖入文件。Examples 中有三组示例可以试用。
- 2查看 Differences 面板:删除的行显示为红色并带
−,新增的行显示为绿色并带+,行内改动的词会被高亮。在面板标题栏中切换 Side by side 和 Unified。 - 3Only changes 会把大段未改动的行折叠起来,只在每处改动周围保留三行;点击折叠行即可展开。用 F7 和 Shift+F7 或箭头按钮在改动之间跳转。
- 4用 Ignore 忽略空白、大小写或换行符(CRLF 与 LF)的差异。如果两段文本只有换行符不同,状态栏会给出提示。
- 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 选项等设置会保存在当前浏览器中。