跳转到内容

delta — git diff 的语法高亮分页器

待复核

delta 是 Dan Davison 2019 年用 Rust 写的 git pager——把 git diff / git show / git log -p / git blame 的输出从原来的红绿色块,改造成带语法高亮行号字级 diff 的现代视图。

日常类比:

  • git diff 默认输出像传真打印——只有红绿两色,代码关键字、字符串、注释一锅粥
  • delta 是给 diff 装了 VS Code 风格的渲染层——同一份 diff,关键字蓝紫、字符串绿、改动的”那几个字”单独亮色

一行 gitconfig 接进去之后,你 以后所有 git diff 命令都自动走 delta,命令习惯零变化。

不只是”颜色更好看”,是 review 体验的代际提升:

  • 字级 diff 节省脑力——只改了变量名一个字符,默认 git diff 整行飘红绿;delta 只把改动的字符染色,眼睛一秒锁定
  • 天然带行号——讨论”第 47 行那个 bug”,default diff 要数;delta 直接给
  • GitHub/GitLab 跳转——commit hash 在终端里可点,跳浏览器看 PR / 提交,不用 copy-paste
  • merge conflict 重排——<<<<< ===== >>>>> 三段默认糊在一起;delta 把三段并排展示
  • 和 bat 共享 syntax 库——同样的 200+ 语言、同样的主题,装一个等于装两个

delta 的设计可以拆成 3 件事

  1. 复用 syntect 生态:syntax 规则用 Sublime Text 的 .sublime-syntax、主题用 .tmTheme(TextMate 格式),覆盖 200+ 语言。类比:delta 和 bat 像两家店共用同一套配料仓库,自己专心做好 diff 渲染。

  2. 字级 diff(word-level diff):拿到一对 -/+ 行后,delta 会继续比较行内文字,只把”真的改了的几个字符”染色,行内其余不变的字保留普通色。这是 default git diff 很难一眼看清的地方。

  3. 当成 pager 接进 git:通过 ~/.gitconfigcore.pagerinteractive.diffFilter 都指向 delta,一次配好之后所有 git 命令自动透明走 delta——你不用改使用习惯。

~/.gitconfig
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
line-numbers = true
side-by-side = false
syntax-theme = OneHalfDark

写完之后 git diff git show HEAD git log -p 全部自动走 delta,无需改命令。diffFilter 那行是给 git add -p 交互暂存用的,必须加——否则交互模式会拿到非 TTY 通道,delta 默认不输出彩色。

Terminal window
git -c delta.side-by-side=true diff HEAD~3

逐部分解释:

  • -c delta.side-by-side=true 是临时打开 delta 的并排模式,不会把 --side-by-side 误传给 git 自己。
  • diff HEAD~3 仍然是普通 git diff,delta 只是负责分页和渲染。
  • 删除/新增并排两栏显示,每栏带独立行号、独立 syntax 高亮;注意:终端宽度 < 120 列时换行严重,别开。
Terminal window
git grep -n "TODO" | delta
rg -n "FIXME" | delta

逐部分解释:

  • git grep -nrg -n 都输出 文件:行号:内容 这种文本格式,delta 更容易识别。
  • 不要把 rg --json 直接管给 delta;JSON 是给脚本读的,不是给人类分页器读的。
  • 日常做”全仓找某关键字 + 看上下文”时,文件路径、行号、命中片段会比纯文本更好读。
Terminal window
git blame src/main.rs | delta

