Also available in 中文 English

OmniDiff 是一款开源文件对比工具,除了代码和普通文本,还能比较图片、PDF、字体、压缩包等文件。它会根据不同内容选择对应的 Diff 方式,例如代码按语法结构分析,图片比较像素变化,PDF 按页面检查,压缩包则可以继续查看内部文件。

目前 OmniDiff 支持 25 种通过 Tree-sitter 解析的代码和结构化文本类型,并可接入 Git、Jujutsu、VS Code 和 Neovim。相比普通 git diff,OmniDiff 遇到 PDF、图片、字体这类文件时,不只是显示一句 Binary files differ,还会继续分析文件内部到底发生了什么变化。

项目 Showcase: OmniDiff Showcase
GitHub: ivankovic/omnidiff

OmniDiff 是什么样的文件对比工具?

OmniDiff 的核心是 content-aware diffing,也就是先判断文件内容,再选择更合适的比较方式,而不是什么文件都按文本行处理。

官方展示过一个 Python 重构案例:GNU Diff 会把发生变化的整行标成删除和新增;OmniDiff 则会进一步识别真正修改的表达式,以及哪些代码只是移动了位置。遇到函数重构、代码块调整这类改动时,更容易看出真正改了什么,而不是被大段删除和新增淹没。

OmniDiff 与 GNU Diff 对比 Python 代码重构差异

代码和结构化文本部分目前使用 Tree-sitter 解析 25 种类型,常见的 Python、JavaScript、TypeScript、Rust、Go、Java、PHP、Swift、C/C++ 都在其中,同时也包括 JSON、YAML、XML 这类项目里经常出现的数据和配置格式。

严格来说,官方所说的 25 种并不全是“编程语言”。JSON、YAML、XML 更接近数据和配置格式。对开发者来说,这反而更实用,因为一个项目里真正需要检查的往往不只是源码,配置文件同样经常随着提交一起变化。

不是所有文本格式都会做结构化 Diff

OmniDiff 对不同格式的支持程度并不完全一样。

Python、Rust、JSON、YAML 等有对应解析器的格式,会经过 Tree-sitter 做结构化比较;Markdown、SQL、Dart、Protocol Buffers 等虽然可以识别,目前仍然按照普通文本逐行比较。

像 TOML、INI 这类没有列入结构化解析列表的文本文件,也不会因此无法比较,而是退回普通的逐行文本 Diff。

二进制文件也是类似的逻辑。图片、PDF、字体、压缩包等已经有专门的内容级处理方式;其他暂未支持的二进制文件,才会退回普通的二进制差异提示。

所以判断 OmniDiff 是否“支持”某种文件时,不能只看扩展名,更重要的是看它能把这个格式理解到什么程度。

OmniDiff 支持哪些文件类型?

内容类型 比较方式 适合场景
代码 Tree-sitter 语法结构 Diff 代码审查、重构、Git 提交
JSON / YAML / XML 按结构解析,而不只是逐行比较 配置文件、项目配置变化
图片 逐像素检查变化位置,动画逐帧比较 UI 资源、设计稿、图片版本
PDF 逐页绘制并检查页面变化 技术文档、图表、导出结果
ZIP / TAR 等压缩包 展开并逐项比较,支持嵌套归档 Release 包、构建产物
Office / JAR / EPUB 利用 ZIP 容器结构继续检查内部内容 检查文件内部组成变化
字体 比较 Glyph、名称和 Metrics Web Font、Icon Font
光标 按尺寸和动画帧比较 Windows / X Cursor 资源
.mo / .qm 逐条 Message 比较 软件翻译文件更新

OmniDiff 实际能看到哪些文件变化?

OmniDiff 的 Showcase 里放了几组真实文件的 Diff 结果,包括 PDF、字体、图片和 OpenDocument。下面的数据都来自这些录制示例,不是本站独立测试。

PDF:可以定位到具体页面和变化区域

