GitHub 堆叠 PR 公测:大改动拆成可独立审查、一键合并的 PR 链

前言

大型功能改动往往意味着一个体积庞大的 Pull Request:审查者面对上千行 diff 容易走马观花,作者则要手动维护多条依赖分支、反复 rebase,CI 与分支保护规则还常常只对栈底 PR 生效。Stacked Pull Requests(堆叠 PR)是业界长期探索的解法——把一次大变更拆成有序、有依赖关系的小 PR 链,逐层审查、按需合并。

2026 年 7 月 30 日,GitHub 在 Changelog 中宣布 Stacked Pull Requests 进入公测(Public Preview),并在官网、CLI、移动端及 API 层面提供原生支持。配套开源扩展 github/gh-stack 与 Copilot 可用的 gh-stack skill 一并发布。Next.js、TED、WHOOP 等团队已在预览期使用,Hacker News 与开发者社区讨论热度较高。本文基于官方 Changelog、文档与 gh-stack 仓库说明,梳理这一能力是什么、解决什么问题,以及如何上手。

什么是堆叠 PR

堆叠 PR 指同一仓库内两个及以上相互依赖的 Pull Request,形成一条「自下而上」的分支链:

   ┌── feat/frontend     → PR #3(base: feat/api-endpoints)  ← 栈顶
  ┌── feat/api-endpoints → PR #2(base: feat/auth-layer)
 ┌── feat/auth-layer     → PR #1(base: main)               ← 栈底
main(默认主干分支)

规则要点如下:

  1. 栈底 PR 的目标分支是主干(通常是 main,也可以是 release 分支等任意 trunk)。
  2. 上一层 PR 的目标分支是下一层 PR 所在的分支,而非直接指向 main
  3. 每个 PR 只展示「本层相对下一层」的 diff,审查者看到的是聚焦、可消化的小改动。
  4. 依赖顺序:若 A 层代码依赖 B 层,则 B 必须在同层或更低层;切换关注点(例如从后端切到前端、从核心逻辑切到测试)时,应新建一层分支。

官方文档强调的核心原则:不必等底层 PR 合并后再开上层 PR,可以在底层仍 open 的状态下继续往上叠,从而在大项目推进中保持开发节奏。

为何此时受到关注

堆叠 diff 并非新概念,Graphite、Sapling、git-branchless 等工具此前已在 GitHub 生态外提供类似工作流。GitHub 将其做成平台原生能力,主要回应三类现实痛点:

1. 大型 PR 审查瓶颈

单个 PR 过大时,审查慢、易漏检、易 stale 并产生合并冲突。Next.js 负责人 Tim Neutkens 在官方公告中称,团队使用堆叠 PR 数月,能在交付大功能的同时保持每层改动足够小、便于 review。

2. AI 辅助开发带来的新压力

TED CTO Andy Merryman 提到,AI 显著提升了开发产出,但 PR 体积随之膨胀,审查成为新瓶颈。堆叠 PR 把大 diff 拆成语义清晰的小块,有助于提高审查速度与准确性。GitHub 文档也明确写到:当 Agent 连续完成多个有依赖的任务时,可直接映射为「一层 PR 对应一个任务」的栈结构。

3. 手工维护依赖分支的成本

在没有原生支持时,拆分依赖 PR 意味着:手动 rebase 同步、CI 可能只跑栈底、中间层 PR 脱离上下文难以审查。GitHub 堆叠 PR 将整条链视为关联单元,同时保留每层的小粒度 diff,并自动处理级联 rebase 与 base 分支重定向。

平台原生能力一览

公测版本在以下入口可用(官方文档核实):

入口 说明
github.com PR 页顶显示栈图标与层数;合并框内有 stack map,可一键跳转各层
GitHub CLI gh stack 扩展,管理本地分支、推送、提交 PR
GitHub Mobile 移动端同样支持栈视图与操作
Webhooks / REST / GraphQL pull_request 事件含 stack 对象;REST 可列出、创建、扩展、解散栈
Copilot 等 Agent 通过 gh-stack skill 调用 CLI 工作流

当前限制(文档明确标注):

  • 所有分支必须在同一仓库,不支持跨 fork 堆栈
  • GitHub Desktop 暂不支持
  • 功能处于 Public Preview,接口与行为可能调整。
  • Merge Queue 对堆叠 PR 的支持将在未来数周内逐步 rollout,并非所有仓库立即可用。

