在日常代码审查中,标准的 git diff 输出往往是单列统一格式,难以快速对比变更细节,尤其在大规模 PR 或本地修改时。deff 作为一个纯 Rust 实现的终端 TUI 工具,提供侧边并排视图、语法高亮、新增 / 删除行着色,以及 Vim 风格键绑定,帮助开发者高效导航和审查 diff。
deff 的核心价值在于将 git diff 从静态文本转为交互式界面,支持垂直 / 水平滚动(水平独立,垂直同步)、文件间跳转、搜索和审查标记,避免在长输出中盲目滚动。其默认策略 upstream-ahead 比较本地分支与上游差异,也支持显式 --base/--head 范围或 --include-uncommitted 纳入工作区未提交变更。
安装与启动参数
安装极其简便,一行命令搞定:
curl -fsSL https://raw.githubusercontent.com/flamestro/deff/main/install.sh | bash
脚本依赖 cargo,会克隆仓库、构建并安装到 PATH,无需手动管理。该工具体积轻量,Rust 编译后二进制高效,适合 CI/CD 集成或服务器环境。
关键启动参数:
--strategy upstream-ahead(默认):比较本地分支与 upstream,适用于日常 pull/push 前审查。--strategy range --base origin/main --head HEAD:指定基线和目标提交,精确审查特定范围。--include-uncommitted:包含 staged/unstaged 和 untracked 文件,完美用于本地修改前自审。--theme dark|light|auto:适配终端主题,默认偏好暗色(语法高亮更佳)。
例如,审查工作区变更:
deff --strategy range --base origin/main --include-uncommitted --theme dark
这些参数可封装为 git alias,提升落地性:
git config --global alias.deff '!f() { deff --strategy range --base origin/main --head HEAD "$@"; }; f'
使用 git deff 即启动。
交互操作清单
deff 界面分为文件列表(左侧)、双栏 diff(主区)和状态栏。支持键盘 / 鼠标(滚轮 + Shift 水平)。
导航键位(Vim 风格):
h/j/k/l:左右上下移动光标。g/G:跳首 / 尾。Ctrl+u/d:半页上 / 下。- 文件切换:
[/]或鼠标点击列表。 - 水平滚动:独立控制左右栏,保持垂直同步,便于跨列对比。
搜索功能:
/进入搜索模式,输入后 Enter 应用。n/N:下一个 / 上一个匹配(跨两栏搜索)。- 搜索高亮变更上下文,加速定位关键字如函数名或 bugfix。
审查标记:
r:切换当前文件 reviewed/unreviewed 状态。- 持久化于
.git/deff/reviewed/,基于 diff 范围 + 文件哈希,避免重复审阅。 - 理想用于大型 PR:标记无关文件(如 lockfile、auto-format),聚焦核心变更。
无明确折叠,但文件级 reviewed 相当于 “折叠” 无关文件;未来扩展可期(见 architecture.md)。
退出与回滚:
q或Esc退出,无副作用。- 若不适,可 fallback 到
git diff --color=always | less -R。
监控与优化阈值
生产落地时,监控:
- 性能阈值:适用于 <500 文件 diff;超大 PR 建议分批
--head。 - 内存:Rust 高效,典型 10-50MB;大 monorepo 测试下 <200MB。
- 兼容:需 TTY 终端;WSL/macOS/Linux 全支持,Windows via Git Bash。
- 集成 delta pager:
git config diff.pager "deff"但 deff 更交互。
与竞品比较:
- delta/icdiff:优秀 pager,高亮但无交互导航。
- vimdiff:强大但模态学习曲线陡峭。 deff 平衡:TUI 零切换,Vim 用户友好。“deff is an interactive Rust TUI for reviewing git diffs side-by-side”[1]。
风险与回滚策略
- 学习曲线:键位 5min 掌握;fallback
git difftool vimdiff。 - 新项目风险:Stars 19,活跃维护;MIT 许可,易 fork。
- HN 反馈:用户提 icdiff/delta,但赞 file-awareness [2]。
落地清单:
- 安装并
deff --help测试。 - alias 封装日常命令。
- 大 PR 前审:
deff --include-uncommitted。 - 团队分享:docker 化
FROM rust:slim构建。 - 监控:wrap script 计时,>10s 优化。
deff 将终端代码审查从被动阅读转为主动交互,参数化策略确保可控。推荐 CLI 爱好者立即试用。
资料来源:
[1] https://github.com/flamestro/deff
[2] https://news.ycombinator.com/item?id=47169518