複数AIエージェントを衝突なく並列運用するworktree分離術


AIエージェントを使ったコーディングが当たり前になりつつある。Claude CodeやCursor、GitHub Copilotなど、選択肢も増えた。そうなると次に出てくる欲求は「複数のエージェントを同時に走らせたい」だ。

機能Aの実装はエージェント1に、バグ修正はエージェント2に、リファクタリングはエージェント3に——そんな並列運用ができれば、待ち時間がなくなって効率は跳ね上がる。

ただ、同じリポジトリで複数のAIが同時にファイルを触ると、ほぼ確実に衝突が起きる。この問題を解決する仕組みがgit worktreeだ。

git worktreeとは何か

git worktreeは、ひとつのリポジトリに対して複数の作業ディレクトリを紐づける機能だ。通常、リポジトリをクローンすると作業ディレクトリは1つだけ。別のブランチを触りたければgit checkoutでブランチを切り替える必要がある。

worktreeを使うと、同じリポジトリから複数の作業ディレクトリを作れる。それぞれのディレクトリで別々のブランチをチェックアウトした状態になるので、ブランチを切り替える手間がなくなる。

Git履歴やオブジェクトデータベースは共有されるが、HEAD(今どのコミットを見ているか)やindex(ステージング領域)は各worktreeで独立している。つまり、ファイルの編集状態が互いに干渉しない。

複数リポジトリをクローンする方法もあるが、500MBのリポジトリを5つクローンすれば2.5GB消費する。worktreeなら履歴を共有するので、ディスク効率がいい。git fetchも一度で全worktreeに反映される。

基本的な使い方

worktreeの作成は1行で済む。

# feature-aブランチ用のworktreeを作成
git worktree add ../project-feature-a feature-a

# バグ修正用のworktreeを作成(ブランチも新規作成)
git worktree add -b bugfix-123 ../project-bugfix-123

これで../project-feature-aというディレクトリができ、feature-aブランチがチェックアウトされた状態になる。あとはそのディレクトリでエージェントを起動すればいい。

作業が終わったら削除する。

git worktree remove ../project-feature-a

注意点として、removeは作業ディレクトリがクリーンな状態(未コミットの変更がない)でないと実行できない。強制削除したい場合は--forceオプションを使うが、未保存の作業が消えるので慎重に。

手動でディレクトリを消してしまった場合、Gitの管理情報だけが残ることがある。そんなときは以下で掃除できる。

git worktree prune

AIエージェント並列運用での注意点

worktreeを作れば、コードの衝突は防げる。ただ、それだけでは「衝突ゼロ」にはならない。環境面での衝突が待っている。

ポート衝突

開発サーバーを起動するとき、デフォルトポートは大抵決まっている。3000番、5432番、8080番あたりはよく被る。worktree Aでサーバーを起動した状態で、worktree Bでも起動しようとすると「ポートが使用中です」とエラーになる。

対策はいくつかある。

  1. worktreeごとに.envを用意してポート番号を変える
  2. エージェントに「このworktreeでは3001番を使え」と指示する
  3. ポート自動割り当て機能があるツールを使う

フロントエンドのdev serverなら、Viteは--portオプションで指定できるし、空いているポートを自動で探してくれる設定もある。

依存関係のインストール

新しいworktreeを作っても、node_modulesや仮想環境は引き継がれない。各worktreeでnpm installpip install -r requirements.txtを実行する必要がある。

Claude Codeの公式ドキュメントでも、この点は明示されている。JavaScriptプロジェクトならnpm install、Pythonなら仮想環境の作成など、worktreeごとに初期化が必要になりうると。

面倒に感じるかもしれないが、逆に言えば依存関係のバージョンを揃えるチャンスでもある。「worktree Aでは動くのにBでは動かない」という事態を防ぐために、初期化手順をスクリプト化しておくといい。

データベースやDockerの競合

ローカルでPostgreSQLやMySQLを動かしている場合、複数worktreeから同じDBに接続すると、テストデータの競合が起きることがある。エージェントAがテストデータを投入した直後にエージェントBがテーブルをクリアする、といった事故だ。

Docker Composeで環境を構築している場合も、同じコンテナ名を使っていると衝突する。

対策としては:

  • worktreeごとに別のDBスキーマやデータベース名を使う
  • Docker Composeのプロジェクト名をworktreeごとに変える
  • テスト用のインメモリDBを使う(SQLiteなど)

常時接続できないworktreeを守る

ネットワークドライブや外付けHDDにworktreeを置いている場合、PCに接続していないときにgit worktree pruneが走ると「存在しないworktree」として削除されてしまう可能性がある。

これを防ぐのがlockコマンドだ。

git worktree lock ../external-drive-worktree --reason "外付けHDDに配置"

ロックしたworktreeはpruneの対象から外れる。解除はgit worktree unlockで。

向いている人、向いていない人

worktreeによるAIエージェント並列運用は、以下のような人に向いている。

  • 複数の独立したタスクを同時進行したい人
  • エージェントの待ち時間を減らしたい人
  • ブランチ切り替えの手間を省きたい人

一方、向いていないケースもある。

  • タスク同士が密に依存している場合(結局マージで衝突する)
  • ローカル環境のリソースが限られている場合(メモリやCPUを食う)
  • チームでworktreeの運用ルールを統一できない場合

個人的には、「1日に3つ以上の独立したタスクを並行して進める」ような状況で効果を発揮すると思っている。1つか2つなら、ブランチ切り替えで十分かもしれない。

まとめ

git worktreeは、複数AIエージェントを同時に走らせるための土台として有効だ。コードの衝突は避けられる。

ただし、ポート、依存関係、データベースといった環境面の衝突は別途対策が必要になる。worktreeを作って終わりではなく、「各worktreeで何を共有し、何を分離するか」を設計しておくことが、本当の意味での「衝突ゼロ運用」につながる。


参考リンク