AI 大改代码后怎么保证可回滚?Git 纪律在 AI 时代有什么变化?

Q7-05AI 编程协作 · 回滚与版本控制纪律常见git纪律checkpoint回滚提交粒度可归因worktree

谁在问:工程向面试官二面;出过事故的团队会问得很具体

口语化问法

  • AI 一口气改了几十个文件,你怎么保证能退回去?
  • 你们工具里那个 checkpoint 能不能当回滚用?
  • Git 那套东西在 AI 写代码之后有什么变化吗?

考察意图

三层:

  1. 你知不知道会话检查点和版本控制不是一回事。这是最直接的分水岭——把 checkpoint 当回滚方案的人,一定还没被它的边界坑过。
  2. 你有没有意识到「原则没变、参数变了」。Git 的原则(小步、可回滚、可追溯)一条没变,但每条的合理取值都变了,因为单次改动的体量和作者的性质都变了。
  3. 你有没有可归因意识。事故之后能不能回答「这行是谁写的、是不是 AI 写的」,2026 年已经从洁癖变成了刚需。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

每次让 AI 大改之前我会先提交一次,保证有干净的基线。改完分小步提交,别一次几百行。分支保护和 CI 该有的都有,出问题就 revert 那个提交。工具自带的 checkpoint 我也用,改错了可以退回上一步。

及格。缺的是边界:checkpoint 到底能退什么、退不了什么,一句没说;而「退不了什么」正是出事的地方。

90

90 分答案(有生产经验的回答)

先说清两者的分工:会话检查点用来撤销「刚才那一步说错了」,git 用来撤销「这个方向整个错了」。它们不能互换,官方文档里也明写着检查点不是版本控制的替代。具体差在哪:

能力 会话检查点 git
恢复模型直接改的文件
恢复 shell 命令改的文件(rm/mv/代码生成器) 不追踪
恢复后台子 agent 的编辑 不恢复
保留期 典型上限 100 个、随会话 30 天清 永久
跨机器 / 跨人可见

最容易吃亏的是第二三行:一旦 agent 用 shell 跑了个脚本批量改文件,或者派了个后台子任务去改,检查点就退不回来了——而这两种恰恰是大改动最常用的方式。所以我的规矩很简单:异步派活之前必须先 commit 一次,这一步只花五秒,但它是唯一可靠的那道闸。

再说 Git 纪律变了什么——原则没变,参数变了

  1. 提交粒度要更小。因为 AI 单次改动面更大:有统计显示 AI 辅助 PR 的 75 分位体积约 400 行,非 AI 约 157 行。一次三百行的提交,回滚时你只能全退,连带把对的部分一起退掉。判据是「一次提交对应一个可独立回滚的意图」,而不是「AI 干完这一轮」。
  2. 提交信息的重心从「改了什么」移到「为什么这么改」。改了什么 diff 里有;为什么只有当时的人知道——而现在这个「人」有一半是 AI,如果不写下来,三个月后没人能重建当时的判断。
  3. 署名 trailer 值得加,但价值不在你以为的地方。它的真实价值是事后可归因:某高校团队 2026 年扫了四万多条安全公告,确认出 74 例由 AI 生成代码引入的真实 CVE,靠的就是提交元数据里的署名。局限也在这——删掉署名就漏检,所以那个数字是系统性低估,研究者自己估计真实数是确认数的 5 到 10 倍。这也意味着:署名是团队自愿的追溯机制,不是可靠的审计手段。
  4. 并行开发用 worktree 隔离,但要知道代价:worktree 之间不共享提示缓存,并行省的是人的时间,花的是钱。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
