何のためのものか
git worktree ごとにセッションを分離し、並行して走るセッションのファイル編集が衝突しないようにする仕組み。git リポジトリが前提。
触る
claude --worktree <name>(短縮形-w)で起動する- 既定の作成先はリポジトリルートの
.claude/worktrees/<name>/、ブランチ名はworktree-<name> - 名前を省略すると
bright-running-foxのような名前が生成される
worktree は新しい checkout なので、依存関係のインストールなど開発環境の初期化が必要。 対話実行には workspace trust が要る(未承認だとエラー終了する)。
セッション中に Claude へ依頼すると EnterWorktree ツールで作られる。
入れる
- PR から分岐する。
--worktreeに#付きの PR 番号か GitHub の pull request URL を渡すと、originからpull/<number>/headを fetch して.claude/worktrees/pr-<number>に作る(シェルが#を解釈しないよう引用符で囲む) - 必要なローカルファイルを持ち込む。 プロジェクトルートに
.worktreeincludeを置くと、gitignore されているファイルのうちパターンに一致するものが作成時にコピーされる - 終了時の後片付けを意識する。 クリーンなら(名前なしセッションでは)自動削除、作業が残っていれば保持か削除かを尋ねられる。削除するとディレクトリ・ブランチとその中の作業がすべて消える
- base branch を決める。
worktree.baseRefの既定"fresh"はリモートのリポジトリ既定ブランチから分岐する。手元のブランチ状態を引き継ぎたいなら"head"
効かせる
- 分離は強制される。 worktree に分離されたセッションでは、main checkout に到達するツール呼び出しがブロックされる。ファイル編集だけでなく、作業ディレクトリが main checkout に解決される Bash コマンドや、
git -C/--git-dir/GIT_DIRなどで git を main checkout に向けるコマンドも止まる。分離セッションから起動した subagent にも適用される - subagent 単位で分けるなら
isolation: worktree。 一時的な worktree が割り当てられ、変更なしで終了すると自動削除される - resume すると worktree へ戻る。 対話でも
-pの--continue/--resumeでも同じ。ただし--fork-sessionした場合は起動したディレクトリで始まり、元の worktree には手を付けない
落とし穴
-pの非対話実行は後片付けされない。 終了時のプロンプトが無いため、git worktree removeで自分で消す-pは workspace trust のチェックも飛ばす。claude -p --worktreeはそのまま進む- 同じ名前を再利用すると、条件次第で既定ブランチへリセットされる。 未コミット変更も未追跡ファイルも無く、Claude Code が作ったブランチのままで、独自のコミットが無い(または PR がマージ済み)場合。それ以外は古い tip で再オープンされる
- 定期スイープは自分が
--worktreeで作った worktree を消さない。 消えるのは subagent とバックグラウンドセッション用のもので、cleanupPeriodDaysより古く、かつ作業が残っていないものだけ - リポジトリの
.claude/worktrees/の外へ入るときは必ず承認を求められる。permission rule でも「don't ask again」でも抑止できない