glab-stack について
glab-stack は、依存関係のある Git ブランチとコミットを GitLab のマージリクエストスタックとして管理する、実験的な glab コマンドラインスキルです。リビジョン範囲から階層を推定し、順序変更やブランチとマージリクエストの同期を行えます。
主な機能
- 01スタックの作成と選択
- 02Git リビジョンから階層を推定
- 03スタック変更の保存と修正
- 04階層の並べ替えとリベース
- 05ブランチとマージリクエストの同期
活用シーン
- 01機能を依存関係のあるマージリクエストに分割
- 02リビジョン範囲からスタックにコミットを追加
- 03並べ替え後のマージリクエストをリベースして宛先変更
- 04スタックの変更をプッシュしてマージリクエストを更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vince-winkintel/ gitlab-cli-skills --skill glab-stackインストール後、Claude Code で/glab-stackを入力して読み込まれたか確認します。
同梱ファイルreferences/commands.md
詳細
glab stack
ワークツリーごとの選択
現在選択されているスタックは、Git ワークツリーごとに記録されます。操作するワークツリーで目的のスタックを選択し、内容を確認してください。あるワークツリーでスタックを切り替えても、別のワークツリーではそのスタックは選択されません。スタックデータとリポジトリの参照は引き続き共有される場合があるため、破壊的な操作や公開操作の確認は必要です。
概要
スタックとは、1 つの機能を実装する、小さく相互に依存した一連のマージリクエストです。ローカルでは、各差分はそれぞれ独自のブランチ上にある 1 つのコミットで、直前の差分のブランチを基点とします。同期すると、最初の差分はベースブランチを対象とし、それ以降の差分は直前のブランチを対象とする MR が作成されます。
スタックコマンドは、現在チェックアウトされているブランチに関係なく、最後に作成または切り替えたスタックを対象にします。変更を加える前に、アクティブなスタックを確認してください。この機能は現在も実験段階です。親コマンドとサブコマンドのヘルプ全文(現行の用語と例を含む、チェックサムで検証済み)については、references/commands.md を参照してください。
クイックスタート
glab stack --help
現在の動作
生成されるスタックブランチ名は {branch_prefix}-{stack-title}-{hash} です。branch_prefix が設定されていない場合、glab は OS アカウントのユーザー名を使用し(Windows のドメインプレフィックスは削除します)、ユーザー情報を取得できない場合に限り glab-stack にフォールバックします。$USER には依存しません。自動化で安定した明示的なプレフィックスが必要な場合は、glab config set branch_prefix <value> を設定してください。
glab stack infer <revision-range> は、Git のリビジョン範囲から選択したコミットを使って、スタックのレイヤーを作成または追加します。範囲の開始点は、HEAD~5 のような相対参照ではなく、ブランチ名として解決される必要があります。これは、ベースブランチがスタックのメタデータに記録されるためです。
# Infer stack layers from commits between main and the current branch
glab stack infer main..HEAD
# Infer from a feature branch that diverged from develop
glab stack infer develop..HEAD
# If no stack is active, create one with a specific name
glab stack infer --name feature-stack main..HEAD
スタックがアクティブな場合、infer はそのスタックに追加し、--name は無視します。アクティブなスタックを先に確認してください。関係のない作業を推定する場合は、glab stack create または glab stack switch を使って、先に別の追加先を選択してください。
glab stack sync は、--update-base、--assignee、--label、--reviewer、--skip-mr-creation、--skip-push をサポートします。
# Sync stack and rebase onto the latest base branch
glab stack sync --update-base
# Sync/push existing stack work without opening MRs for branches that do not have one yet
glab stack sync --skip-mr-creation
# Fetch and rebase the stack locally without pushing branches or creating MRs
glab stack sync --skip-push
# Sync stack and set MR metadata during submission
glab stack sync --assignee @owner --reviewer @reviewer --label backend
# Multiple reviewers can be repeated or comma-separated
glab stack sync --reviewer user1 --reviewer user2
glab stack sync --reviewer user1,user2
ベースブランチ(たとえば main)が更新され、プッシュ前にスタック全体をリベースしたい場合は、--update-base を使用してください。
スタックブランチの更新分をプッシュし、マージ済みのエントリを整理する一方で、まだマージリクエストがないスタックレイヤーについては新しいマージリクエストを意図的に作成しない場合は、--skip-mr-creation を使用してください。マージリクエストがクローズされた差分は、スタックに残ります。
ブランチをプッシュしたりマージリクエストを作成したりせずに、スタックをローカルで取得してリベースする場合は、--skip-push を使用してください。これはオフラインモードではありません。glab は引き続きリモートから取得し、GitLab API を呼び出します。後でプッシュする前に、書き換えられたローカル履歴を確認してください。
スタックのマージリクエストに担当者と振り分け用のメタデータを同じ手順で設定して送信する場合は、--assignee、--reviewer、--label を使用してください。
スタックの同期中にプッシュを行う際、glab は Git フックの出力を実行中に stdout/stderr へストリーミングします。自動化のログにはこの出力を残してください。失敗した pre-push フックは、バッファーに保持された出力に隠されることなく、プッシュエラーとして返されます。
glab stack switch は、スタック名を指定せずに実行すると、すべてのスタックから対話形式で選択できるようになりました。非対話型の自動化では、スタック名を指定してください。
glab stack amend は --reword をサポートしており、ファイルをステージングせずに、スタック内のコミットメッセージだけを更新できます。ファイル引数または --all とは併用できません。-m/--message または -d/--description を渡すか、glab でエディターを開いてください。
glab stack amend --reword -m "updated commit message"
glab stack amend と glab stack save は、基盤となる Git コミットでローカルの pre-commit フックと commit-msg フックを回避する --no-verify をサポートします。これは git commit --no-verify と同様に扱い、スキップするフックの内容を把握し、意図的に回避する場合にのみ使用してください。
並べ替えと復旧
glab stack reorder は、現在のスタック順序をエディターで開き、各ブランチを新しい親ブランチにリベースして、GitLab 上で移動したマージリクエストのターゲットを変更します。ブランチはプッシュしませんが、これはドライランではなくリモートへの書き込み操作です。実行する前に、MR のターゲット変更を承認してください。書き換えられた履歴を確認した後、glab stack sync を実行して、リベースしたブランチを強制プッシュしてください。
glab stack reorder
# After resolving a rebase conflict and running git rebase --continue
glab stack reorder --continue
# Restore the original branch order instead
glab stack reorder --abort
並べ替えのリベース処理中に、別の並べ替えを開始しないでください。再試行する前に、競合を解決して処理を続行するか、処理を中止してください。競合とリベースの出力は、自動化ログに保存してください。
ローカルのスタックメタデータを削除する
# Choose a stack interactively
glab stack delete
# Delete a named stack after confirmation
glab stack delete <stack-name>
# Approved non-interactive deletion
glab stack delete <stack-name> --yes
削除されるのは、スタックのローカルな stacked-metadata ディレクトリだけです。ブランチ、コミット、マージリクエストは削除されません。--yes を指定する前にスタック名とリポジトリを確認し、$(git rev-parse --git-common-dir)/stacked/ の下に指定したディレクトリがないことを確認してください。この読み取り専用の確認方法は、通常のチェックアウトとリンクされたワークツリーの両方で使えます。glab stack list に表示されるのは現在のスタックのレイヤーだけなので、別のスタックが削除されたことは確認できません。
サブコマンド
create:新しいスタックを作成してアクティブにします。switch:アクティブなスタックを別のものに切り替えます。infer:Git のリビジョン範囲からアクティブなスタックに差分を追加します。アクティブなスタックがない場合は、スタックを作成します。save:変更を新しい差分として保存します。amend:変更を既存の差分に保存します。list:アクティブなスタック内のすべての差分を一覧表示します。first:最初の差分に移動します。last:最後の差分に移動します。next:次の差分に移動します。prev:前の差分に移動します。move:指定した差分に移動します。reorder:ブランチをプッシュせずに、並べ替えた差分をリベースし、GitLab 上で移動した MR のターゲットを変更します。sync:前述のスキップフラグに従って、スタックをプッシュし、そのマージリクエストを作成または更新します。delete:ブランチ、コミット、MR ではなく、ローカルのスタックメタデータを削除します。
--help の出力全体については、references/commands.md を参照してください。