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、var转const/let。
这些都是机械的、可在本地验证的、有边界的改动。正是在这里,拥有 1M token 上下文窗口的模型(截至 2026 年 6 月,Claude Opus 4.7、Sonnet 4.6 和 Gemini 3.1 Pro 都是 1M)能读完整个模块并给出忠实的改写。
什么时候不该用
- 全项目架构重写。“正确答案”在产品方向里,不在代码里。
- 没测试的代码。你拿不到”哪里坏了”的信号。
- 性能优化。模型不会测量,只会猜。先 profile,再一次只改一处。
- 正确性依赖仓库外上下文的事:合规规则、运维约束、另一个团队依赖的内部契约。
四个前提
让任何模型介入之前,先确认这四条全部成立。少一条就是在赌。
| 前提 | 为什么重要 | 怎么确认 |
|---|---|---|
| 区域有测试覆盖 | 这是”行为没变”唯一的客观信号 | 测试跑绿,把确切命令和输出抄下来当基线 |
| scope 只有一个关注点 | 跨模块重构会让错误复合并掩盖回归 | 一句话写下目标;写不出来就拆 |
| 干净的 working tree | git diff 只有对着已知良好状态才有意义 | git status 干净,且有一个新鲜 commit |
| 每个 diff 你都审 | 模型无法稳定发现自己的回归 | 把审查时间算进任务里,别当事后补 |
没测试就先写。重构变成 TDD 练习,而且测试会活得比这次重构更久。
具体步骤
1. 建立基线
跑测试套件,确认全绿。记下确切命令(比如 npm test、pytest -q、go 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/undefinedcheck 和 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 Code | Plan 模式只读沙箱;只跑 Anthropic 模型(Opus 4.7、Sonnet 4.6) | 连按两次 Shift+Tab、/plan 或 /ultraplan | 随 Claude Pro $20/月 捆绑(Max $100/$200) |
| Cursor | Composer 多文件 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,因为它保留历史、让队友保持同步。