想在提交前审查 AI agent 改的代码,用 Lazygit 的做法是:让 agent 从一个干净的提交开始改;改完后按 0(或 Enter)打开文件 diff,用 Space、a、v 只暂存你看懂的 hunk 和行,其余保持未暂存。然后检查已暂存的 diff,用 git stash push --keep-index --include-untracked 只对这份快照跑测试,再以小而有名字的提交落库。没暂存的部分仍留在工作区,留给下一轮处理。

Coding agent 一次可能改很多文件。Lazygit 能按 hunk 甚至按行接受改动,不必全收或全退,所以审查更快。下面的按键对应 Lazygit v0.66.3(2026 年 11 月 7 日发布),来自它的官方按键文档和 README;Git 命令来自 Git 官方文档。暂存后测试这一套流程,我们在 2026 年 11 月 10 日用 Git 2.47.3 实际跑过一遍。

适合谁

  • 你让 Claude Code、Codex、Cursor 或其他 agent 改 Git 仓库,想自己决定哪些内容进入提交。
  • 你在用或想试 Lazygit。如果还要和 fzf、Yazi 一起配置,先看终端工作流教程,那里讲了基础的按 hunk 暂存。
  • 一行就能在 git diff 里看完的小改动用不上这套流程。agent 的 diff 大到你一眼记不住时,它才划算。

agent 开工前,先回到一个干净的提交

把仓库交给 agent 之前,先提交或 stash 你自己的改动。这样之后 Lazygit 里出现的都是 agent 的改动,不会和你的混在一起。给 agent 任务单开一个分支,失败时整个丢掉也方便。

这是我们的习惯,不是两个工具的规定。它重要,是因为后面的审查都依赖于对照一个已知起点来读 diff。

怎样看到 agent 改动的全部内容?

在仓库里打开 lazygit。Files 面板列出所有改动文件,包括 Git 还没跟踪的新文件。未跟踪文件最容易漏:agent 可能新建了辅助文件、测试数据或草稿文件,普通 git diff 根本不显示。git status --short 用 ?? 标出它们。