其中一个 PDF 只改了图表里的一个名称。OmniDiff 不只是判断两个文件不同,还会继续标出元数据和页面变化;这个案例里,第 1 页大约只有 0.21% 的像素发生变化,并被定位到一个区域。

对于自动生成的技术文档、报表、架构图或者 Release 附带的 PDF,这种结果比单纯看到文件发生变化更有用。

不过它仍然不是 Adobe Acrobat 一类专业 PDF 审阅工具,而且目前 PDF 的人工评估样本还比较少,因此更适合作为开发工作流里的补充能力。

OmniDiff 定位 PDF 页面中的内容变化区域

字体:能看到具体哪些 Glyph 被改了

TrueType、OpenType、WOFF、WOFF2 和 EOT 都可以进一步拆开比较,包括字体名称、Metrics 和具体 Glyph。

Font Awesome 的一个 WOFF2 案例里,1996 个成员中有 21 个发生变化,OmniDiff 可以直接把这些字形列出来,并显示修改前后的效果。

如果项目使用 Icon Font 或自己维护 Web Font,这比只知道两版字体文件 Hash 不同直观得多。

OmniDiff 对比字体中发生变化的 Glyph

图片:不只是判断文件不同

PNG、JPEG、GIF、WebP、BMP、ICO 和 TIFF 都有对应的图片比较方式。静态图片可以定位像素变化区域,动画则会继续比较帧。

一个 BMP 案例中,178176 个像素里只有 73 个变化,OmniDiff 可以把范围缩小到一个很小的区域。另一个 ICO 从 16×16 调整到 32×32,会直接识别为尺寸变化;GIF 从 5 帧变成 7 帧时,也能看到新增的是哪两帧。

OmniDiff 对比 GIF 动画并识别新增帧

压缩包:还能继续往里面比较

ZIP、TAR、gzip、xz、bzip2 这类归档文件不会只停留在压缩包本身。OmniDiff 会展开里面的成员,再根据每个文件自己的类型继续比较,嵌套归档也可以继续处理。

因此 JAR、EPUB,以及基于 ZIP 容器的 Office、OpenDocument 文件也能看到内部变化。一个 ODT 案例里,content.xml、meta.xml、样式文件和缩略图的变化都可以分别列出来。

OmniDiff 比较 OpenDocument 文件内部 XML 和缩略图变化

OmniDiff 可以用来比较 Word 和 Excel 吗?

可以检查基于 ZIP 容器的 Office 文件内部发生了哪些变化,但这里需要特别区分:

OmniDiff 不等于 Word 的“比较文档”,也不等于 Excel 单元格级差异分析工具。

它更关注文件内部结构和成员变化,而不是专门理解 Word 修订语义或把 Excel 不同单元格直接高亮出来。

如果你的主要需求就是比较两个 Excel 文件、快速定位不同单元格,可以看我们之前介绍的 Diff Excel。OmniDiff 更适合源码、配置、图片、字体、文档和构建产物混在一起的开发项目。

OmniDiff 怎么安装?

截至 2026 年 11 月,OmniDiff 最新正式版本为 v0.3.0,官方提供 Linux、Windows、Intel Mac 和 Apple Silicon Mac 的预编译程序。

macOS 和 Linux:Homebrew

brew install ivankovic/omnidiff/omnidiff

通过 Cargo 安装

cargo install --locked omnidiff

源码安装需要 C 编译器以及 Rust 1.92 或更高版本。因为安装过程会编译 Tree-sitter Grammar,第一次通过 Cargo 安装会比直接下载预编译程序慢一些。

Debian / Ubuntu

项目还提供 amd64 和 arm64 的签名 APT 软件源,长期在 Debian 或 Ubuntu 开发环境中使用时,不一定需要自己维护二进制文件。

Nix 用户也可以直接运行:

nix run github:ivankovic/omnidiff

OmniDiff 怎么使用?

最基本的方式就是给它两个文件:

omnidiff BEFORE AFTER

会打开 OmniDiff 的双栏终端界面。

