delta 是 git diff 和普通 diff 的查看器:把 git diff 的输出接进来,它给你加上语法高亮、行号、左侧状态标记,还能按文件夹分组。Rust 写的单文件 exe,7.3 MB。

它不改变 diff 的内容,只是重排和上色。代价是渲染后的字节数会涨 4 倍多,一次调用 207.6 毫秒,其中大部分是进程启动。

一条管道就能看效果

delta --version
delta 0.20.1

git diff | delta --paging never
delta file1.txt file2.txt      # 直接比两个文件,等价于 diff -u 再管道

--paging never 是不走分页器,适合管道和脚本。日常用可以配进 ~/.gitconfig:

[core]
    pager = delta
[interactive]
    diffFilter = delta --color-only

配好之后 git diff、git show、git log -p 全都走 delta,不用每次手打管道。

渲染一版真实 diff

拿一个 Python 文件的两版改动做样本,原始 git diff 是 585 字节、28 行:

指标数值相对原始
原始 git diff(字节)5851 倍
delta 渲染后(字节)26044.45 倍
关掉语法高亮后(字节)15832.71 倍
单次渲染耗时(秒)0.201—
20 次平均耗时(毫秒)207.6—
对照:同机 shell 进程(毫秒)142.8—
渲染本身耗时(毫秒)64.8—
exe 体积(字节)7618048—

体积涨 4.45 倍主要是 ANSI 颜色转义符:每一个上色的片段前后都要加控制字符,一行代码被拆成好几段,字节数就上去了。关掉语法高亮降到 1583 字节,只留增删行的底色,仍然是原来的 2.71 倍。

这 4.45 倍只在内存和管道里存在,写进文件的时候没人会把渲染结果存下来。所以它不影响仓库体积,只影响你往管道里塞多少数据。

207.6 毫秒里大部分是启动

同机测过起一个 shell 进程是 142.8 毫秒,delta 一次 207.6 毫秒,多出来的 64.8 毫秒才是解析、上色、重排的总和。

这个构成决定了使用方式:单次看一个 diff 感觉不到延迟,但如果你写脚本循环处理几百个提交(git log -p | delta 之类),就会明显变慢。批量场景更该用 --no-gitconfig 加纯文本输出,或者干脆不用它。

去色之后还是标准 diff

diff --git a/report.py b/report.py
index dc85d55..fa87346 100644
--- a/report.py
+++ b/report.py
@@ -1,10 +1,18 @@
+from decimal import Decimal
+

剥掉 ANSI 转义符之后,内容仍然是标准 unified diff:文件头、index 行、@@ 范围、增删行一个不少。这一点很重要——delta 只做展示层,你把输出重定向到文件再喂给别的工具,解析逻辑不用改。

它另外加的是视觉信息:行号、左侧的 +/- 色块、按文件拆分的分隔线。这些在纯文本里看不到,属于纯装饰。

失败时的反应分两种

> delta --syntax-theme nosuchtheme < diff.txt
(正常输出,主题名被静默忽略)
退出码 0

> delta nofile1 nofile2
(无输出)
退出码 1

> echo "not a diff" | delta
not a diff
退出码 0

主题名写错不报错,它退回默认配色继续渲染,退出码 0。这种静默回退在配置里打错字时很难发现——你以为换了个主题,其实还是原来的。

文件不存在时报错退出,退出码 1,没有输出。而输入根本不像 diff 的时候(比如随便一段文字),它不报错,原样透传出来,退出码 0,只是加了换行。

三种情况对应三种退出码,脚本里能区分:0 是成功(可能什么都没改),1 是输入有问题。

什么时候值得装

每天要看很多 diff。行号和语法高亮能明显降低读 diff 的疲劳,特别是改动跨几十行的时候。

想快速看出「改了哪个函数」。它按文件拆分并给每段加标题,比原始的连续输出好定位。

在 CI 里做 diff 存档。4.45 倍的体积和 207.6 毫秒的启动都是额外成本,CI 里存原始 diff 更合适,需要好看再用 delta 渲染给人看。

要给 diff 做自动解析。它的输出带 ANSI 转义,直接解析会踩坑,得先剥色或者用 --color-only 配合别的参数。

还没测的两项:大 diff(上千行)的渲染耗时曲线 / 与 diff-so-fancy 的输出对比。前者要造一个大改动,后者要装另一个工具做同场景比对。