目标
巨型 PR 从来不是一个变更,而是几个被订书钉钉在一起的变更。沿着天然的缝拆开——预备重构、惰性模块、开关门控的接线、最终激活——一小时的扫视就变成四次专注的评审,每片独立可合并、可回滚。
步骤要点
- 找出天然缝隙:识别工作本身已有的边界——新模块与集成、数据层与 UI、独立子特性、预备性重构,形成切片计划。
- 按依赖排序、准备先行:重构与新抽象先落地,任何中间状态都编译通过且全绿。
- 用开关而非缺席来门控行为:按特性开关切片,代码路径以惰性方式合入而非半成品状态,生产行为保持关闭直到最后一片。
- 成系列评审带上下文:先给评审者系列全景图,每个切片评审都带着计划与前序上下文,而不是显得莫名其妙。
- 郑重收尾系列:最后一片翻转开关或拆除脚手架,收尾摘要链接全部切片供日后考古。
排错提示
中间提交不是绿的说明依赖顺序排错了,重构与抽象必须先行;模块写完才想合入是被迫攒大 PR 的根源,惰性合入加开关让集成持续发生;最后激活片要小到产品经理能读懂,行为变更的时刻应该清晰可见。
适用边界
拆分本身有协调成本,一两天的小改动直接评审更划算;特性开关的清理要进系列收尾清单,否则拆分留下开关债。
代码示例
mega-PR: gift-card payments (2,340 lines) -> series:
#1 prep: extract PaymentProvider interface
(refactor, no behavior change, 118 lines)
#2 core: gift-card provider module (inert,
not registered, 612 lines)
#3 data: card-balance table + migrations
(additive, 214 lines)
#4 wiring: register provider behind flag
gift_cards=off (96 lines)
#5 activate: flag default on + remove
scaffolding (44 lines)
review experience: 5 focused reviews,
each green at merge, revertable alone
(vs 1 skim of 2,340 lines)