如果用于自动化脚本或 CI,可以切换 Headless 模式:

omnidiff --headless BEFORE AFTER

或者直接输出 JSON:

omnidiff --mode json BEFORE AFTER

如果需要让“存在差异”反映到脚本退出状态中,还可以配合 --exit-code 使用。

因此 OmniDiff 不只可以作为 Diff Viewer,也可以接进 CI、检查脚本和其他自动化流程。

OmniDiff 双栏终端界面显示代码差异

怎么把 OmniDiff 接进 Git?

OmniDiff 可以作为 Git difftool 使用。

运行:

omnidiff git configure

完成配置后,可以通过:

git difftool --tool=omnidiff

打开完整的交互式终端界面。

这里需要注意 git difftool 和普通 git diff 的区别。

git difftool 可以让 OmniDiff 使用完整 TUI;普通 git diff 和 git log -p 通常运行在 Pager 中,没有完整交互式终端环境,因此 OmniDiff 会自动改成非交互文本输出。

如果执行普通 git diff 后没有出现双栏界面,并不代表配置失败。

Jujutsu(jj)也可以用,但要注意 file-by-file

OmniDiff 同样提供 Jujutsu 配置向导:

omnidiff jj configure

jj 默认会把两个目录树交给外部 Diff 工具,而 OmniDiff 比较的是两个文件,因此必须使用 file-by-file 调用模式。

diff-invocation-mode = "file-by-file"

普通 jj diff 同样通过 Pager 输出,因此会使用 OmniDiff 的非交互文本模式。如果想看完整 TUI,目前仍然需要直接运行 omnidiff BEFORE AFTER。

VS Code、Cursor 和 Windsurf 能用吗?

OmniDiff 有 VS Code 扩展,Open VSX 版本也可以安装到 VSCodium、Cursor 和 Windsurf 等兼容编辑器。

不过目前还有一个平台限制:VS Code 现阶段还不能让第三方扩展完整替换编辑器内置的 Diff View。

相关 API 已经在上游实现,但尚未正式发布。因此现阶段如果想体验 OmniDiff 完整能力,Git difftool 和独立终端 TUI 仍然更直接。

OmniDiff 官方演示页能直接在线比较文件吗?

不能。OmniDiff 的 Showcase 是官方演示页,主要用来查看已经录制好的代码、PDF、字体和图片 Diff 效果,并不提供上传文件在线比较的功能。

要比较自己的文件,还是需要在本地安装 OmniDiff。对于源码、内部文档这类不方便上传到第三方网站的内容,本地处理会更合适。

OmniDiff 文件对比工具官方演示页面

OmniDiff 的性能怎么样?

项目作者公开了自己的性能和准确率测试。代码部分目前有 2302 个测试样本,在 Intel Core i7-1370P、32GB RAM 的 ThinkPad T14s 上,中位数约为 4.2ms,p90 为 35.1ms,p99 为 177ms,约 97.6% 的样本可以在 100ms 内完成。

内容类型 100ms 内完成 Perfect Near-perfect
代码 98% 70% 92%
图片 96% 69% 91%
光标 100% 85% 100%
字体 95% 82% 100%
压缩包 88% 87% 87%
Message Catalog 100% 83% 83%
PDF 57% 100% 100%

从这些数据看,代码、图片和字体的速度已经比较稳定,PDF 会明显慢一些,因为需要把发生变化的页面实际绘制出来;包含大量成员的压缩包同样可能拉长处理时间。

PDF 那组“100%”准确率也不能单独拿出来看。项目也说了,经过人工判断的 PDF 样本不足 10 个,因此目前还不足以说明 PDF Diff 已经和代码一样成熟。

另外,这些都是项目作者自己的测试结果,并不是本站独立 Benchmark。比较重要的代码或发布文件,最终还是应该由人确认 Diff 是否合理。

OmniDiff 目前还有哪些不足?

