積み重ねたブランチごとに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はトランクへ近づく方向を指す。