什么是 difftastic?
difftastic(命令名为 difft)是一个结构化 diff 工具。它不逐行比较,而是用 tree-sitter 解析两个文件,为每一侧构建语法树,然后报告到底哪些语法发生了变化。重新缩进代码块、重排参数列表或移动大括号不再算作改动,而藏在重新格式化代码里的变量改名则一眼可见。
⚡ difftastic 的主要功能
🌳 理解语法的 diff
两侧都被解析为语法树并按结构比较,格式噪音消失,真正的改动才会突出。
🧩 30 多种语言
Rust、Python、TypeScript、Go、C、C++、Java、Ruby、YAML、JSON、HTML、CSS、Markdown 等等——difft --list-languages 会列出完整清单及扩展名。
🪟 并排或单列
--display 可选 side-by-side、side-by-side-show-both、inline,或供程序解析的 JSON。
🔗 可直接接入 Git
既可作为 git 的外部 diff 命令,也同样适用于 Mercurial、Jujutsu 和 Fossil。
🚦 诚实的降级
遇到未知扩展名、超大文件或过多解析错误时,会退回到带词级高亮的按行 diff,而不是直接报错。
🗂️ 目录与冲突
一条命令比较两个目录;也可以直接把带合并冲突标记的文件交给它,把冲突当作 diff 来读。
apt upgrade 就能让你保持最新。
📦 从 deb.griffo.io 安装
第 1 步:添加仓库
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt updatesudo apt install extrepo
sudo extrepo enable griffo
sudo apt update🆓 有一个永久免费的镜像。 deb-free.griffo.io 永久免费提供软件包 — 无需账号、无需订阅,最多落后上游 2 个月,安全修复立即发布。目前收录 cliamp、Ghostty、lazydocker、Oh My Posh 和 Zed;difftastic 不在其中,因此今天只能通过上面的仓库安装 — 提出请求即可将其加入。
🧩 关于 extrepo 选项。 extrepo 是 Debian 官方用于管理第三方仓库的工具:它会替你写好 sources 文件并安装签名密钥,并在使用前先对照签名元数据校验该密钥。本仓库以 griffo 之名登记其中,永久免费镜像则为 griffo-free,因此在 Debian(bookworm、trixie、forky、sid)上,上面的命令就是全部配置。
extrepo 只负责 sources 文件和密钥,订阅凭据仍然要写入 /etc/apt/auth.conf.d/deb.griffo.io.conf。Ubuntu 不在覆盖范围内,因为 extrepo 只发布 Debian 各套件的元数据:在 Ubuntu 上请使用 sudo 或 root 的命令。
第 2 步:安装 difftastic
# 安装最新版 difftastic
sudo apt install difftastic
# 验证安装
difft --version# 安装最新版 difftastic
apt install difftastic
# 验证安装
difft --version第 3 步:接入 git
# 直接比较两个文件
difft old.py new.py
# 或者让 git 在每次 diff 时调用 difftastic
git config --global diff.external difft
# 原生的 git diff 依然只差一个参数
git --no-ext-diff diff
# 手册页随软件包一起安装
man difft🎯 基本用法示例
比较文件与目录:
# 两个文件,并排显示
difft before.rs after.rs
# 单列显示,更接近传统 diff
difft --display inline before.ts after.ts
# 比较两个目录,跳过未改动的文件
difft old/ new/ --skip-unchanged --sort-paths
# 这个构建支持哪些语言?
difft --list-languages作为 git 的 diff 使用:
# 临时:仅本次 diff 使用 difftastic
GIT_EXTERNAL_DIFF=difft git diff
# 对整个历史都使用结构化 diff
GIT_EXTERNAL_DIFF=difft git log -p --ext-diff
# 注册为 difftool
git config --global difftool.difftastic.cmd 'difft "$LOCAL" "$REMOTE"'
git difftool --tool difftastic
# 一个用于结构化日志的 git 别名
git config --global alias.dlog '!GIT_EXTERNAL_DIFF=difft git log -p --ext-diff'调整输出:
# 忽略只改动注释的变化
difft --ignore-comments a.go b.go
# 更多上下文,并把制表符视为两个空格
difft --context 5 --tab-width 2 a.py b.py
# 供脚本使用:到底有没有语法层面的改动?
difft --check-only --exit-code a.json b.json
# 通过环境变量为每次调用设定默认值
export DFT_DISPLAY=inline DFT_BACKGROUND=light🔧 工具集成
difftastic 能接入那些本来就在给你看 diff 的工具:
- git:
GIT_EXTERNAL_DIFF、diff.external或一个difftool配置;加上--ext-diff还能用于git log -p和git show - Jujutsu:在
jj中把它设为 diff 命令,就能在兼容 Git 的工作流里获得结构化 diff - Mercurial 与 Fossil:两者都支持外部 diff 命令,同一个二进制文件即可服务你所有仓库
- 环境变量:
DFT_DISPLAY、DFT_BACKGROUND、DFT_WIDTH等变量一次设定好默认行为 - CI 与脚本:
--check-only搭配--exit-code可在不输出 diff 的情况下回答“语法是否变了”,而--display json本就为解析而设计
🚀 为什么选择 deb.griffo.io?
- 官方 Debian:完全没有 difftastic 这个软件包——标准系统上无从安装
- cargo install difftastic:版本较新,但要编译大量 tree-sitter 语法,装在 apt 之外,也没有手册页
- 上游压缩包:官方二进制文件,但每个版本都要手动重新下载
- deb.griffo.io:最新版本,并自动更新
- ✅ 最新语法定义:最新发布版本,附带能理解你当下所写语言版本的 tree-sitter 语法
- ✅ 唯一的 apt 来源:Debian 与 Ubuntu 官方源都没有 difftastic;本仓库打包官方上游构建
- ✅ 自动更新:上游发布后数小时内更新软件包
- ✅ 完整软件包:上游二进制文件安装为
/usr/bin/difft,并附带difft.1手册页 - ✅ 两种架构:amd64(musl 静态构建,无库依赖)和 arm64
- ✅ 多发行版:支持 Bookworm、Trixie、Forky 和 Sid
- ✅ 易于维护:使用标准 apt 命令即可更新
📦 软件包构建仓库
Debian 软件包在这个 GitHub 仓库中自动构建和维护:
- 🔀 difftastic-debian - 最新版本构建
🔗 相关软件包
deb.griffo.io 同样提供:
- lazygit - 终端 git 界面,可暂存代码块与单行
- Jujutsu - 兼容 Git 的版本控制系统,变基体验一流
- ripgrep - 在同一目录树中快速递归搜索
- Neovim - 编辑器,直接打开 diff 指出的位置