关于 pr-splitter
pr-splitter 是供开发者将大型 Pull Request 拆分为较小、易审查 PR 的工作流技能。它强调保留原始分支、分别验证每个拆分结果,并记录评审反馈带来的变化。
主要功能
- 01备份原始分支
- 02规划堆叠或并行 PR
- 03按文件或代码块提取变更
- 04分别验证每个 PR
- 05跟踪评审引入的差异
- 06创建范围明确的 changeset
适用场景
- 01将大型 PR 拆成易审查的部分
- 02把相互依赖的变更拆为堆叠 PR
- 03根据评审反馈重置 PR 堆栈
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mastra-ai/ mastra --skill pr-splitter安装后在 Claude Code 中输入/pr-splitter确认已加载。
详细介绍
PR Splitter
将原始 PR 保留为素材,有意识地拆分出更小、便于评审的 PR,并在评审反馈改变 stack 时在本地追踪偏差。
必需的工作流程
-
在修改历史之前先做快照
- 检查
git status。 - 为原始分支创建一个不可变的本地引用:
git branch backup/original-large-pr。 - 在拆分完成之前,不要删除或重写原始分支。
- 检查
-
盘点原始 PR
- 检查
git diff --stat <base>...HEAD、git diff --name-only <base>...HEAD和git log --oneline <base>..HEAD。 - 按评审单元对变更分类:准备/重构、API/类型变更、行为变更、测试、文档、清理、生成文件/锁文件。
- 检查
-
创建本地草稿文件
- 将拆分笔记写入未提交的本地文件,首选
.notes/pr-split.md。 - 确保
.notes/被忽略,或保持未跟踪状态。除非用户明确要求,不要提交草稿笔记。 - 追踪以下内容:原始分支、基础分支、计划中的 PR、已提取的文件/代码块、每个 PR 的验证情况、原始 diff 的剩余部分,以及评审反馈带来的有意偏差。
- 将拆分笔记写入未提交的本地文件,首选
-
选择拆分方式
- 当后续工作依赖于先前工作时,使用堆叠 PR。
- 只有当变更确实相互独立时,才使用并行 PR。
- 当一个共享的准备性变更能解锁多个独立工作时,使用“基础 PR + 并行后续 PR”的方式。
-
安全地提取变更
- 优先从正确的基础分支新建分支,再进行选择性还原,而不是重写杂乱的历史。
- 对于文件归属清晰的情况,使用路径级提取:
git checkout backup/original-large-pr -- path/to/file。 - 对于混合了多种变更的文件,使用代码块级提取:
git restore -p --source backup/original-large-pr -- path/to/file。 - 确保每个 PR 都可以独立构建、便于评审。
-
独立验证每个 PR
- 针对该 PR 的范围,运行最小但相关的构建、类型检查、lint 和测试。
- 除非拆分计划明确要求,否则不要把测试、文档或生成文件与其验证的代码分开。
-
有意识地管理偏差
- 将评审者批准的变更视为 stack 的新事实来源。
- 修改较早的 PR 之后,将依赖它的 PR 变基到该 PR 上,并以评审确认的方向解决冲突,而不是盲目采用原始分支的版本。
- 将不断演进的 stack 与
backup/original-large-pr比较,以找出剩余的意图,而不是强求逐字节一致。 - 在
.notes/pr-split.md中记录有意的差异。
-
对重写后的 stack 使用 range-diff
- 在变基、解决冲突或强制推送之后,使用
git range-diff了解发生了什么变化。 - 更新堆叠 PR 时,向评审者总结有意义的 range-diff 结果。
- 在变基、解决冲突或强制推送之后,使用
PR 描述模板
保持 PR 描述简洁,面向评审者:
## Summary
This is PR N of M split from a larger change.
## Scope
- ...
## Intentionally excluded
- Follow-up PR will handle ...
## Verification
- ...
不要在 PR 描述中放入完整的拆分台账。详细的提取笔记和偏差追踪应保存在 .notes/pr-split.md 中。
草稿模板
# PR split scratchpad
Original branch: backup/original-large-pr
Base branch: main
## Planned PRs
1. branch-name
- Scope:
- Files/hunks extracted:
- Verification:
- Changeset: (package names, bump type, scoped message)
- Status:
## Remaining original intent
- ...
## Drift notes
- Date / branch / reason:
Changesets
每个拆分出的 PR 都必须附带自己的 changeset,且仅涵盖该 PR 中的变更。不要保留源分支中的原始 changeset,因为它覆盖的是整体合并后的全部变更,不应出现在任何单个拆分 PR 中。
将变更提取到拆分分支后:
- 删除从原始分支带过来的所有 changeset 文件。 这些文件是针对合并后的整体 diff 编写的,会生成错误的变更日志条目。
- 使用 CLI 为每个 PR 创建新的 changeset(参见
.mastracode/commands/changeset.md):pnpm changeset -s -m "your scoped message" (--major | --minor | --patch) pkg-name - 将消息范围限定在该 PR 的变更内。 changeset 消息应描述该特定 PR 的具体作用,而不是整个原始功能。
- 仅包含该 PR 实际修改的包。 如果原始 changeset 列出了五个包,但该 PR 只涉及
@mastra/core,则新的 changeset 只应引用@mastra/core。 - 版本升级类型应与 PR 的范围相匹配。 准备性/重构类 PR 通常为
patch;引入新 API 表面的 PR 为minor;包含破坏性变更的 PR 为major。
将 changeset 创建步骤添加到草稿模板中每个计划 PR 的验证清单下,以免遗漏。
常见失败模式
避免以下情况:按文件拆分而行为跨文件;只提取测试而不提取代码;导致后续 PR 无法编译;在没有评审者摘要的情况下强制推送;过早删除原始分支;在解决堆叠冲突时还原评审反馈;在每个拆分 PR 中保留原始分支的 changeset,而不是为每个 PR 创建范围限定的 changeset。
默认输出
当被要求拆分 PR 时,应输出:
- 建议的 PR 顺序,
- 分支策略,
- 草稿路径及初始内容,
- 提取命令,
- 每个 PR 的验证计划,
- 偏移管理计划。
评论
支持 Markdown