Claude Code で開発するとき、「Claude にタスクを振る → 出力を待つ → レビューする」を直列でやってると、待ち時間がとにかくダルい。
そこで git worktree と Conductor を 組み合わせて、複数の Claude Code エージェントを同時並行で走らせる ワークフローを運用している。開発から検証まで並列で回せるようになって、 1人で複数タスクを進めている感覚がかなり変わった。
この記事は、その運用で得た知見の実践メモ。git-flow を前提にしている。
worktree を活用すると、こうなる。
feature/* ブランチを同時に複数走らせられる
(例: feature/login-form と feature/refactor-api を並行)develop での作業を中断せず、hotfix/* や差し込みレビューに
対応できるこの記事は git-flow 前提。主要ブランチはこう。
| ブランチ | 役割 | 派生元 | マージ先 |
|---|---|---|---|
main | 本番リリース版 | - | - |
develop | 開発統合 | main | main(release 経由) |
feature/* | 機能開発 | develop | develop |
release/* | リリース準備 | develop | main と develop |
hotfix/* | 本番緊急修正 | main | main と develop |
並列開発では、ほとんどの worktree が feature/*(develop から派生)
になる。hotfix/* は別系統で、develop の通常作業を止めずに main
から派生させて並行で進める使い方が特に効く。
git worktree は、1つのリポジトリから複数の作業ディレクトリを 派生させられる Git の標準機能。
通常 git switch feature-a でブランチを切り替えると、作業ディレクトリの
中身がそのブランチの状態にまるごと差し替わる。同時に2つのブランチの
内容を触ることはできない。
worktree を使うと、feature-a と feature-b をそれぞれ別ディレクトリに
チェックアウトできて、両方を同時に開いて編集・ビルド・実行できる。
.git 自体は共有されているので、リモートからの fetch やコミット履歴は
一本にまとまる。
ファイル編集の混線が起きない。Claude エージェントを2体走らせるとき、 同じディレクトリで作業させると同じファイルを同時に書き換えてしまう。 worktree なら物理的にディレクトリが別なので、両方が安心して書き込める。
ビルド成果物が壊れない。git switch で行き来すると node_modules
やビルドキャッシュが片方のブランチに合わせて更新されてしまう。
worktree なら各ディレクトリが独立した成果物を持てる。
「ちょっと別ブランチ見たい」のコストが激減する。stash する必要も、 コミットしてから戻る必要もない。隣のディレクトリに移動するだけ。
# 通常はこう書くが、Conductor を使えば直接叩くことはほぼない
# feature ブランチは develop から派生
git worktree add -b feature/login-form ../repo-feature-login-form develop
# hotfix ブランチは main から派生
git worktree add -b hotfix/critical-bug ../repo-hotfix-critical-bug main
git worktree list
git worktree remove ../repo-feature-login-form
┌────────────────────────────────────────────────────┐
│ Conductor が worktree を自動作成 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ feature/ │ │ feature/ │ │ hotfix/ │ │
│ │ A │ │ B │ │ X │ │
│ │ Claude │ │ Claude │ │ Claude │ │
│ │ :3001 │ │ :3002 │ │ :3003 │ │
│ │ db-a │ │ db-b │ │ db-c │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │
│ └── develop ──┘ └── main へ ── │
└────────────────────────────────────────────────────┘
ポイントは「worktree ごとに、開発サーバーのポートと Docker コンテナ (DB 等)を分ける」こと。これで同じリポジトリの別ブランチを、 見た目上は別アプリのように同時起動できて、ブラウザでも DB クライアントでも 両方同時に検証できる。
| 役割 | ツール |
|---|---|
| worktree 管理・ライフサイクル自動化 | Conductor(Scripts / Actions) |
| エージェント | Claude Code |
| 環境分離 | Docker / docker compose(DB・ミドルウェア) |
| ポート・コンテナ名の分離 | .env(worktree ごとに手動設定) |
| 定型コマンド束 | Makefile(make up / make down 等) |
Conductor が worktree のライフサイクル(作成・実行・後始末)を一手に
引き受けてくれるので、git worktree add を直接叩くことはほぼない。
worktree ごとに .env を切って、こんな感じで上書きする。
PORT=3001)COMPOSE_PROJECT_NAME=app-wt-a)DB_PORT=5433)DATABASE_URL=postgresql://...:5433/...)COMPOSE_PROJECT_NAME を変えると、コンテナ名・ネットワーク名・
ボリューム名がすべてそのプレフィックスで切られるので、別 worktree の DB と
取り違える事故が起きにくくなる。
採番はゆるく予約しておくと楽。
セットアップ・起動・後始末は Makefile にまとめておくと、Conductor の Scripts から呼ぶときも、手動で叩くときも同じインターフェースになって 楽。
setup: ## 依存インストール + コンテナ作成
npm ci
docker compose build
up: ## DB + 開発サーバー起動
docker compose up -d
npm run dev
down: ## 開発サーバー停止 + コンテナ削除
docker compose down -v
Scripts は worktree のライフサイクルイベントに紐づくフック。 Makefile のターゲットを呼ぶだけで、worktree の準備と片付けが全部 自動化される。
| タイミング | やること | 中身(例) |
|---|---|---|
| worktree 作成時 | コンテナ作成・依存インストール・開発サーバー起動 | make setup && make up |
| アーカイブ時 | コンテナ削除・開発サーバー停止 | make down |
これで .env だけ自分で書けば、あとは Conductor 側で勝手にコンテナが
立ち上がる/消える状態にできる。「アーカイブ時のコンテナ削除を忘れて
孤児ボリュームが溜まる」事故もなくなる。
Actions は worktree に対してワンクリックで走らせる手動アクション。 チーム特有の運用ルールを Claude に毎回口頭で説明しなくて済むようにできる。
実際に仕込んでいる例:
これらを Actions として登録しておくと、誰がやっても同じ観点で レビューと PR が出てくるので、品質が揃う。
ここが本記事の中心。
worktree が並んでて Claude が複数走ってても、ある1つのタスクに対して 「要件を理解し、Claude に的確に指示し、出力をレビューする」プロセスは 1本ずつ真剣にやる必要がある。並列だからといって雑になってよい部分は ない。
並列にすると 自分の脳の切り替えコスト は確実に上がる。タスク A の 文脈を頭から退避させて、タスク B の文脈をロードし直す、を何度も 繰り返すので、直列のときよりも疲れる。
並列にするほどレビューの責任は重くなる。Claude が出してくる差分の量は 直列のときの N 倍になるので、自分が責任を持って見られる本数を超えない こと。
develop から feature/xxx を派生main から hotfix/xxx を派生develop から release/x.y.z を派生.env を編集してポート/コンテナ名を採番タスクの粒度は「ファイルが被らない」単位で切る。worktree が物理的に
分かれていても、最終的にマージするのは同じ develop(hotfix の場合は
main と develop の両方)なので、コンフリクトする量が少ない切り方を
選ぶ。
ポートと DB を分けているので、ブラウザのタブで localhost:3001 と
localhost:3002 を同時に開いて、両方の worktree の成果を同時に触れる。
レビュー前のセルフチェックでは、
を、ブランチ切り替えなしでやれる。
Conductor の Actions に登録した Review / PR 作成プロンプトを呼んで、 独自観点でのセルフレビュー → テンプレに沿った PR 作成までを Claude に 任せる。
feature/* → develop への PRhotfix/* → main への PR(マージ後、develop にも反映する
PR を別途)release/* → main への PR(マージ後、develop にも反映)develop または main)を pulldocker compose up が「ポートが使われている」で失敗、または
別 worktree の DB に接続してしまってデータが混ざる.env のポート採番がかぶっている/COMPOSE_PROJECT_NAME を
変え忘れた.env を上書きするのを
習慣化。採番表を README に置くnpm install すると時間とディスクが厳しいdevelop にマージしたあとで他の worktree が壊れるdevelop を取り込んだ時点で
必ずローカル DB を作り直すhotfix/* と release/* は main と develop の両方にマージする
必要があるが、片方を忘れがちCLAUDE.md か docs/ に書いておき、全 worktree が
同じベースから派生していれば自然に共有される。worktree 限定の指示は
その worktree の Claude にだけ伝えるfeature-login-form のように)develop(hotfix なら main)がいつ時点か」を意識する。後発の
PR は最新の取り込み先を反映してから見る方が事故が少ない# Conductor で worktree 作成 → Setup Script が自動実行
# make setup && make up(コンテナ作成、依存インストール、開発サーバー起動)
# .env を編集してポートとプロジェクト名を採番(必要なら再起動)
# 作業終了時
# Conductor で worktree アーカイブ → Archive Script が自動実行
# make down(コンテナ削除、開発サーバー停止)
setup:
npm ci
docker compose build
up:
docker compose up -d
npm run dev
down:
docker compose down -v
並列 worktree でいったん「複数タスクを同時に進められる」状態には なった。次は 各 worktree の Claude を Loop 処理で回す ことを 試したい。
イメージはこんな感じ。
検討中の論点:
並列で PR が量産されるようになると、人間のレビュー帯域がボトルネックに なる。なのでレビューの分担自体を見直したい。
これが回り始めると、worktree × Claude の並列度を上げてもレビューが 追いつく状態にできるはず。Conductor の Actions に「AI レビュー観点」を 仕込んで PR コメントとして自動投下する、みたいな運用が候補。
worktree × Claude Code × Conductor の組み合わせで、1人で複数タスクを 同時に進められる感覚はかなり変わった。一方で「タスク1本ずつにかける 真剣さは変えない」「最初は2タスクから」という原則は守らないと、雑な レビューや迷子の worktree で逆に効率が落ちる。
同じような構成で運用している人がいたら、ハマりどころや工夫を 教えてもらえると嬉しい。