スキル

gh-stack:GitHub CLI で重ねた PR を管理する

すでに GitHub CLI v2.0+ があるときに重ねたブランチと Pull Request を管理する。先に gh-stack 拡張を入れ、ブランチを作る gh stack init は確認してから実行する。

公式ソース · gh-stack

インストール

gh extension install github/gh-stack

誰向けか

gh-stack は、重ねたブランチと Pull Request を管理する GitHub CLI 拡張である。すでに GitHub CLI を使っており、順序のあるブランチ一式を 1 本の stack として進めたい人に向く。概要は拡張のインストールに GitHub CLI v2.0+ が必要とも書いている。

資料は、AI コーディングエージェントが重ねた PR と gh stack コマンドラインを理解できるよう gh-stack skill を入れられると述べる。ただし抜粋は「その skill をインストールする」としか書いておらず、2 本目のインストールコマンドは出していないので、現れないインストーラを自分で足さないこと。資料はエージェント製品の一覧を出しておらず、特定のエディタ専用機能だと捉えてはいけない。公式ガイドページは

https://github.com/github/gh-stack

3 分で最初の試行を終える

公式のインストールコマンドは、抜粋にあるこの 1 本である:

gh extension install github/gh-stack

前提:このマシンにすでに GitHub CLI があり、バージョンが概要の v2.0+ を満たすこと。このコマンドは拡張をマシンに書き込むので副作用がある。今のリポジトリとアカウントが stack を試したい環境だと確認してからインストールする。

インストール後の低リスク確認:すぐブランチを作らない。先にコマンド gh stack が CLI から見つかることを確認する。資料は gh stack init を「新しい stack を開始し、最初のブランチを作成してチェックアウトする」と説明する。作業ツリーが変わるので、確認を得てから実行する:

gh stack init

成功の合図:インストール後、gh が stack サブコマンドを認識すること。新しい stack を始めると確認したなら、init のあと現在のリポジトリに新しい最初のブランチが現れ、後で未コミットの .git/gh-stack に JSON メタデータが見える。先に説明だけ見たいなら、インストール成功で止め、init しない。

利用例

例 1:新しい重ねブランチを始める。拡張が入ったリポジトリで、ブランチを変えてよいと確認してから gh stack init を実行する。資料はこれを最初のブランチの作成とチェックアウトと書く。概要は続けて層を足す、push、閲覧、一組の PR 提出にも触れるが、抜粋はそれらの後続サブコマンドの完全な書き方を出していない。この例の完了基準は「最初のブランチが作成されチェックアウトされた」までであり、push や PR 作成をすでにコピー可能な手順として書かない。

例 2:stack メタデータの場所を確かめ、中断した rebase のあとに何を見るかを理解する。資料は次のように書く:stack メタデータは .git/gh-stack にあり、リポジトリにコミットされない JSON で、どのブランチがどの stack に属しどの順かを記録する。中断した rebase の状態は別に .git/gh-stack-rebase-state にある。これは読み取り専用の確認である。この 2 つのパスを開き、ファイルがあることと JSON が現在のブランチ順を追跡していることを確認する。同じページに別手順がない限りこれらのファイルを手編集しない。抜粋は編集形式を出していない。

利用上の境界

拡張がカバーするのは重ねたブランチと Pull Request の管理だけである。メタデータは .git/gh-stack にありバージョン管理ツリーには入らない。rebase 中断状態は .git/gh-stack-rebase-state にある。init はブランチを作成してチェックアウトするので、読み取り専用コマンドではない。

抜粋に現れない skill インストールコマンドを作らず、概要の層追加、push、閲覧、提出をすでに与えられたサブコマンド一覧だと捉えないこと。資料はクライアント一覧も、GitHub CLI 以外での使い方も書いていない。ここに書いたインストール、init、メタデータの場所を超える範囲は、この説明の対象外である。