Hotdry.
systems

终端侧边并排 Git Diff 审查工具 deff:同步滚动、搜索与 Vim 键绑定

纯终端侧边 Git Diff 审查工具 deff,支持同步滚动、搜索、文件标记审查与 Vim 操作,提升代码审查效率的关键参数与清单。

在日常代码审查中,标准的 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)。

退出与回滚:

  • qEsc 退出,无副作用。
  • 若不适,可 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]。

落地清单:

  1. 安装并 deff --help 测试。
  2. alias 封装日常命令。
  3. 大 PR 前审:deff --include-uncommitted
  4. 团队分享:docker 化 FROM rust:slim 构建。
  5. 监控:wrap script 计时,>10s 优化。

deff 将终端代码审查从被动阅读转为主动交互,参数化策略确保可控。推荐 CLI 爱好者立即试用。

资料来源: [1] https://github.com/flamestro/deff
[2] https://news.ycombinator.com/item?id=47169518

查看归档