Claude Code worktreeの使い方—並列開発でセッション衝突を防ぐ設計

Claude Code worktreeの使い方—並列開発でセッション衝突を防ぐ設計 | mohablog

レビュー待ちの間に別ブランチで修正を走らせたくて、Claude Codeのセッションを2つ起動したら、同じ作業ディレクトリでファイルが上書きし合ってハマったことがあります。同じフォルダで並列動作させるとチャット側の認識と実ファイルがズレるので、ブランチを切り替えた瞬間にもう片方のClaudeが壊れる、というのが典型的な詰まり方です。

この衝突を素直に解決してくれるのがGit worktreeで、Claude Code 2026.02以降は--worktreeフラグとしてネイティブ対応されています。2つのClaudeを物理的に別ディレクトリで動かせるので、機能開発と緊急修正を同じリポジトリで並行させても干渉しません。ここでは、使い始めから運用で詰まるところまでまとめておきます。

検証環境はmacOS Sonoma、git 2.45、claude-code 2026.04系を想定しています。

目次

Claude Code –worktreeが解決する課題

まずは何を解決してくれる機能なのかを押さえておきます。ブランチ切り替え運用で何が詰まるのかを整理すると、--worktreeが「単なる便利機能」ではなくセッション設計の中心になる理由が見えてきます。

そもそもgit worktreeとは

Git worktreeは、1つのリポジトリに対して複数の作業ディレクトリを同時に持つための機能です。.gitディレクトリ(オブジェクトDB)は共有しながら、チェックアウトしているブランチと作業ファイルだけ別物にできます。

cd ~/projects/myapp
git worktree add ../myapp-hotfix hotfix/login-bug
git worktree list
/Users/moha/projects/myapp         a1b2c3d [main]
/Users/moha/projects/myapp-hotfix  d4e5f6a [hotfix/login-bug]

1行目がメインで作業しているディレクトリ、2行目が追加したworktreeです。同じリポジトリ履歴を共有しているので、片方でpushしたコミットはもう片方でgit fetchすれば普通に見えます。

従来のブランチ切り替えで起きる問題

worktreeを使わずにClaudeを並列で動かそうとすると、次のような問題が起きます。

  • ファイル状態の不整合:片方のセッションでgit checkout other-branchした瞬間、もう片方のClaudeが読んでいたファイルが別物に差し替わる
  • TODO/計画の迷子:Claudeは作業ディレクトリを起点にコンテキストを組み立てるので、ブランチ切り替えで「編集したはずの関数が消える」ように見える
  • ビルド成果物の汚染node_modules__pycache__がブランチ間で混ざって、どちらのClaudeも同じ依存で動いていると勘違いする

つまり、Claudeの問題というより1つの作業ディレクトリを2人のエージェントが共有している構図そのものが無理筋です。

ネイティブサポートで何が変わったか

従来はgit worktree addしてcdしてからclaudeを起動、という手順でしたが、ネイティブ対応後はclaude --worktree <name>だけで済みます。worktreeの作成・ブランチの作成・移動・セッション開始がワンコマンドに畳まれる、というのが実質的な変化です。

–worktreeフラグの基本的な使い方

実際にコマンドラインから起動するパターンをまとめます。ここはパターンが限られているので、一度覚えれば迷わなくなります。

新しいworktreeでセッションを開く

未作成のブランチ名を渡すと、新しいworktreeが作成されてその中でClaudeが起動します。

claude --worktree feature-search-filter
Creating worktree at ../myapp-feature-search-filter
Checked out new branch 'feature-search-filter'
Starting Claude Code session in worktree...

短縮形は-wで、同じ意味です。worktreeの配置場所はデフォルトだと親ディレクトリ側に作られます。プロジェクトディレクトリの横にmyapp-xxxが並ぶイメージです。

既存のworktreeを再利用する

既にworktreeを持っているブランチ名を渡した場合、新しく作らずその中でセッションを開きます。

claude -w hotfix/login-bug
Attaching to existing worktree at ../myapp-hotfix-login-bug
Starting Claude Code session...

昨日作った作業を翌日再開する場合、このコマンド1つで戻れるので、ブランチ名とworktree名を揃えておくと管理が楽です。

セッション内から作成するケース

フラグを使わずに、会話の中で「work in a worktree for this task」と頼む方法もあります。Claudeが裏でgit worktree addを実行して、新しいディレクトリへセッションを移してくれる挙動です。

ただしいつも同じ命名ルールになるとは限らない点には注意が必要です。明示的にブランチ名やディレクトリ名を含めて依頼した方が、後でworktree listしたときに迷子になりません。

2つのClaudeを同時に走らせる実践パターン

worktreeがあっても、複数セッションを同時に走らせるUIはClaude Code側にはないので、ターミナル側で工夫します。よく使われるのは次の3パターンです。

tmuxでペイン分割するパターン

tmuxを使うと、左右のペインでそれぞれClaudeを走らせつつ、一画面で両方の出力を追えます。

tmux new-session -s claude-parallel
# Ctrl-b % で左右分割
# 左のペイン
claude -w feature-search-filter
# 右のペインに移ってから
claude -w hotfix/login-bug
[左ペイン] claude @ myapp-feature-search-filter
[右ペイン] claude @ myapp-hotfix-login-bug

個人的にはこの構成が一番回しやすいです。片方がコードを書いている間にもう片方へ別タスクを投げておいて、どちらかが詰まったら支援する、という流れが取れます。

VSCodeで複数ワークスペースを開くパターン

