Git Worktree
ユーザーが場所、起点、終了方法を把握していない worktree は作成しません。ユーザーが要求しない worktree は削除しません。
このスキルは、worktree を作成する他のスキル(例:superpowers:using-git-worktrees)よりも、場所、名前、承認の3点において優先されます。他のスキルの残りのフローは引き続き有効です。
エージェント別ツール
| アクション | Claude Code | Codex |
|---|---|---|
| 作成 | git worktree add + EnterWorktree(path: ...) でセッションを移動 | git worktree add し、worktree 内で git -C/workdir を使用 |
| 隔離されたサブエージェント | Agent と isolation: "worktree"(.claude/worktrees/ に作成) | 該当なし |
| 退出 | ExitWorktree(action: "keep") | 元のディレクトリに戻る |
| レポート | pwsh -NoProfile -File "<このスキルのフォルダ>/scripts/worktrees-report.ps1" | 同左 |
<このスキルのフォルダ> は、この SKILL.md が置かれているディレクトリです。スクリプトには PowerShell 7+(pwsh)が必要です。
1. 作成前
- 現在すでに worktree 内にいるか確認します(
git rev-parse --git-dirがgit rev-parse --git-common-dirと異なり、かつサブモジュール内ではない場合)。すでに worktree 内にいる場合は、ユーザーが要求しない限り新たに作成しません。 - 関連するリポジトリでレポートを実行し、結果を手順4のために保持します:
pwsh -NoProfile -File "<このスキルのフォルダ>/scripts/worktrees-report.ps1" -Path "<repo1>;<repo2>" - 以下のデフォルトでプランを組み立て、worktree ごとに1ブロックで提示します:
リポジトリにサブモジュール(Worktree 作成プラン - リポジトリ: C:\repos\loja - ベースブランチ: origin/main @ 3f2a9c1(git fetch 実行済み) - 新しいブランチ: claude/feat-login-google - 名前: feat-login-google - 絶対パス: C:\repos\loja\.worktrees\feat-login-google - 相対パス: .worktrees\feat-login-google - 作成コマンド: git -C "C:\repos\loja" worktree add "C:\repos\loja\.worktrees\feat-login-google" -b claude/feat-login-google origin/main - 削除コマンド: git -C "C:\repos\loja" worktree remove "C:\repos\loja\.worktrees\feat-login-google" git -C "C:\repos\loja" branch -d claude/feat-login-google.gitmodules)がある場合は、削除に--forceが必要になる理由をプラン内で説明します。 - その直後に、これらのリポジトリで既に開かれている worktree のレポート表を表示します(Worktree、サイズ、ブランチ、削除時の損失)。何もない場合は、その旨を1行で表示します。
- ユーザーの明示的な OK を待ちます。 その後でのみ作成します。Claude Code では、プラグインのフックがコマンド実行時に追加の確認を求めます。Codex では、
codex/rules/git-worktree.rulesがgit worktree addに対して同様の処理を行います。
複数のサブエージェントを並行して実行する場合は、すべての worktree を含む単一のプランを提示し、1回の OK を求めます。
デフォルト設定
- 場所: 両エージェントとも
<リポジトリルート>/.worktrees/<名前>。例外は、隔離"worktree"を使用する Claude Code のサブエージェントで、常に.claude/worktrees/に作成します。この場合は、プラン内でそのパスを明記します。 - フォルダを無視する設定: 作成前に
git -C <repo> check-ignore -q .worktrees/xを実行します。フォルダが無視されていない場合は、.worktrees/をリポジトリのinfo/excludeファイル(git -C <repo> rev-parse --git-path info/excludeで取得)に追加します。このファイルはローカル専用でコミットされません。実行したことをユーザーに伝えます。 - 名前:
<タイプ>-<短い説明>、kebab-case、最大40文字。例:feat-login-google、fix-timeout-pagamento。 - 新しいブランチ:
<エージェント>/<名前>、つまりclaude/feat-login-googleまたはcodex/feat-login-google。リポジトリに独自のブランチ規則(フック、CONTRIBUTING、履歴)がある場合は、それに従い、どの規則を使ったかを明示します。 - ベース: デフォルトでは、ユーザーがメインチェックアウトで現在いるブランチ。タスクがそれとは独立している場合は
origin/<デフォルトブランチ>を使用します。事前にgit fetchを実行し、ベースの短いハッシュを表示します。
2. Worktree レポート
ユーザーが worktree の一覧表示やクリーンアップを要求した場合、および上記手順1.2で使用します。
pwsh -NoProfile -File "<このスキルのフォルダ>/scripts/worktrees-report.ps1" [-Path "<ルートまたはリポジトリ>;..."] [-Json] [-SkipSize] [-Depth 6]
-Pathがない場合、スクリプトはGIT_WORKTREE_ROOTS変数を使用し、それもない場合はカレントディレクトリを使用します。ユーザーの指示(CLAUDE.md、AGENTS.md)でリポジトリのルートフォルダが定義されている場合は、そのフォルダを渡します。- このスクリプトは読み取り専用です。リポジトリ、サブモジュール、リポジトリフォルダ外の孤立した worktree を検出します。
-SkipSizeは、ユーザーが高速性を求める場合に使用します。-Jsonは、詳細情報(進んでいる/遅れているコミット、リモートステータス、マージ、最終コミット日、判定、削除コマンド)が必要な場合に使用します。
スクリプトが出力する表を、以下の4列で、この順序で表示します:
| 列 | 内容 |
|---|---|
| Worktree | 絶対パス |
| サイズ | ディスク容量 |
| ブランチ | Worktree のブランチ、または (detached @ <ハッシュ>) |
| 削除時の損失 | なし、または削除すると失われるもののリスト:コミットされていないファイル、そこにしか存在しないコミット、git で無視されているファイル(例:.env)。ビルドフォルダ(node_modules、bin、obj...)は対象外 |
列を追加しないでください。詳細は表の下に、判断に役立つ場合のみ記載します。
損失とみなされるもの:
- 変更または新規でコミットされていないファイル。
- どのリモートにも、カレントブランチにも、デフォルトブランチにも存在しないコミット。
- ビルド関連以外の無視されているファイル。
- 初期化されたサブモジュール内のコミットされていないファイルと、そこにしか存在しないコミット。
- ロックされた worktree(
git worktree lock)は(ロック中...)と表示され、確認なしでは削除されません。 - フォルダがすでに存在しない場合、列には
なし(フォルダは既に存在しません...)と表示されます。git worktree pruneで解決します。 - 制限事項:スカッシュマージやリベースは検出されないため、それらのコミットは損失として表示されます。ユーザーが PR はすでにマージされたと言った場合、リモートで確認します。
レポートの最後に、損失がない worktree を削除した場合に解放される容量を表示します。
削除コマンド
ユーザーが削除、または削除コマンドの表示を要求した場合は、-Json の ComandosRemocao フィールドを使用します。コマンドを正確に、順序通り、1つのブロックにまとめてコピーします。コマンドを暗記して記述しないでください。このフィールドは、以下の3つの落とし穴をすでに解決しています:
- 無視されているファイル: 失われる無視ファイル(例:
.env、.superpowers/)がある場合、最初のコマンドでそれらを~/worktree-backup/<repo>/<worktree>にコピーします。コピーは削除の前に行う必要があります。削除後はコピー元が存在しません。 - サブモジュール: worktree に初期化されたサブモジュールがある場合、削除コマンドには
--forceが付きます。これは、git がgit worktree removeをそれなしでは拒否するためです。このコマンドを提示する前に、「削除時の損失」列でサブモジュールに損失がないこと、またはユーザーが損失を受け入れたことを確認します。 - ブランチ: 最後に
git branch -dでブランチを削除します。これはブランチがすでに統合されている場合のみ成功します。
自分で実行する場合は、コマンドを1つずつ実行し、最初のエラーで停止します。
3. タスク終了時
- Worktree での作業がすでに統合されている(マージされた、またはリモートにプッシュされた)場合は、準備された削除コマンドを提案します。
- 統合されていない場合は、不足している作業(コミット、プッシュ、PR)を伝えます。
- Claude Code では、
ExitWorktree(action: "keep")で退出し、削除はユーザーの OK を得た後にのみ git コマンドで行います。ExitWorktree(action: "remove")は、同一セッション内でEnterWorktreeが作成した worktree に対してのみ機能します。
変更不可のルール
- ユーザーが要求しない限り、worktree やブランチを決して削除しないでください。1つずつ削除し、最後に再度レポートを実行します。
git branch -DやExitWorktree(discard_changes: true)を、その worktree に対する明示的な確認なしに使用しないでください。git worktree remove --forceは、worktree にサブモジュールがある場合(「削除コマンド」参照)で、かつユーザーが失うものを確認した場合のみ使用します。- プランを提示し、OK を得る前に worktree を作成しないでください。