在开发者社区喊了很多年以后,GitHub 终于把 stacked PRs 做进了平台里。

gh-stack 是 GitHub 官方推出的第一方 stacked PRs 功能,目前在 private preview 阶段,需要通过 waitlist 申请(gh.io/stacksbeta)才能启用。
一个 stack 就是一条有序的 PR 链,每个 PR 的 base branch 指向它下面那个 PR,最终汇入 main:
main ← PR #1(auth-layer,底层)← PR #2(api-endpoints)← PR #3(frontend,顶层)

这和很多开发者已经用过的第三方工具(Graphite、Aviator 等)概念一致,但好在它是原生集成的。
值得关注的几个设计点:
PR 页面内置了 stack map。 审阅者可以直接在 PR header 看到整个 stack 的结构,在层级之间跳转。CI 会模拟对最终 target branch(main)的合并,而不是只针对直接的 base branch 跑。分支保护规则也以最终目标分支为准——这解决了一个很大的痛点:以前用第三方工具做 stacking 时,分支保护经常对不上。
一键合并整个 stack。 可以单选某个 PR,也可以一次合并"底部的两个 PR",等 CI 通过后自动合并。合并完成后,剩下的 PR 会自动 rebase 到更新后的 base branch。这在第三方工具里叫 cascading rebase,现在 GitHub 自己做了。
CLI 扩展。 gh-stack 通过 gh extension install github/gh-stack 安装,支持 gs init、gs add、gs push、gs submit 等命令。也可以 alias gh stack 到 gs。不强制——你也可以在 GitHub UI、API 或标准 Git 工作流里手动管理 stack。
AI agent 集成。 gh skill install github/gh-stack 这一步很有意思:它教会 AI 编程 agent 如何操作 stack。也就是说,GitHub 内部已经在考虑让 Copilot 这类 agent 自动把大 diff 拆成 stack,或者从一开始就按 stack 开发。
Stacked PRs 不是什么新概念。Phabricator 时代的 Differential 就有类似机制,Gerrit 的 patchset chain 也是这个思路,更不用说 Graphite 这类现代工具在过去几年的推动。GitHub 的迟到多少让人有点意外——但第一方实现有几个不可替代的优势:原生 UI、分支保护规则的正确对齐、CI 的最终合并模拟,以及最大的一个:不用再装第三方工具。
目前还在 private preview,没有公开 GA 时间表。但东西已经在 gh-stack 文档站上了,CLI 扩展也发布了,看起来离 public beta 不会太远。
参考来源:
