0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

git worktree で複数のAIコーディングエージェントを並列実行する — 競合ゼロのハンズオン

0
Posted at

TL;DR

  • Claude Code・Codex CLI・OpenCode といった ターミナル常駐型のAIコーディングエージェント を 1 つのリポジトリで複数同時に走らせると、同じ作業ディレクトリを取り合って ファイルの競合・ビルドの破壊・ブランチの混線 が起きる。
  • これを解決する定番が git worktree だ。1 つの .git オブジェクトストアを共有しながら、ブランチごとに独立した作業ディレクトリ を切り出せる。フルクローンと違ってディスクも履歴も二重化しない。
  • 本記事は 標準の git worktree コマンドだけ で 2 つのエージェントを競合なく並列実行する最短ワークフロー(誰でも再現可能)を示し、node_modules / .env のハマりどころ、差分のレビュー&マージ、後片付けまでをハンズオンでまとめる。
  • 最後に、この手順を GUI / CLI で自動化する OSS ツール(parallel-code ほか)も紹介する。ツールに乗る前に 素の git で原理を理解しておく と、どのエージェントでも応用が利く。

なぜ「並列実行」で git worktree なのか

AI コーディングエージェントは、ファイルの読み書き・テスト実行・コミットまでを 作業ディレクトリ上で直接 行う。1 つのタスクなら問題ないが、「機能 A の実装」「バグ B の修正」「リファクタ C」を 同時に別エージェントへ投げたい ときに壁にぶつかる。

素朴に同じディレクトリで 2 つのエージェントを起動すると、次が起きる。

  • エージェント A が編集中のファイルを、エージェント B が別の意図で上書きする
  • 一方が git checkout でブランチを切り替えると、もう一方の作業中ファイルが巻き戻る
  • npm run buildpytest が、互いの未完成の変更を巻き込んで失敗する

対策として「タスクごとにリポジトリをまるごと git clone する」方法もあるが、履歴とオブジェクトを毎回コピーするためディスクを浪費し、依存関係の再インストールも重い。

git worktree は、この問題のために存在する Git 標準機能だ。1 つのリポジトリの .git オブジェクトストアを共有したまま、追加の作業ディレクトリ(ワークツリー)を任意の場所に展開 できる1。各ワークツリーは独立したブランチを HEAD として持つため、エージェントごとに作業を完全分離しつつ、コミット履歴は 1 か所に集約される。Git worktree が「同一コードベースで複数の AI コーディングエージェントを並列実行するための支配的な分離プリミティブ」になっている、と複数の実践記事が指摘している2


ハンズオン1: 2 つのエージェントを競合なく並列起動する

ここでは標準の git worktree コマンドだけを使う。特定ツールに依存しないので、Claude Code でも Codex CLI でも、手元の好きなエージェントで再現できる。

Step 1: ワークツリーを 2 つ切り出す

既存のリポジトリのルートで、タスクごとに 新しいブランチ付きのワークツリー を作る。

# プロジェクトのルートにいる前提(例: ~/work/myapp)
cd ~/work/myapp

# 機能Aのワークツリーを、リポジトリの外の隣接ディレクトリに作る
git worktree add ../myapp-feature-a -b feature-a

# バグBのワークツリーをもう1つ作る
git worktree add ../myapp-fix-b -b fix-b

git worktree add <パス> -b <ブランチ名> は、指定パスに作業ディレクトリを作り、そこで 新規ブランチ をチェックアウトする1-b を付けなければ既存ブランチをそのワークツリーに割り当てる。

ポイント: ワークツリーは リポジトリの外(隣接ディレクトリ) に置くのが安全だ。リポジトリ内に作ると、エージェントが誤って自分のワークツリーを成果物としてコミット対象に含めてしまうことがある。

現在のワークツリー一覧はいつでも確認できる。

git worktree list
/home/user/work/myapp           a1b2c3d [main]
/home/user/work/myapp-feature-a e4f5a6b [feature-a]
/home/user/work/myapp-fix-b     7c8d9e0 [fix-b]

Step 2: それぞれのワークツリーでエージェントを起動する

ターミナルを 2 枚開き、各ワークツリーのディレクトリで別々のエージェントを走らせる。

# ターミナル1
cd ../myapp-feature-a
claude            # 機能Aの実装を依頼

# ターミナル2(別タブ)
cd ../myapp-fix-b
codex             # バグBの修正を依頼

両者は 物理的に別ディレクトリ で動くため、ファイルの取り合いも、ブランチ切り替えによる巻き戻しも発生しない。.git は共有しているので、片方でコミットした内容はもう片方からも git fetch 不要で(同じローカルリポジトリの参照として)見える。


ハンズオン2: node_modules.env のハマりどころ

ここが並列ワークツリー運用の最大のつまずきポイントだ。git worktree add で作られるのは 追跡対象ファイルのチェックアウトだけ で、.gitignore 済みの node_modules/.env は新しいワークツリーには 含まれない

そのままだと各ワークツリーで npm install をやり直すことになり、時間もディスクも食う。実用上は次のどちらかで解決する。

方法A: 依存ディレクトリをシンボリックリンクで共有する

ビルド済み依存を使い回したいときは、本体のワークツリーから node_modules を symlink する。

cd ../myapp-feature-a
ln -s ../myapp/node_modules ./node_modules

ただし、ワークツリー間で 依存バージョンが食い違うタスク を走らせるなら共有は危険だ。その場合は方法 B を採る。

方法B: 環境ファイルだけコピーし、依存は個別インストール

.env のような小さな設定ファイルはコピー、依存は各ワークツリーで個別に入れる。

cd ../myapp-feature-a
cp ../myapp/.env ./.env      # 秘匿情報はコミットしないこと
npm install                  # このワークツリー専用の依存を入れる

