Claude Code と git worktree で複数タスクを並列に進める手順
claude --worktree で隔離された並列セッションを起動する手順を解説します。.worktreeinclude による .env の持ち込み、メインのチェックアウトへの操作をブロックする隔離チェック、終了時の後片付けまでまとめます。
目次
Claude Code は 1 セッションで 1 つのタスクを進めるのが基本です。「機能 A の実装」と「バグ B の修正」を同時に頼むと、同じ作業ディレクトリ上で変更が混ざり、差分の切り分けが難しくなります。
そこで使うのが git worktree です。同じリポジトリの履歴とリモートを共有しながら、ファイルとブランチだけを別に持つ作業ディレクトリです。Claude Code には worktree を作ってその中でセッションを開始する起動オプションがあるため、git のコマンドを自分で打つ必要はほとんどありません。
KEY POINT
この記事で分かること
--worktreeでの隔離セッションの起動と、Git 管理外のファイルの持ち込み- メインのチェックアウトへの操作をブロックする隔離チェックの内容
- 終了時の後片付けと、worktree が残る条件
worktree でセッションを起動する
--worktree(短縮形 -w)に名前を渡します。
claude --worktree feature-auth
既定では、リポジトリのルート直下の .claude/worktrees/<名前>/ に、worktree-<名前> という名前の新しいブランチで作られます。別のターミナルで違う名前を指定すれば、2 つ目の隔離セッションが始まります。名前を省略すると bright-running-fox のような名前が生成されます。
前提が 2 つあります。worktree は既存のコミットから作られるため、リポジトリに少なくとも 1 つコミットが必要です(1 つもない場合は Failed to resolve base branch "HEAD": git rev-parse failed で失敗します)。また対話実行ではワークスペースの信頼が必要で、そのディレクトリで claude を一度も実行していない場合は、先に claude を起動して信頼ダイアログを承認します。claude -p --worktree は信頼チェックを飛ばします。
# worktree の中身がメインのチェックアウトで未追跡ファイルとして見えないようにする
echo '.claude/worktrees/' >> .gitignore
対話中に「worktree で作業して」と頼むこともでき、その場合は EnterWorktree ツールで作られます。.claude/worktrees/ の外のパスに入る場合は必ず承認を求められます。セッションの作業ディレクトリ・書き込み権限・CLAUDE.md などのプロジェクト設定がその場所に移るためで、権限ルールや「今後は確認しない」ではこの確認を抑制できません。
各 worktree の環境を用意する
worktree は新規のチェックアウトなので、開発環境は入っていません。Claude に依存関係をインストールさせるか、.claude/worktrees/ 配下のディレクトリで自分でセットアップを実行します。
.env のような Git 管理外のファイルは、プロジェクトルートに .worktreeinclude を置くと自動でコピーされます。記法は .gitignore と同じで、パターンに一致しかつ Git で無視されているファイルだけがコピーされるため、追跡済みのファイルが二重になることはありません。
.env
.env.local
config/secrets.json
これは Claude Code が git で作るすべての worktree に適用されます(サブエージェントの worktree、デスクトップアプリの並列セッションを含む)。
競合しやすいポイントと対策
| 競合 | 症状 | 対策 |
|---|---|---|
| 開発サーバーのポート | 2 つ目の npm run dev が起動失敗 | PORT=3001 npm run dev のように worktree ごとにポートを変える |
| データベース | 両方が同じローカル DB を変更 | DB 名を環境変数で分ける、または片方は DB を使わない作業にする |
.env | Git 管理外なので新しい worktree に存在しない | 元の worktree からコピーし、ポートや DB 名を書き換える |
| ビルドキャッシュ | 共有キャッシュを使うツールで不整合 | .next、dist などが worktree ごとに独立していることを確認する |
| Claude のセッション履歴 | --resume で別 worktree の履歴が出る | セッションは作業ディレクトリ単位で保存されるため、正しいディレクトリで再開する |
同じブランチを 2 つの worktree でチェックアウトできない
git は 1 つのブランチを複数の worktree で同時にチェックアウトすることを拒否します。--worktree が毎回 worktree-<名前> という新しいブランチを作るのはこのためです。
隔離チェックが実際にブロックするもの
セッションが worktree にいる間、Claude Code は次の 4 種類のツール呼び出しをブロックします。--worktree で起動した場合、EnterWorktree で入った場合、worktree セッションを再開した場合のいずれでも同じで、そのセッションが起動するサブエージェントにも適用されます。
| チェック | ブロックされるもの |
|---|---|
| ファイル編集 | メインのチェックアウト内のパスを対象にした Edit・Write・NotebookEdit |
| コマンドの作業ディレクトリ | 作業ディレクトリがメインのチェックアウトに解決される、または外にあると確認できない Bash・PowerShell・Monitor コマンド |
| git のリダイレクト | git -C、--git-dir、GIT_DIR、GIT_WORK_TREE、先に cd するなどで git をメインのチェックアウトに向けるコマンド |
| コマンドの形 | コマンド文から「実行する git が worktree 内に留まる」と確認できない場合。コマンド名が実行時に決まる、構文を解析できない、${!name} のような展開を含むなど。このチェックは無効化できません |
これらが見るのは、編集対象のパス、コマンドの実行ディレクトリ、コマンドの文字列です。シェルコマンドが実際にどのファイルへ書くかは追跡しないため、cp やシェルのリダイレクトでメインのチェックアウトへ書き込む操作はこれらでは拒否されず、通常の permissions とサンドボックスの設定に従います。
メインのチェックアウトと共有されるもの
| 共有されるもの | 内容 |
|---|---|
.git ディレクトリ | worktree 内の git コマンドはメインリポジトリの .git に書き込み、サンドボックスもその書き込みを許可するため、サンドボックス有効でも git commit が動く |
| プロジェクトスコープのプラグイン | メインのチェックアウトから入れたプラグインが同じリポジトリの worktree でも読み込まれる(v2.1.200 以降) |
| 権限の承認 | Bash コマンドで「今後も許可」を選ぶとメインのチェックアウトの .claude/settings.local.json に保存され、どこでも効き、worktree を削除しても残る(v2.1.211 以降) |
| 未追跡のスキル・エージェント・コマンド | worktree 側に .claude/skills がない場合(自分の .claude/skills が Git 管理外のときなど)、メインのチェックアウトのプロジェクトスキルが読み込まれる。.claude/agents と .claude/commands も同様 |
新しい worktree はリモートの既定ブランチから分岐します。設定の worktree.baseRef を "head" にすると、ローカルの現在の HEAD から分岐し、push していないコミットも引き継げます。ブランチ名を指定することはできないため、特定の既存ブランチから始めたい場合は git で直接 worktree を作ります。
後片付け
対話セッションを終了するとき、Claude は worktree を削除すると失われる作業(変更・未追跡ファイル、サブモジュール内の未コミット作業、新しいコミット)の有無を確認します。
- きれいな場合: 名前なしのセッションでは worktree とブランチが自動で削除されます。名前付きのセッションでは、残せるように先に確認されます。
- 作業が残っている場合: 残すか削除するかを確認されます。残すとディレクトリとブランチが保持され、あとで戻るための
claude --worktree <名前> --resumeコマンドが終了時に表示されます。削除するとディレクトリ・ブランチ・その中の作業がすべて消えます。 - 状態を確認できない場合: 自動削除せず確認し、何を確認できなかったかを示します。
-p の非対話実行には終了時の確認がないため、worktree は作成時に取ったロックとともに残ります。削除は git worktree remove で、未コミットの変更があれば --force を付けます。ロックされていて git が拒否する場合は、先に git worktree unlock を実行します。
並列作業の設計のコツ
- タスクを独立させる: 同じファイルを両方が触るタスクを並列にすると、マージ時に衝突します。先に Plan Mode で影響範囲を洗い出してから分けます。
- 2〜3 並列まで: 人間が確認できる量には限りがあります。並列数を増やしても、レビューが追いつかなければ品質は下がります。
- サブエージェントとの使い分け: 1 つのタスク内での並列(調査を複数の観点から同時に行うなど)は、worktree より サブエージェント が向いています。サブエージェントの編集も隔離したい場合は、定義の frontmatter に
isolation: worktreeを書きます。
まとめ
claude --worktree <名前>で.claude/worktrees/配下に worktree を作り、その中でセッションが始まる- worktree は新規のチェックアウト。依存関係はその場で入れ、
.envは.worktreeincludeで持ち込む - 隔離チェックは編集・作業ディレクトリ・git のリダイレクトを止めるが、単純な
cpは止めない .git、プロジェクトのプラグイン、権限の承認はメインのチェックアウトと共有される- 対話セッションの終了時に、作業が残っている worktree の扱いを確認される。
-p実行では残る
よくある質問
- git worktree と git clone を複数回するのは何が違いますか?
- worktree は 1 つのリポジトリ(.git)を共有したまま作業ディレクトリだけを増やします。clone を繰り返すより容量が小さく、ブランチやスタッシュも共有されます。
- 各 worktree で npm install は必要ですか?
- 必要です。worktree は新規のチェックアウトなので node_modules はありません。Claude に入れさせるか、.claude/worktrees/ 配下のディレクトリで自分でセットアップを実行します。.env のような Git 管理外のファイルは .worktreeinclude で自動コピーできます。
- Claude Code に worktree を作らせることはできますか?
- --worktree(短縮形 -w)に名前を渡すと、Claude Code が .claude/worktrees/<名前>/ に worktree-<名前> ブランチで worktree を作り、その中でセッションを開始します。対話中に「worktree で作業して」と頼むと EnterWorktree ツールで作ることもできます。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。