OmniDiff 现在明显还是一款偏开发者和终端工作流的工具。主要界面是 CLI 和 TUI,没有 Beyond Compare 那种成熟桌面 GUI,也不主打目录同步、三方 Merge 和冲突编辑。如果这些功能是日常刚需,现有工具未必需要换掉。

格式支持也不是一个水平。Python、Rust、JSON、YAML 等可以做结构化 Diff,Markdown、SQL、Dart、Protocol Buffers 目前仍然只是普通文本比较;Office 文件虽然可以继续检查 ZIP 容器内部变化,但不能代替 Word 修订审阅或 Excel 单元格差异工具。

PDF、字体、图片这些非代码格式已经能做内容级比较,不过成熟度并不完全一致,前面的测试数据也能看出这种差异。

编辑器集成同样还有限制。VS Code 扩展目前不能完整替换内置 Diff View,所以现阶段要体验 OmniDiff 的完整效果,终端 TUI 和 Git difftool 还是更直接。

OmniDiff 的许可证要注意什么?

OmniDiff 使用 AGPL-3.0-only 开源,并不是 MIT、Apache-2.0 这类限制较少的许可证。

对个人开发者来说,按 AGPL 条款使用即可;如果公司准备把 OmniDiff 长期放进内部工具链,又不适合采用 AGPL,项目作者还提供单独的商业授权。

所以企业使用前最好顺手确认一下许可证要求,尤其是涉及修改、部署或分发时。

OmniDiff 适合什么场景?

如果平时主要使用 Git、Jujutsu 或终端,而且项目里除了源码,还经常出现图片、字体、PDF、翻译文件和构建产物,OmniDiff 会比较实用。代码审查、大型重构、Release 前检查,以及在 CI 中输出结构化 Diff,都是比较合适的场景。

如果只是偶尔比较两段普通文字,在线文本 Diff 工具会更省事;主要比较 Excel,则专用 Excel Diff 更直接;如果依赖目录同步、三方 Merge 和完整桌面 GUI,Beyond Compare 这类成熟工具仍然更合适。

常见问题

OmniDiff 支持 Windows、macOS 和 Linux 吗?

支持。官方提供 Windows、Linux、Intel Mac 和 Apple Silicon Mac 的预编译版本。macOS 和 Linux 可以使用 Homebrew,Debian / Ubuntu 也有官方提供的 APT 软件源。

OmniDiff 可以比较 Word 和 Excel 吗?

可以检查基于 ZIP 容器的 Office 文件内部成员变化,但它不是 Word 文档审阅工具,也不是 Excel 单元格差异分析软件。

OmniDiff 可以替代 git diff 吗?

更准确地说,它适合作为 Git 的外部 Diff 工具补充现有工作流。完整 TUI 通常通过 git difftool 使用,而普通 git diff 在 Pager 中会显示非交互文本结果。

OmniDiff 免费吗?商用有什么限制?

源代码按照 AGPL-3.0-only 许可证提供。无法采用 AGPL 条款的组织,可以查看作者提供的商业许可证方案。企业正式采用前建议核对项目当前许可原文。

OmniDiff 值得用吗?

如果平时只比较代码或普通文本,现有的 Git Diff 已经够用,没必要专门换工具。OmniDiff 更适合项目里经常混着图片、PDF、字体、配置文件和打包产物的情况,至少遇到这些文件时,不会只停在“文件发生了变化”。

它现在还是明显偏终端和 Git 工作流,GUI、Merge 和 Office 专业审阅都不是强项。但如果你经常做代码审查、Release 检查,或者想知道二进制文件具体改了什么,可以装下来试试。

官方演示页: OmniDiff Showcase
GitHub: ivankovic/omnidiff

本文由(ahhhhfs.com)根据项目官网、官方文档及公开资料整理。工具的功能、价格、授权与服务条款可能调整,请以官方最新说明为准。合理引用请注明来源并保留本文链接;如需全文转载,或发现内容错误、版权及授权问题,可通过 feedback#abskoop.com「联系我们」反馈(请将 # 替换为 @)。