GitHub⁠「Stacked pull requests」パブリックプレビューを開始 ――大規模な変更を小さなプルリクエストの連鎖として管理

GitHubは2026年7月30日、大規模なコード変更を、依存関係のある小さなプルリクエスト(PR)の連鎖として管理する「Stacked pull requests」のパブリックプレビューを開始した。各PRを個別にレビューしながら並行して開発を進め、スタック全体またはその一部をまとめてマージできる。

Stacked pull requestsとは

Stacked pull requestsでは、同じリポジトリ内にある2件以上のPRを順序付きの「スタック」として扱う。この機能は2026年4月にプライベートプレビューとして公開されていた。当時は組織アカウントの情報を入力してウェイトリストへ登録する必要があったが、今回のパブリックプレビューは、今後数日かけてすべてのリポジトリへ順次展開される。

既存の大きなPRを自動で分割するのではなく、作成者が変更内容を依存関係に沿って複数のブランチへ分ける。最下層のPRは通常mainなどの基準ブランチをマージ先とし、上層のPRは一つ下のPRのブランチをマージ先とする。

たとえば、3件のPRを積み重ねた場合、ブランチとマージ先の関係は次のようになる。

   ┌── feat/frontend     → PR #3 (base: feat/api-endpoints)  ← top
  ┌── feat/api-endpoints → PR #2 (base: feat/auth-layer)
 ┌── feat/auth-layer     → PR #1 (base: main)               ← bottom
main (default base branch)

共通の型やデータベーススキーマなどの基盤となる変更を下層に置き、それに依存するAPIやUIの変更を上層へ重ねる。GitHubのPR画面には、スタック全体と各PRの状態を一覧できるマップが表示され、レビュー担当者はPRごとにその層だけの差分を確認できる。

