AI 重构工作流:先 plan,再逐步 diff(2026)

安全的 AI 重构流程:测试跑绿、目标收窄、plan 模式、每步 git diff、干净回滚,附 Claude Code 与 Cursor 的具体操作。

AI 重构是典型的”看着美好、偶尔静默崩”工作流。模型欢快地改名、重构函数、“优化”代码路径,四小时后你才发现一个被裁掉的 null check 让生产环境的 checkout 挂了。解法不是不用 AI 重构,而是限制爆炸半径。这套流程给你”AI 重构能用”的四个前提、在花钱写代码之前就拦住 scope 漂移的”先 plan 后改”模式,以及周一早上不接到 incident 电话的回滚纪律。下面每一步都对应 Claude Code 或 Cursor 在 2026 年 6 月的真实命令。

太长不看

  • 只有四件事同时成立才用 AI 重构:受影响代码有测试、scope 限定在一个模块或一个关注点、目标能一句话说清、每个 diff 你都会审。
  • 让模型先出 plan 再动手。Claude Code 里连按两次 Shift+Tab(或输入 /plan)进入只读的 Plan 模式;Cursor 里先让 Composer 给出按顺序的改动清单,再接受任何编辑。
  • 增量应用,每步之间跑测试。绿了就 commit,红了先检查。
  • 保留一个干净的起始 commit,git diff 才能精确显示 AI 改了什么。未推送的用 git reset --hard 回退,已推到共享分支的用 git revert
  • 回归的最大单一来源是 scope 失控(“既然在做”)。每条岔路都推迟。

什么时候 AI 重构是对的工具

当改动有清晰的 before/after 和全绿测试时再用:

  • 在单个模块内改一个概念的名字:变量、函数或类。
  • 把重复逻辑抽到共享 helper。
  • 收紧类型签名或补上缺失的类型。
  • 用后继 API 替换 deprecated API。
  • 语法现代化:callback 转 async/await、React class 组件转 hooks、varconst/let

这些都是机械的、可在本地验证的、有边界的改动。正是在这里,拥有 1M token 上下文窗口的模型(截至 2026 年 6 月,Claude Opus 4.7、Sonnet 4.6 和 Gemini 3.1 Pro 都是 1M)能读完整个模块并给出忠实的改写。

什么时候不该用

  • 全项目架构重写。“正确答案”在产品方向里,不在代码里。
  • 没测试的代码。你拿不到”哪里坏了”的信号。
  • 性能优化。模型不会测量,只会猜。先 profile,再一次只改一处。
  • 正确性依赖仓库外上下文的事:合规规则、运维约束、另一个团队依赖的内部契约。

四个前提

让任何模型介入之前,先确认这四条全部成立。少一条就是在赌。

前提为什么重要怎么确认
区域有测试覆盖这是”行为没变”唯一的客观信号测试跑绿,把确切命令和输出抄下来当基线
scope 只有一个关注点跨模块重构会让错误复合并掩盖回归一句话写下目标;写不出来就拆
干净的 working treegit diff 只有对着已知良好状态才有意义git status 干净,且有一个新鲜 commit
每个 diff 你都审模型无法稳定发现自己的回归把审查时间算进任务里,别当事后补

没测试就先写。重构变成 TDD 练习,而且测试会活得比这次重构更久。

具体步骤

1. 建立基线

跑测试套件,确认全绿。记下确切命令(比如 npm testpytest -qgo test ./...)和它的输出。这就是重构之后必须重新达到的标准。然后确认 git status 干净,或者 stash 加 commit,让工作树处于无尘状态。

2. 一句话写下目标

模糊目标会引发扩散。对比一下:

  • 差:“清理一下 userService.js。”
  • 好:“把 userService.js 里 callback 风格的 fetch 调用换成 async/await,保留每一个公开方法签名,不改任何其他文件。”

后一种是能拿来”约束”模型、也能让你逐行验证的目标。

3. 让模型先出 plan,再动手

这是杠杆最高的一步。先要一份按顺序、带文件路径、暂不写代码的改动清单,这样你能在任何 token 被花在写代码之前就砍掉 scope 漂移。

  • Claude Code: 连按两次 Shift+Tab 进入 Plan 模式(状态栏会显示 ⏸ plan mode on),或输入 /plan。Plan 模式是一个硬只读沙箱:模型物理上无法编辑文件,所以指向生产代码也安全。对于跨多文件、或你无法一句话描述的重构,/ultraplan(2026 年 4 月加入)会做更深的分析,用延迟换更细粒度的 plan。在 Shift+Tab 只切换 auto-accept 的 Windows 版本上,改用 Alt+M
  • Cursor: 打开 Composer(Cursor 3.5 里的多文件 agent,2026 年 5 月 20 日发布),让它:“按顺序列出你会做的改动,带文件路径。先别写代码。” Composer 会把多文件编辑作为一个可审的 diff 呈现,支持按文件 accept/reject,爆炸半径始终在你手里。