parallel-code のような自動化ツールは、この「node_modules などの ignore 済みディレクトリをワークツリーへ symlink する」処理を タスク作成時に自動で行う3。手動運用でも、上の 1〜2 行をワークツリー作成直後の定型作業にしておくと事故が減る。

セキュリティ注意: .env や認証トークンを含むファイルを複数ワークツリーに展開する場合、それらが各ワークツリーの .gitignore でも除外されていることを必ず確認する。ワークツリーを増やすほど、秘匿情報をうっかりコミットする経路も増える。


ハンズオン3: 差分をレビューして「勝ち」だけマージする

並列エージェントの強みは、複数の案を同時に走らせて、良いものだけ採用 できる点にある。各ワークツリーはブランチなので、レビューもマージも通常の Git フローそのままだ。

各ワークツリーの成果を確認する

# 機能Aブランチの変更を、メインのワークツリーから差分表示
cd ~/work/myapp
git diff main..feature-a --stat
git diff main..fix-b --stat

良い変更だけ取り込む

採用すると決めたブランチを main にマージする。

git switch main
git merge --no-ff feature-a      # 機能Aを採用

不採用のワークツリーは、後片付け(次節)でブランチごと破棄すればよい。「ダメな案はワークツリーごと捨て、良い案だけ main に集約する」——これが並列ワークツリー運用の基本リズムだ3


後片付け: ワークツリーとブランチを安全に消す

タスクが終わったらワークツリーを削除する。ディレクトリを rm -rf で消すだけでは Git の管理情報が残るため、専用コマンドを使う。

# ワークツリーを削除(未コミットの変更・未追跡ファイルがあると拒否される=安全)
git worktree remove ../myapp-feature-a

# ディレクトリを手動削除してしまった場合は管理情報を掃除
git worktree prune

# 不採用ブランチを削除
git branch -D fix-b

git worktree remove は、未コミットの変更や未追跡ファイルが残っている「clean でない」ワークツリーを デフォルトでは削除しない ので、うっかり作業を失う事故を防げる1。強制削除したいときだけ --force を付ける。


自動化する: OSS ツール群

素の git worktree で原理を押さえたら、定型作業(ワークツリー作成 → 依存リンク → エージェント起動 → 差分レビュー)を自動化するツールに乗ると速い。代表的な OSS を挙げる。

  • parallel-code(MIT ライセンス): タスクを作ると自動で「main からブランチ作成 → ワークツリー展開 → node_modules 等を symlink → エージェント起動」まで行い、複数タスクの差分を並べてレビュー・マージできる。Claude Code・Codex CLI・Gemini CLI・Copilot CLI・Antigravity CLI に対応する3。デスクトップアプリ(Electron)として動く。
  • その他の CLI / 並列ランナー: agentreeccswarm・各種 worktree ランナーなど、ターミナルから git worktree ベースの並列実行を扱うツールが揃ってきている。最新の一覧は、CLI コーディングエージェントを網羅したキュレーション awesome-cli-coding-agents が参考になる4

ツール選定の指針はシンプルだ。GUI で差分レビューを重視するなら parallel-code 系、ターミナル内で完結させたいなら CLI ランナー系。いずれも内部でやっていることは本記事のハンズオンと同じ git worktree なので、挙動が読めなくなったら素の git コマンドに立ち返ればよい。


ハマりどころまとめ

症状 原因 対策
新ワークツリーでビルドが通らない node_modules は worktree に含まれない symlink(方法A)か個別 npm install(方法B)
エージェントが自分のワークツリーをコミットしようとする ワークツリーをリポジトリ内に作った リポジトリ の隣接ディレクトリに作る
git worktree remove が失敗する 未コミットの変更が残っている(安全装置) 変更を確認・コミットしてから削除。捨てるなら --force
ディレクトリを消したのに worktree list に残る 管理情報が残存 git worktree prune で掃除
ブランチが消せない(-d が拒否) そのブランチがどこかのワークツリーで HEAD になっている 先にワークツリーを remove してから削除
同じブランチを2つのワークツリーで開けない Git の仕様(1 ブランチ = 1 ワークツリー) タスクごとに別ブランチを切る

まとめ

  • 複数の AI コーディングエージェントを 1 リポジトリで並列に走らせるなら、git worktree でタスクごとに独立した作業ディレクトリ を切るのが競合ゼロの王道だ。
  • 手順は「git worktree add で切る → 各ディレクトリでエージェント起動 → 差分をレビューして良い案だけ main にマージ → git worktree remove で片付け」の 4 ステップに集約される。
  • つまずくのはたいてい node_modules / .env まわり。symlink か個別インストールを ワークツリー作成直後の定型作業 にしておけば事故は激減する。
  • 自動化ツール(parallel-code ほか)は便利だが、中身は同じ git worktree素の git で原理を理解しておく ことが、どのエージェント・どのツールでも応用が利く最短経路になる。
  1. git-worktree 公式ドキュメント(コマンド仕様・add / list / remove / prune の挙動)。https://git-scm.com/docs/git-worktree 2 3

  2. "Git worktrees for parallel AI coding agents" — Upsun Developer。git worktree が並列 AI エージェント実行の分離プリミティブとして定着している点の解説。https://developer.upsun.com/posts/ai/git-worktrees-for-parallel-ai-coding-agents

  3. johannesjo/parallel-code(MIT)。タスク作成時にブランチ作成・ワークツリー展開・node_modules 等の symlink・エージェント起動を自動化。対応エージェントの一覧を含む。https://github.com/johannesjo/parallel-code 2 3

  4. bradAGI/awesome-cli-coding-agents — CLI コーディングエージェント・並列ランナー・自律ループのキュレーション(2026-06-15 更新)。https://github.com/bradAGI/awesome-cli-coding-agents

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?