每行代码前面带提交信息(hash、作者、日期),delta 把代码部分按 syntax 高亮,提交元信息部分单独染色。比 default 的纯单色 blame 好看十倍,找”这行是谁什么时候写的”立刻找到。

  1. interactive.diffFilter 必须加 --color-only——这个开关告诉 delta”我接的是非 TTY 通道,但请保留色码”。不加的话 git add -p / git commit -v 会拿到无色文本,交互式选区一片黑白。

  2. side-by-side 在窄终端炸掉——80 列以下两栏各 40 列,长行频繁换行,体验比单栏差。dotfiles 里建议默认关,需要时 git diff --side-by-side 临时开。

  3. git --color-moved 联动配置冲突——git 自身的 color-moved 会给”搬迁的代码块”上色,delta 也想接管。解法:在 [delta] 里设 map-styles(参 README),让两边色域不打架。

  4. 主题在浅色终端糊——和 bat 同病。先 delta --show-syntax-themes 看实际渲染(拿一段你常读的代码当样本),挑配色匹配的;写进 [delta] syntax-theme = ...

  5. 首次启动慢——delta 启动要加载 syntax 集合(几 MB),冷启动 ~50 ms。在 git log -p 频繁切文件的场景能感觉到,但远低于 review 节省的时间。

  6. 管道下游脚本被色码污染——把 git diff | grep ... 的输出送给后续脚本时,default git 检测到非 TTY 会自动去色;delta 接管后默认仍可能保留色码(取决于版本和配置)。正确做法:脚本里显式用 git --no-pager diff 绕开 pager。

  • 2019:Dan Davison 受 diff-so-fancy(Perl 脚本,只重排不加 syntax)启发,用 Rust 重写并加 syntax 高亮
  • 2020-2022:side-by-side、navigation regex(n/N 跳下一个 diff)、commit hash hyperlinks、merge conflict 重排陆续落地
  • 2023:字级 diff 调优、grep 输出支持、file panel(侧边栏列出涉及的文件)
  • 2024-2026:进入稳定维护期,重点在主题、导航、grep 输出和平台兼容性上打磨;具体 release 数和 star 数会随时间变化,应以 GitHub 页面为准

为什么扩张这么快可以总结成 4 条:

  • git 是每天用几十次的命令——任何体验改善都是高频复利
  • 一行 gitconfig 接入——零配置门槛,不用改命令习惯
  • 字级 diff 是真功能差异——不是配色调整
  • Rust 单二进制——brew install delta / cargo install git-delta 一行搞定,跨平台

delta 的扩张路径和 bat 类似——不是替代某个核心命令,是给 git diff 加体验糖——但因为门槛极低(一段 gitconfig)、收益直观(review 快很多),dotfiles 渗透速度比想象中快。

适用

  • 日常用 git 做 code review / 自查 diff 的所有人——零配置门槛、收益立刻可见
  • 喜欢留在终端不切 GUI 的工作流——delta 能 cover 大部分 GitHub PR review 需要的视觉特性
  • 已经在用 bat / ripgrep / fzf 的现代 CLI 套件——delta 是这套工具链里 git 端的标准件
  • 多语言混合代码库——syntax 高亮 200+ 语言够用

不适用

  • 完全不用 git 的工作流(极少见)
  • 极简容器 / 嵌入式 / Alpine——二进制 ~7 MB,资源受限场景考虑跳过
  • CI 日志 / 自动化脚本——保留 default diff,避免色码污染
  1. 复用胜过重造——delta 没自己写 syntax 库,吃 bat 那套;多语言支持、主题生态一次性继承
  2. 字级 diff 是真功能差异——default git diff 更偏行级展示;delta 往行内继续找差异,不只是配色调整
  3. 接入方式决定渗透率——一段 gitconfig 接管所有 git 命令,用户使用习惯零改变——这是 delta 比同类高一档的传播秘诀
  4. PR review 是高频场景——每天看几十次 diff 的人,每秒钟节省都复利
  • bat —— 同 syntax 引擎来源;delta 复用 bat 的 .sublime-syntax + .tmTheme 库
  • ripgrep —— 现代 grep;delta 能直接接管 rg 输出做高亮
  • lazygit —— git TUI;delta 是 CLI pager 视角,两者互补常一起装
  • tig —— ncurses 提交浏览器;delta 改造的是 pager 层,不冲突
  • fzf —— 模糊查找;和 delta 一起组成”现代终端工具链”的交互层
  • gitui —— gitui — Rust 写的 git TUI,libgit2 直连让启动比 lazygit 快一个量级
  • lazydocker —— lazydocker — Go 写的 Docker TUI,五面板看容器 / 镜像 / 网络 / 卷
  • lazygit —— lazygit — Go 写的全功能 git TUI,键盘驱动 stage / rebase / cherry-pick
  • tig —— tig — 老牌 ncurses git 浏览器,把 log/blame/diff 玩到骨子里