审查与合并机制

独立审查、并行推进

打开栈中任意一层 PR,审查界面仅显示该层 diff;顶部 stack map 展示整栈结构与各层状态。不同审查者可同时 review 不同层,互不阻塞。

分支保护与 CI

合并要求以栈底 PR 的 base 分支(通常为 main)为准,但每一层都会执行分支保护规则(如 CODEOWNERS)以及针对默认分支触发的 CI,而非只有栈底跑检查。这解决了以往「中间层 PR 质量状态不透明」的问题。

合并方式

合并必须自底向上,支持三种策略:

  1. 整栈合并:合并栈顶 PR,其下所有未合并层一并落地(merge commit、squash、rebase 均支持)。
  2. 部分合并:合并栈中某一中间层,该层及以下合并,上方层保持 open 并自动 rebase、重定向 base。
  3. 单层合并:只合并栈底或部分底层,按需逐步推进。

合并结果与逐层单独合并的提交历史一致。若通过 API 合并,需使用支持堆栈的新 merge API(文档 API 版本 2026-03-10 起)。

自动 rebase

rebase 是堆栈工作流中最易出错的环节。GitHub 支持在 PR 页面触发服务端级联 rebase;本地则可用 gh stack 扩展执行级联 rebase。合并栈底后,剩余分支会自动 rebase,下一层 PR 的 base 会指向新的主干位置。

用 gh-stack 快速上手

官方 CLI 扩展仓库:https://github.com/github/gh-stack(截至写作时 GitHub 上 star 数已逾数百)。要求已安装 GitHub CLI(gh v2.0+)。

1. 安装扩展与 Agent Skill

# 安装 gh stack CLI 扩展
gh extension install github/gh-stack

# 可选:为 Copilot 等 Agent 安装 gh-stack skill
gh skill install github/gh-stack

2. 创建第一个栈

典型工作流如下:

# 初始化栈(创建并 checkout 第一层分支)
gh stack init

# 在第一层上完成 commit ...

# 在栈顶再叠一层
gh stack add api-endpoints

# 继续 commit,按需 gh stack add ...

# 推送所有分支
gh stack push

# 查看栈结构
gh stack view

# 为各层创建并关联 PR
gh stack submit

也可非交互式指定分支名:

gh stack init feature-auth feature-api feature-ui

栈元数据保存在本地 .git/gh-stack(JSON,不提交到仓库),用于跟踪分支顺序;gh stack init 会自动启用 git rerere,以便 rebase 冲突解决可被记住。

3. 常用导航命令

gh stackup 指向远离 trunk 的方向(栈顶),down 指向靠近 trunk 的方向。其他命令包括 checkoutsync(拉取 trunk 并级联 rebase)、restack(变基整栈)等,完整说明见仓库 README。

与 Merge Queue、Copilot 的关系

Merge Queue:GitHub 公告写明,堆叠 PR 的 Merge Queue 支持正在分阶段推出。John Resig 在公告中提及,可将 5 个堆叠 PR 一次性送入 merge queue 合并——这依赖该能力在目标仓库已启用。

Copilot Agent:通过 gh-stack skill,Agent 可遵循与 CLI 相同的分支顺序创建栈、提交 PR,避免把多个无关联任务塞进单一巨大 diff。这与 GitHub 文档中「Agent 完成一个任务后基于其继续下一任务」的描述一致。

公测 rollout 与反馈渠道

根据 2026-07-30 官方 Changelog:

  • 堆叠 PR 公测将在未来数天内向所有仓库逐步开放。
  • Merge Queue 集成将在未来数周内逐步推出。
  • 详细用法见文档:About stacked pull requests;反馈可在 GitHub 的 stacks discussion 中提交。

小结:值不值得现在试

若你或团队经常面对「一个大 PR 没人敢审」或「AI 产出快、审查跟不上」的情况,GitHub 原生堆叠 PR 值得在公测期试点:工作流与现有 review、checks、分支保护兼容,CLI 与 Agent skill 降低了建栈成本。若团队已深度依赖 Graphite 等第三方工具,可先并行对比再决定是否迁移;跨 fork 协作、Desktop 用户则需等待后续支持或继续沿用现有方案。

无论如何,把大变更拆成有依赖顺序的小 PR、逐层审查、整栈一键合并——这条思路已被 GitHub 写入平台默认能力,值得纳入下一次大型改动的分支策略考量。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