一个可复用的 plan prompt:

下面是文件和目标。按顺序列出你会做的改动,带文件路径。先别写代码。

目标:[一句话重构目标]
文件:[路径]

4. 用你那句话去审 plan

不在路径上的改动一律砍掉。最常见的漂移是”热心的岔路”:“我顺便发现一个无关 bug,要不要修?” 推迟它。另一个 bug 是另一个 commit、另一份 diff。

5. 增量应用,每步之间跑测试

别让模型一把推完整个重构。应用一个逻辑步骤,跑测试,然后决定:

  • 绿:用清晰的 message 把这一步 commit。
  • 红:继续之前先检查。别在坏掉的状态上再叠一处改动。

小 commit 让日后真的冒出回归时 git bisect 很便宜。

6. 每个 diff 都审有没有静默删除

每步之后读 git diff(不只是摘要),专门盯模型爱”优化”掉的那几类:

  • 被删的 try/catch 或错误处理。
  • 被去的 null/undefined check 和 guard 子句。
  • 被改的默认参数。
  • 改名或删掉的 export。
  • 一个被”简化”的分支悄悄丢了一个边界情况。

任何你没要求的改动都 revert,哪怕测试还是绿的。

7. 跑集成与端到端测试,不只是单测

重构可以过每一条单测,却仍在边界处崩:序列化格式、API 契约、事件 payload。整套重构做完后,在收工之前跑一遍你有的集成或 e2e 套件。

干净回滚

干净起始 commit 之所以重要,是因为回滚因此变得轻而易举。

  • 还没推送: git reset --hard <good-commit> 把分支退回已知良好状态。它会丢掉未提交的改动,所以先确认没有有价值的内容还没 stage。
  • 已推到共享分支: 改用 git revert <bad-commit>。它新建一个撤销改动的 commit 并保留历史,拉过坏 commit 的队友因此能保持同步。共享分支上只有在你确实打算 force-push 且已协调好时,才动用 git reset --hard

如果你每一步都 commit 了(第 5 步),就能只 revert 弄坏的那一步,而不是整个重构。

工具速览(2026 年 6 月)

工具重构强项plan/预览步骤价格
Claude CodePlan 模式只读沙箱;只跑 Anthropic 模型(Opus 4.7、Sonnet 4.6)连按两次 Shift+Tab/plan/ultraplan随 Claude Pro $20/月 捆绑(Max $100/$200)
CursorComposer 多文件 diff,按文件 accept/reject;基于 git worktree 的并行 agent先让 Composer 给出有序改动清单Pro $20/月、Pro+ $60、Ultra $200;可跑 Sonnet 4.6、Opus 4.7、GPT-5.5、Gemini 3.1 Pro
Copilot Chat编辑器内、IDE 支持广应用前手动要一份 plan随 GitHub Copilot 套餐捆绑

每次模型更新都重评估一次。上季度爱过度删的模型这季度可能很守纪律,反过来也会发生。

容易踩的坑

  • 重构无测试代码。你没有”坏了”的客观信号。先写测试。
  • scope 失控。“既然在做”把 30 分钟重构变成 4 小时漂移。每条岔路都推迟。
  • 跳过 plan 直接写代码。意味着你只能在付完代价之后才发现 scope 漂移。
  • 接受模型”我顺便改好了”的礼物。这就是静默回归上线的方式。把 diff 严格限定到那句话目标。
  • 整套重构一个大 commit。拆成步骤,bisect 一个失败才便宜。
  • 只信单测。重构能在单测上保持全绿,同时在集成边界改变行为。
  • 让自主 agent 无边界地跑。长 agent run 没有中间 commit、没有人审每个 diff,是风险最高的模式。

FAQ

  • 没测试的代码库怎么办? 先给要重构的区域写测试。重构变成 TDD 练习,而在无测试代码上做 AI 重构,是微妙回归的最常见单一原因。
  • AI 能做架构级重构吗? 截至 2026 年 6 月还不能稳定做。它能提议架构,你来定。然后按同样的”先 plan 后改”纪律一块一块地落地。
  • scope 能多大? 每次一个模块、文件或关注点。跨模块重构会让错误复合。拆开,每一块跑一遍这套流程。
  • 模型不理我的 plan、改了更多怎么办? 拒绝这次改动、用更严的 scope 重新 prompt(“只改 userService.js,不碰任何其他文件”),或者换工具。Claude Code 的只读 Plan 模式和 Cursor 的按文件 diff 审查都能让越界在落地前就被发现。
  • 该让自主 agent 重构吗? 仅当 scope 有限、步骤之间有中间 commit、且有人审每个 diff 时。Cursor 能在独立 worktree 上跑最多 8 个并行 agent,这很强,但它抬高的是审查负担,不是降低。
  • 撤销烂重构用 git reset --hard 还是 git revert 没推送的本地工作用 git reset --hard;已在共享分支上的用 git revert,因为它保留历史、让队友保持同步。

相关阅读

标签: #AI 编程 #教程