スタックを構成するPRでも、既存のレビューやマージ要件が引き続き機能する。最下層のPRのマージ先となるブランチ(通常はmainの保護ルールに従い、コードオーナーの承認要件[1]やCIチェックが、途中のPRを含む各層に適用される。

途中のPRをマージすると、そのPRと下層のPRが最下層から順にマージされ、上層の未マージPRは開いたまま残る。最上層のPRをマージ対象に選べば、スタック全体をまとめてマージできる。GitHubは残ったブランチを自動でリベースし、最下層となったPRのマージ先をmainなどの基準ブランチへ付け替える。必要なチェックを確認しながらPRを順番にマージする「マージキュー」への対応は、今後数週間かけて段階的に展開する予定としている。

Web⁠CLI⁠モバイル⁠APIに対応

Stacked pull requestsはGitHubのWebサイト、GitHub CLI、GitHub Mobileで利用できる。GitHub CLIでは、次のコマンドでgh stack拡張機能をインストールできる。

gh extension install github/gh-stack

この拡張機能は、スタックの作成やPRの追加、送信、同期、リベース、マージなどを扱う。スタックを構成するブランチは同じリポジトリ内に置く必要があり、フォークをまたぐスタックとGitHub Desktopには対応していない。

gh-stackリポジトリには、この拡張機能をAIコーディングエージェントから操作するための「gh-stack」Skillも用意されている。利用には前述の拡張機能が必要になる。このSkillには、スタックの構成やブランチ操作、PRの公開、リベースなどの手順に加え、状態確認にはスタック全体をJSONとして出力するgh stack view --jsonを使うとの指示が記載されている。GitHub CLIでは次のコマンドでSkillをインストールできる。

gh skill install github/gh-stack

CLIでは、4月のプライベートプレビュー以降、利用できる操作が増えた。現在は、gh stack modifyで対話画面を開き、スタック途中へのブランチ挿入や順序変更を行える。また、選択したブランチのコミットを上下の隣接ブランチへ取り込むfoldや、ローカルブランチとPRを残したまま、そのブランチとコミットをスタックから外すdropにも対応する。

既存ブランチもgh stack initの引数にすると自動で取り込まれる[2]

独自ツールや自動化処理からは、Webhooksのほか、REST APIとGraphQL APIを利用できる。REST APIはスタックの作成や変更、GraphQL APIは読み取りに対応する。API経由でPRをマージする既存ツールは、スタック向けの新しいマージAPIへの対応が必要になる。

GitHub Copilotアプリでは作業セッションも積み重ねる

GitHubが同日ブログに公開した事例では、GitHub Copilotアプリで古いコードベースの改修を複数の「stacked sessions」に分け、その変更を依存関係のあるPRとして積み重ねている。後続のセッションは先行セッションのコンテキストとブランチを引き継ぎ、その変更を土台に作業を進める。

具体的には、先行セッションで進めたフロントエンドのスタイル刷新をPRにしたうえで、その変更を土台とする別のセッションを開始し、react-bootstrapの削除を別のPRにした。AIによるコード生成で変更範囲が大きくなりやすい場面でも、一つの巨大なPRへまとめず、依存関係を保ったまま作業とレビューの単位を小さくする例として紹介している。


gh stackでスタックの作成からPRの公開までを試す

GitHub CLIのgh stack拡張機能(v0.1.0)を使い、動作確認用リポジトリでスタックの作成、ブランチの挿入と順序変更、PRの公開までの流れを確認した。今回は画面表示の確認に絞り、スタックを構成する各ブランチへ空コミット(ファイル変更を含まないコミット)を1件ずつ置いている。

スタックを作成して構成を確認

gh stack init --base main feat/auth-layerを実行すると、同じ競合の解決内容を再利用するGitのrerere機能を有効にするか確認された。今回は有効にして、mainを基準とする最下層のブランチfeat/auth-layerを作成した。続けてgh stack addfeat/api-endpointsfeat/frontendを積み重ね、3層のスタックを作成した。

gh stack initとgh stack addで3層のスタックを作成した端末画面
mainの上にfeat/auth-layerfeat/api-endpointsfeat/frontendを積み重ねた

gh stack viewを実行すると、スタックを構成するブランチとそれぞれのコミット数がツリー形式で表示される。画面上では、mainに近い最下層からfeat/auth-layerfeat/api-endpointsfeat/frontendの順に並んでいることを確認できる。

gh stack viewで3層のスタックを表示した画面
gh stack viewでは、現在のブランチとスタック全体の構成を一覧できる

ブランチを挿入して順序を変更

gh stack modifyを実行すると、スタックの構成を対話形式で変更する画面が開く。右上には、ブランチの挿入、名前変更、順序変更などに使うキーが表示される。

gh stack modifyを起動した直後の画面
gh stack modifyの画面では、スタックの構成と利用できる操作を確認できる

まず、feat/api-endpointsを選択してIキーを押し、その上へfeat/testsを挿入した。変更はすぐには適用されず、未適用の変更として緑色で表示されるため、挿入位置を確認してから反映できる。

feat/testsブランチをスタックの途中へ挿入した画面
feat/testsfeat/frontendfeat/api-endpointsの間へ挿入した状態

続けてfeat/testsを選択し、Shift+↑で1層上へ動かすと、feat/testsが最上層へ、feat/frontendがその一つ下へ移った。移動した2本のブランチは紫色で示され、画面下部には未適用の変更が2件あることも表示された。

feat/testsブランチを最上層へ移動した画面
順序変更によって動くブランチと移動方向が画面上に表示される

Ctrl+Sで変更を適用すると、必要なブランチが自動でリベースされた。再度gh stack view --shortを実行すると、feat/testsfeat/frontendfeat/api-endpointsfeat/auth-layerの順に並んだ4層のスタックを確認できた。

順序変更を適用して4層のスタックを確認した端末画面
順序変更の適用後はfeat/testsがスタックの最上層になった

4件のPRをまとめて作成

gh stack submitを実行すると、スタック内の各ブランチから作成するPRをまとめて編集する画面が開く。左側で対象のブランチを選び、右側でPRのタイトルと説明、ReadyまたはDraftの状態を指定できる。

gh stack submitで4件のPRを編集する画面
gh stack submitでは、スタック全体を見ながらPRごとの内容を編集できる

最初に画面を開いた時点では、途中で挿入したfeat/testsに固有のコミットがなかったため、いったん送信を中止して空コミットを追加した。再度gh stack submitを実行すると、4本のブランチがプッシュされ、4件のPR(PR #1〜#4)と、それらを束ねるスタックが作成された。

gh stack submitで4件のPRとスタックを作成した端末出力
4件のPRを作成し、ブランチとPRの状態をGitHubへ同期した

GitHub上でスタックを確認

GitHubのPR一覧では、各PRにスタック内の位置が表示される。今回作成した4件では、最下層の「Add auth layer」1/4、最上層の「Add tests」4/4が付いている。

GitHubのPR一覧にスタックを構成する4件のPRが表示された画面
PR一覧から各PRがスタックの何層目にあるかを確認できる

個別のPR画面からスタックのマップを開くと、基準ブランチのmainと4件のPRが縦につながって表示される。⁠Add tests」のマージ先がfeat/frontendになっていることも、PR上部の表示から確認できる。

GitHubのPR画面でスタック全体のマップを開いた画面
個別のPR画面から、スタック全体と各PRの依存関係をたどれる

スタック途中の「Add API endpoints」⁠PR #2)の画面でマージ操作欄を開くと、ボタンには「Merge stack 2」と表示された。このPRと下層の「Add auth layer」の2件だけがマージ対象になることが分かる。

GitHubのPR画面でスタック途中の2件をマージ対象にした画面
スタック途中のPRを選ぶと、そのPRと下層のPRだけをまとめてマージできる

CLIで構成したブランチの順序が、各PRのマージ先とGitHub上のスタック表示に反映されることを確認できた。

おすすめ記事

記事・ニュース一覧