Technology

積み重ねたブランチから層ごとのPRを作るGitHub CLI拡張

この記事のポイント

  1. 実現したこと

    順序付けたブランチから層ごとのPRを作り、一つのstackとして管理できる。

  2. 実現の仕組み

    各PRのベースを直下のブランチに設定し、レビュー対象をその層の差分に絞る。

  3. 得られた結果

    submitコマンドの実行により、ブランチごとのPRがGitHub上で相互に関連付けられる。

  4. 従来との違い

    originの更新取得と各層の連鎖rebaseが、単一のrebase操作として実装された。

下位ブランチから順に分岐して積み重なるソフトウェアブランチを抽象的な線とノードで表した編集イラスト
AI生成画像

積み重ねたブランチごとにPRを作り、直下の層をベースに設定するGitHub CLI拡張「gh stack」が公開された。GitHubは、ブランチ作成から連鎖的なrebaseまでをコマンド化した。

直下のブランチを継承するスタック構造

GitHubが公開した「gh stack」は、積み重ねたブランチとPRを管理するGitHub CLI拡張である。スタックはブランチの順序付きリストとして表され、各ブランチが直下のブランチを継承する。

最下層のブランチはトランクブランチを基点とし、上へ進むほどトランクから離れる。この構造により、大きな変更を依存関係のある複数の層として保持できる。

initとaddでブランチの順序を構築

initコマンドは、現在のリポジトリにローカルスタックを初期化する。ブランチ名を明示した場合は既存ブランチをスタックへ取り込み、存在しない名前については新しいブランチを作成する。

基点は、–baseで変更しない限りリポジトリのデフォルトブランチになる。スタックの最上層ではaddコマンドが現在のHEADからブランチを作り、そのブランチを新しい最上層として追加したうえでチェックアウトする。

ブランチごとのPRを一つのstackへ関連付け

submitコマンドを実行すると、スタックを構成するブランチごとに一つのPRが作成され、GitHub上で一つのstackとして相互に関連付けられる。ブランチの順序が、そのままPR間の依存関係へ引き継がれる。

各PRのベースには直下のブランチが設定される。この設定により、レビュー画面にはスタック全体の累積変更ではなく、その層で加わった差分が現れる。

ローカル状態を保ちながら全層を連鎖rebase

スタックの構成とブランチの順序は、.git/gh-stackにあるJSONファイルへ保存される。このファイルはリポジトリへコミットされず、ローカルでブランチ間の関係を追跡する。

rebaseコマンドはoriginから更新を取得し、スタックの各層を連鎖的にrebaseする。層間の移動も同じ順序に従い、upはトランクから離れる方向、downはトランクへ近づく方向を指す。