看 agent 的 diff 时,三个视图设置有用:

  • Ctrl+w 切换是否显示只改空白的变动。读逻辑时可以打开它屏蔽格式化噪音,暂存前再关掉,确认自己提交的是什么。
  • } 和 { 增加、减少每处改动周围的上下文行数,默认 3 行(配置项 git.diffContextSize)。
  • 终端里看不清时,Ctrl+t 用你配置的外部 diff 工具(git difftool)打开。

怎样只暂存你看懂的部分?

用主视图的选择模式。在 v0.66.3 中:

  1. 选中一个改动文件,按 0(或 Enter)把焦点移到主视图里的 diff。
  2. 初始选中的是整个 hunk。Space 暂存这个 hunk 并跳到下一个;←/→(或 h/l)在 hunk 之间跳。
  3. 如果一个 hunk 里既有想要的也有不想要的,按 a 切到逐行选择,按 v 选一段行,再按 Space 只暂存这些行。
  4. 已暂存的行会出现在下方窗格。Tab 在未暂存和已暂存窗格之间切换;在已暂存窗格按 Space 取消暂存。
  5. 需要手工改暂存内容时,E 用外部编辑器打开当前 hunk。

如果某个键的效果和这里写的不同,可能是版本不同。在 Lazygit 里按 ? 打开当前面板的按键菜单。

我们的规则:一行只有在你能解释它为什么存在时才暂存。调试用的 print、被改写的注释、无关的重命名,都可以先不暂存,回头再决定。

不想要的部分怎么处理?

先让它们保持未暂存。未暂存的改动没有成本,之后可以单独提交、发回给 agent,或再丢弃。

有两个键要小心:

  • 主视图里的 d 会丢弃选中的未暂存改动;对已暂存的选择,它是取消暂存。
  • z(撤销)根据 reflog 撤销上一条 Git 命令,Lazygit 文档明确写着它不包括工作区的改动。被丢弃的工作区改动,z 救不回来。只丢弃你确定不要的,或先 stash。

想就某处改动追问 agent 时,选中那几行按 Ctrl+o,Lazygit 会把选中的 diff 行复制到剪贴板,直接贴进下一条提示词,不用再口头描述。

怎样只测试你将要提交的内容?

要测的是已暂存的快照,而不是整个工作区。工作区里还有未暂存的部分,在那里测试通过,不代表单独这个提交也能工作。Git stash 文档在 “Testing partial commits” 里给出了这种场景的例子:

git diff --staged            # 读一遍将要提交的内容
git diff --staged --check    # 有没有冲突标记或空白错误?
git stash push --keep-index --include-untracked
# 在这里跑测试:此时工作区只有已暂存的改动
git commit -m "fix: reject zero divisor"
git stash pop                # 把未暂存的部分放回来

按 Git 文档,各步作用是:--staged 是 --cached 的同义词,显示为下一次提交暂存的改动;--check 在改动引入冲突标记或空白错误时发出警告;--keep-index 保留已暂存内容、把其余改动存进 stash;--include-untracked 把未跟踪文件也存进去,这样 agent 留下的多余文件不会让测试碰巧通过。

我们在 2026 年 11 月 10 日(Git 2.47.3,一个两文件的 Python 小项目)试过:模拟一次 agent 修改,修了除零错误、加了一行调试 print、新建了未跟踪的 scratch.py。只暂存修复后,git diff --staged --check 以状态码 2 退出,指出“agent”在改动行末留下的空格。测试期间工作区只剩已暂存的文件改动,scratch.py 不在;提交后 git stash pop 把调试行和 scratch.py 都放了回来。这只是一个小例子,不是评测。如果中间你又改了同几行,stash pop 可能冲突,所以先 pop 再开始新的改动。

Lazygit 的 stash 选项也能做同样的事(Files 面板按 S 可选择只 stash 已暂存或未暂存等方式)。上面把 Git 命令写出来,是为了让你看清每一步发生了什么。

分成小提交

按 c 提交已暂存的改动,在 diff 视图里也可以直接提交。相关的几个键:

  • A 用当前已暂存的改动修订(amend)上一次提交。
  • Ctrl+f 找出你当前改动所基于的提交,适合 agent 的改动其实是在修之前某个提交的情况;具体流程见 Lazygit 的 fixup 文档。
  • w 提交时跳过 pre-commit hook。审查 agent 改动时我们不用它:hook 是 agent 和提交历史之间少数自动检查之一。

如果 agent 已经自己提交了,也还能审。选中该提交,按 Enter 看它的文件,再聚焦某个文件的 diff。Lazygit README 写到:在旧提交的 diff 里选中一个 hunk 按 d,可以把它从那个提交中移除,后台用交互式 rebase 改写提交。已推送到共享分支的提交不要这样做。

五分钟检查清单

  • agent 开工前仓库是干净的(或在新分支上)。
  • 在 Files 面板检查过未跟踪文件,而不只看已修改的文件。
  • 每一行已暂存内容你都能解释。
  • git diff --staged --check 没有报错。
  • 工作区只保留已暂存改动时,测试通过。
  • 提交信息写的是改动做了什么,而不是“AI 改动”。
  • 剩下未暂存的部分:单独提交、发回给 agent,或有意识地丢弃。

常见问题

这不就是 git add -p 吗?

思路相同,界面不同。git add --patch 逐个 hunk 询问:y 暂存,n 跳过,s 拆成更小的 hunk,e 手工编辑。hunk 拆不动时,只能手改补丁文本。Lazygit 可以直接选单独的行,并把已暂存和未暂存两个窗格并排显示。

已暂存的 diff 很干净,就说明改动正确吗?

不。它只说明你知道自己提交了什么。改动能不能用是另一项检查:修改前后各跑一次失败用例,看测试到底断言了什么。这部分见 AI 生成代码验收清单、怎样验证 AI 修的 bug 和 AI 写的测试会不会失败。

本文对应哪个 Lazygit 版本?

v0.66.3,即 2026 年 11 月 10 日时的最新版本。README 说主视图初始选中整个 hunk。如果你的版本一开始选中的是单行,或者某个键作用不同,请在应用里按 ?,或查看你所用版本的按键文档。

Lazygit 能撤销丢弃操作吗?

z 不行。Lazygit 的撤销基于 reflog,只考虑提交,不包括工作区改动。确定之前,把不要的改动留在未暂存状态或先 stash。

应该让 agent 自己暂存和提交吗?

这由团队决定。我们的看法是:暂存应该由负责审查的人来做,因为暂存这一步就是在决定你为哪些内容担保。agent 仍然可以提出拆分提交的建议,由你来核对。