五层追同一条边界:checkpoint 退得回什么、退不回什么

  1. 既然有 checkpoint,为什么还要频繁 commit?

    期望三个覆盖不到的场景:shell 命令改的文件rm/mv/代码生成器)、后台子 agent 的编辑、跨会话/跨机器/跨人。再补一条:检查点是会话内线性的,同一会话干了两件不相关的事,退回去会两件一起退;git 能精确挑一个提交回滚
    信号具体说出「shell 改的文件不追踪」→ 真读过文档或踩过;只说「checkpoint 不太可靠」→ 听来的
  2. AI 一轮就改了三百行,你怎么切提交?

    期望不按 AI 的节奏切,按意图切:改完先别提交,自己过一遍 diff,按「可独立回滚的意图」分组(重构接口 / 补幂等 / 补测试)分别 stage。切不开说明任务本身就该拆——回到规格那步拆细,而不是在提交环节硬切;超过 200 行强制拆 PR,是控评审成本最便宜的一刀
    信号答「AI 改完整体提一个,反正有 PR」→ 没有回滚粒度概念;说「切不开说明任务该拆」→ 把回滚问题推回了规格
  3. 提交信息让 AI 写行不行?

    期望能写「改了什么」,写不了「为什么」——「为什么」里含的是它不知道的东西:线上现状、历史包袱、这次为什么选 A 不选 B。做法是它起草描述、人补一句决策理由。全自动生成的读着通顺但全是 diff 的复述,提交历史一旦全是复述,代码考古就废了
    信号答「让它写挺好,省事」→ 团队的提交历史大概率已经没价值;能分「描述可代笔、理由不可代笔」→ 做过代码考古
  4. 署名 trailer 到底有没有用?有人觉得是形式主义。

    期望两面讲。有用:事后归因的唯一低成本抓手——公开研究就是靠提交元数据确认了 74 例 AI 引入的真实 CVE。不可靠:删掉署名就漏检,只能做趋势观察,不能做合规审计。组织立场也分裂:有的强制标注工具名、有的要求标注并声明作者负全责、也有基金会明确不强制
    信号只说「有用」或「形式主义」→ 都是单面;说出「不同组织立场分裂,取决于你在防什么」→ 高一档
  5. 线上事故要回滚,改动分散在 6 个已合并且互相依赖的 PR 里,怎么退?

    期望先止血再求净——关入口(开关降级、切流量、限流)秒级,回滚分钟级 → ② 固定一个变量一分为二:同一组输入回滚前后各跑一遍,没变就是流量/配置侧的病,回了白回 → ③ 能前滚就别回滚,判据是可不可逆:写库、发消息、扣款的 PR 不能简单 revert → ④ 真要退按依赖倒序、逐个跑判据 → ⑤ 复盘落到回滚闸:高风险配开关、不可逆操作单独成 PR
    信号上来就讲 git revert -m → 视角停在工具层;先说「关开关止血」→ 真值过班
前四层还在比习惯:检查点的边界、切提交的粒度、署名的两面。第 5 层才见真章 —— 考的不是 git 命令,是「先关开关止血、再判改动可不可逆」的止损顺序。

评分要点

  1. 说得清检查点与 git 的分工,并至少举出两条检查点覆盖不到的场景
  2. 有「异步派活前先 commit」这类具体、便宜、可执行的习惯
  3. 提交粒度以可独立回滚的意图为判据,而不是以 AI 的轮次为界
  4. 说得出提交信息重心的变化(从「改了什么」到「为什么」)
  5. 对署名 trailer 能给出双面评价(可归因 / 删掉就漏检)
  6. 知道 worktree 并行的代价(不共享提示缓存)
  7. 事故场景下先止血后回滚,并能判断改动是否可逆
  8. 会用「固定住一个变量把问题一分为二」确认归因,而不是直接回滚碰运气

常见错误

「有 checkpoint 就够了」没踩过 shell 改文件、后台子 agent 的坑
「AI 改完整体提一个大 commit,PR 里能看」没有回滚粒度概念,事故时只能全退
提交信息全由 AI 生成且只复述 diff提交历史失去信息量,代码考古能力归零
「署名是形式主义」或「署名能做审计」两个方向的极端,都没理解它的能力边界
事故第一反应是回滚代码缺止血意识,秒级手段没用上
六个 PR 一起 revert不区分改动是否可逆,可能造成二次事故
「回滚完再看是不是这批改动引起的」顺序反了,可能回滚了无关代码还找不到真因
「我们分支保护做得很好」——但说不出单 PR 体积限制有形式没有关键参数

关联学习