VSCodeなら、worktreeごとに別ウィンドウを開いて統合ターミナルからClaudeを起動すれば、エディタの差分表示と連動できます。

  • worktreeごとに独立した拡張機能設定(.vscode/settings.json)が使える
  • 差分レビューも片方ずつウィンドウを切り替えるだけで済む
  • ターミナルのカレントディレクトリを意識しなくてよい

シェルを切り替えるだけの最小構成

tmuxもVSCodeも使わない場合、ターミナルタブを2つ開いて片方ずつClaudeを起動するだけで十分です。手元で一番軽い構成ですが、両方の出力を同時に見たい場面だと疲れるので、作業量が増えたらtmuxに寄せるのが無難です。

運用で詰まりやすいポイント

起動までは簡単ですが、日常運用では別の落とし穴があります。使い込むほど効いてくるのはここの設計です。

不要なworktreeが溜まる問題

ブランチ単位で作ると、気づくとmyapp-*が10個以上並んでいる、という状況になります。マージ済みブランチのworktreeはgit worktree removeで消しておきます。

git worktree list
git worktree remove ../myapp-feature-search-filter
git worktree prune
/Users/moha/projects/myapp         a1b2c3d [main]
/Users/moha/projects/myapp-hotfix  d4e5f6a [hotfix/login-bug]

pruneは、ディレクトリ自体は消してしまったけれど管理レコードだけ残っている「死んだworktree」を掃除するコマンドです。月イチくらいで回しておくとリストが綺麗になります。

CLAUDE.mdやローカル設定の引き継ぎ

worktreeは作業ツリーを分けるだけなので、リポジトリにコミットされているCLAUDE.md.claude/はそのまま引き継がれます。ただし、ローカルだけで持っている.envsettings.local.jsonはコピーされないので注意が必要です。

アンチパターンとしてよくあるのが、手でコピーを繰り返して片方だけ最新になる状態です。

# NG: 毎回手でコピーする運用
cp .env ../myapp-feature-xxx/.env
cp .env ../myapp-hotfix-yyy/.env

これだと.envを更新したときに全worktreeへ反映するのを忘れます。シンボリックリンクに切り替えておくと、メインのファイルを編集するだけで全worktreeに反映されます。

# OK: シンボリックリンクで共有する
cd ../myapp-feature-xxx
ln -s ../myapp/.env .env
ln -s ../myapp/.claude/settings.local.json .claude/settings.local.json
lrwxr-xr-x  1 moha  staff   16  4 23 10:12 .env -> ../myapp/.env

CLAUDE.mdの設計ルール自体を深掘りする話は「Claude Code Plan Modeの使い方」にも書いているので、セットで読むとセッション設計のイメージが固まると思います。

node_modulesやvenvの扱い

依存関係ディレクトリは、worktreeごとに独立して持つか共有するかで方針が分かれます。

方式メリットデメリット
worktreeごとに独立依存バージョンが安全に分離できるディスク消費が倍々で増える
シンボリックリンクで共有ディスク節約、インストール不要依存バージョンがズレるとビルドが壊れる
pnpmのワークスペース機能を使うnode_modulesを効率的に共有できるツール側の制約を受ける

Pythonのvenvなら、worktreeごとに作るのが無難です。ライブラリバージョン違いでブランチを切るケースがあるので、共有すると事故ります。Nodeならpnpmを使っていれば基本的に問題になりません。

コストと並列度の設計

worktreeで並列実行が気軽になる反面、コスト面の設計は別途考える必要があります。このあたりは「Claude Codeのサブエージェント並列実行—コスト管理と設計のハマりどころ」とも共通する話です。

API課金の観点

Claude Codeのセッションは、それぞれ独立してコンテキストを持つので、2つ走らせれば実質的にトークン消費も倍になります。ただし、1セッションが長期化して圧縮(コンパクション)が走るケースと比べると、短い2セッションの方がトータルのコストは意外と少ないこともあります。

  • 1本のセッションで20万トークンを往復するより、10万トークンのセッション2本の方が安く済む場合がある
  • 片方を終了してから次を始める運用だと、worktreeの恩恵は薄い
  • 並列させる分、レビュー負荷は上がるので純粋な生産性は1.5倍〜1.8倍が現実的なライン

現実的な並列度の目安

色々試した結論として、個人開発なら同時2セッションが限界だと感じています。3本以上はレビューと切り替えのコストで頭が追いつきません。

3本以上走らせたい場合は、タスクの性質を分けると回しやすくなります。

  • 1本目:メインの機能開発(集中して見る)
  • 2本目:テスト追加や軽いリファクタ(裏で走らせておいて結果だけ確認)
  • 3本目:ドキュメント生成や定型作業(半自動で実行)

全部を能動的に監視するのではなく、「こちらは放っておく」前提の役割分担を組むのがコツです。

まとめ

今回の要点を整理しておきます。

  • Claude Code 2026.02以降は--worktree-w)フラグをネイティブサポート。ブランチ切り替えによるセッション衝突を根本的に解消できる
  • 使い方はclaude -w <ブランチ名>の1コマンド。新規でも既存worktreeでも同じ形で使える
  • 並列実行はtmuxかVSCodeの複数ウィンドウと組み合わせるのが実用的
  • 運用面では.envのシンボリックリンク共有、不要worktreeの定期掃除、venv/node_modulesの方針決めが必須
  • 現実的な並列度は2セッション程度。3本以上は役割を分けて監視コストを下げる設計にする

並列開発は道具が揃うほど「やればやるほど速くなる」と誤解しがちですが、実際には人間側の注意力がボトルネックです。worktreeはその中でも、少なくともファイルレベルの事故を減らしてくれるので、先に土台として入れておく価値があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次