最糟的 AI 编码会话不是”AI 改错了一处”——是”AI 在 12 个文件里改错了 47 处,你哪一处都干净撤不回,因为你让它在脏 tree 上跑”。这套流程给你让每次 AI 改动都可逆的 git 四步纪律、让”撤回”成本极低的 commit 节奏,以及确实需要从乱 diff 里剥出问题时的恢复 playbook。
这篇讲什么
AI 辅助编码的 git 回滚纪律:AI 跑前先 commit、AI 输出审 diff 再 commit、长任务每步 commit、“可能还要”的改动用 stash。还是你熟悉的 git——只是节奏更严,因为 AI 改文件又快又多。
这篇适合谁看
任何让 AI 助手改代码的人:Cursor / Copilot / Claude Code / Cody 用户、跑自主 agent 的独立开发者、采用 AI 编码流程的团队、说过”等等,怎么撤回”的工程师。
什么时候适合用
让任何 AI 助手或 agent 碰代码前。尤其是长自主 run 之前、跨文件重构、或你打算连续接受多个 AI 建议的会话之前。
什么时候不建议用
不在意撤回(也没什么可丢)的 greenfield 原型。每个建议立即接 / 拒的实时 pair programming(IDE undo 够用)。AI 只在解释不在改的只读会话。
开始前准备
- 确认 working tree 干净:
git status啥都没有。手头进行中的先 stash 或 commit。 - 确认当前状态测试通过。AI 改动前要有 “known-good 基线”。
- 设 commit 节奏规则:每个 AI 逻辑建议至少 1 commit。长 agent run 每 3-5 步 1 commit。
- 知道你的 remote 状态。一周没 push 了 agent 跑炸,工作就丢了。先 push 基线。
具体步骤
- 让 AI 跑前 commit。哪怕”WIP”也行——目的是 AI 改动后 diff 是干净的。
git commit -am "wip: baseline before AI refactor of userService"。 - AI 跑完 commit 前一定先
git diff。逐行看你没要求的改动:被删的错误处理、被去的 null check、被改的 export 名、“优化”的循环(语义微变)。 - diff 干净:stage + commit + 描述性 message。“ai: refactor callbacks to async/await in userService”。
- diff 有问题但大部分好:用
git add -p只 stage 好的部分,commit。剩下的git checkout -- <files>或git restore弃掉。 - 多步 agent 任务:强制步骤间 commit。告诉 agent:“每个 ticket 停一下,我 commit 后你继续。” 长 agent run 无中间 commit 就是 4 小时灾难的来源。
- AI 出的”可能还要但当下不要”的改动用
git stash push -m "ai: 抽出 helper, 可能复用"。 - agent run 跑偏时直接 abort +
git reset --hard HEAD回到上次 known-good。比从 40 处乱改里剥 bug 便宜得多。 - 频繁 push。本地 commit 不算备份。高风险 run 前先 push 基线、每个干净 checkpoint 后也 push。
第一次实操怎么跑
- 选一个你平时随手让 AI 做的小任务——跨模块改函数名、抽 helper。
- 走完整纪律:干净 tree、基线 commit、AI 跑、diff 审、选择 stage、commit、push。
- 跟你平时”直接让它改”对比计时。开销很小(2-3 分钟);安全收益巨大。
- 第二次故意接受一个坏 AI 建议,练习回滚。
git reset和git restore是你压力下要的肌肉记忆。
完成后检查
- 每次 AI 会话都从
git status干净开始。不破例。 - 每个 AI diff commit 前都逐行审。没有”看着行,全 commit”。
- 长 agent run 有中间 commit——永远不是一个巨大 final commit。
- 每个 commit 后测试通过。坏 commit 让 bisect 没用。
- 高风险 run(大重构、自主 agent)前基线已 push 到 remote。
怎么复用这套流程
- 把四个命令练成肌肉记忆:
git status、git diff、git add -p、git restore。这是你的 AI 安全工具箱。 - 建项目级”AI 前 checklist”片段,每次会话前粘:“tree 干净、基线已 commit、基线已 push、测试绿”。
- agent run 写一段 system prompt 强制步骤间停:“每个任务完输出 diff 摘要,等人确认。”
- 每次模型更新重评节奏。有的 agent 稳到能跑长自主,有的仍需逐步确认。
建议的操作流程
干净 tree → 基线 commit → push 基线 → 跑 AI → 审 diff → 选择 stage → commit → 循环。自主 agent 加显式步骤边界 + 强制步间 commit。
容易踩的坑
- 脏 tree 跑 AI——分不清你的在改和 AI 的改。先 stash。
- 长 agent run 无中间 commit——出问题(一定会)就丢几小时工作或剥乱麻。
- 不审 diff “看着行全 commit”——AI 的静默改动(删错误处理、删 guard)就这么上线。
- 高风险 run 前没 push——本地 commit 不算备份;agent 跑炸 repo 工作彻底丢。
- 一个巨大 final commit——bisect 失败无法定位。每个逻辑步骤一 commit。
- 跳过”测试绿”基线——分不清是 AI 改坏的还是本来就坏的。
FAQ
- 不用 git 怎么办?: 用 git。AI 改的代码在 source control 之外没有可比的回滚方案。
- 能用 stash 代替 commit 吗?: 短期藏行。长 run 检查点用 commit 更稳——stash 容易丢。
- IDE undo history 行吗?: 单点改有用,多文件 agent run 没用。git 才是唯一可信源。
- 巨大 AI diff 怎么高效审?: 用
git diff --stat看文件图,再逐文件git diff <file>。先看”意外文件”——它们暗示 scope 漂移。 - 能脚本化吗?: 能。pre-AI commit hook(
pre-ai.sh)做git status; git diff --stat; git stash在团队采用 AI 编码时常见。