MulmoTerminal の git worktree 隔離 — 並列 AI エージェントがファイルを踏まないようにする仕組み

MulmoTerminal の git worktree 隔離 — 並列 AI エージェントがファイルを踏まないようにする仕組み

課題:2 体のエージェントを同じリポジトリに入れると、変更が片方だけ残る

ログイン画面のバグ修正を 1 体目に、検索機能の追加を 2 体目に頼みます。15 分後、両方とも「できました」と報告してきます。

ところが、1 体目が直したはずの変更が消えています。

これは起こります。普通に起こります。原因を分解すると:

厄介なのは 両方の報告が嘘ではない ことです。1 体目は確かに直しました。確かに git commit もしました。でも、2 体目がブランチを切り替えたときにそのコミットが別のブランチへ行き、作業フォルダの中身が別の内容に差し替わりました。1 体目はそれに気づきません。

AI 並列化を最初に諦める理由の過半数は、たぶんこれです。

既存の回避策とそのコスト

フォルダを増やす(素朴な解)

リポジトリをまるごと 2 回 clone して、別々のフォルダで作業させれば衝突しません。

ただ、

紙を分けるほうが安いはずなのに、分けるコストのほうが高くつきます。

手で git worktree add する

git には worktree という機能があります。1 つのリポジトリに複数の作業フォルダを持たせられて、履歴(.git/objects)は共有します。clone より軽い。

git worktree add ../fix-login -b agent/fix-login main

これで ../fix-login に新しい作業フォルダができます。別ブランチ・別インデックス・別作業ディレクトリ。

ただし、

正しい方向ですが、継続可能なワークフローにはなりません。

MulmoTerminal の解決:起動フォームで名前を 1 つ入れる

MulmoTerminal は git worktree をブラウザ UI から 1 クリックで扱えるようにします。

起動フォーム

git リポジトリをワーキングディレクトリに指定したセルの起動フォームに、OR ISOLATE IN A WORKTREE (GIT REPO) という欄が出ます。

worktree 起動フォーム — WORKING DIRECTORY を入れると下に worktree 欄が出る

タスク名を入れて(たとえば fix-login)、+ New worktree を押す。それだけです。worktree 専用のフォルダができ、そこで Claude Code / Codex が起動します。

既にある worktree はその下に一覧で出るので、続きはそこから開けます。

ブランチの名前と分岐元が、入口で変わる

ここが実用上いちばん効く仕様です。

作り方 ブランチ名 分岐元
起動フォームにタスク名を入れた agent/<タスク名> ローカルのベースブランチ
GitHub Issue ビューの ▶ ボタンから issue/<番号>-<slug> fetch した origin/<ベース>

issue 起点だけがリモートから分岐します。

なぜか。同じリポジトリのクローンを並列で何本も持っていると、git pull されているのはいま作業している 1 本だけで、別の worktree は 1 週間前のまま、ということが起きます。そこからローカルで分岐すると、1 週間前のコードの上で作業を始めてしまう。

issue から始める作業は、これから Pull Request として他人に見せる提案になるので、最新に合わせないとまずい。だから fetch します。fetch に失敗したらローカルから分岐して、worktree の作成自体は成功させます(黙って止まるよりマシ、という設計判断)。

置き場所:リポジトリの中には作らない

worktree はリポジトリの中には作られません。MulmoTerminal の管理下に、専用の階層で作られます。

~/.mulmoterminal/worktrees/<リポジトリ名>-<ハッシュ>/<ブランチ名から接頭辞を落としたもの>/

リポジトリの中に作ると、git status が「知らないフォルダが増えている」と汚れて、気持ち悪いことになります。管理下に置いて、git status を汚さない。

1 worktree に 1 セッションしか起動させない

冒頭の事故を根本から防ぐために、1 つの worktree に 2 体のエージェントを起動することを許していません。

セッション一覧の各行は、状態で意味が変わります。

行の表示 クリックすると
何も出ていない その worktree で最初のセッションを起動
resume すでにある会話を再開
in use 押せません。別のところで開かれている

この制限は「行」ではなく「worktree 自身」に紐づいているので、パスを手で貼っても、よく使うフォルダのボタンから開いても起動しません。最終判断はサーバ側なので、書き方を変えてもすり抜けません。

AI 2 体が同じフォルダに入る、ということがそもそも起こらない状態を作っています。

ちなみに、AI 以外(素のシェル、npm run dev、git の各コマンド)は worktree に入って動かせます。開発サーバを立ち上げたいのはまさに AI が作業している worktree なので、そこは制限しません。

ヘッダーに出る差分バッジ

worktree セルのヘッダーには +2 ●5 のような表示が出ます。

クリックすると差分パネルが開き、エージェントが何を書いたかを一覧できます。見張っていない時間に AI が何をしたかを、数字 1 つで確認できる部分です。

1 行だけ、先に .gitignore に足しておく

worktree には、プロジェクトの設定を引き継ぐために MulmoTerminal 用の小さな JSON が置かれます。

# .gitignore
.mulmoterminal.local.json

これが .gitignore に入っていないと、git から見て未追跡ファイルとして現れます。worktree を閉じるときに「未保存の変更があるので削除を拒否」されて、片付かない worktree が溜まっていきます。1 行足すだけで解消。

使ってみる

既存の MulmoTerminal インストールがあれば、新しい worktree 隔離は追加設定なしに動きます。初めての方は、MulmoTerminal 完全ガイド の「使い方 3 ステップ」から。

動作確認の最小シナリオ

  1. 空いているセルをクリック
  2. WORKING DIRECTORY に適当な git プロジェクトを指定
  3. OR ISOLATE IN A WORKTREE にタスク名を入れて + New worktree
  4. 別の空いているセルで、同じリポジトリ・別のタスク名で同じことをする
  5. 両方のセルで別のファイルを編集させて、両方の変更が残っていれば成功

セルを閉じるときは、worktree を残すか消すかを聞かれます。消すほうを選ぶと、フォルダと agent/ ブランチが一緒に消えます。未保存の変更があるときはその数が出てボタンの文字が変わるので、消す前に何が消えるかが分かります。

まとめ

関連: MulmoTerminal 公式ガイドの worktree ページ / Cursor の代替としての MulmoTerminal / tmux で Claude Code を並列に走らせる限界

この記事をシェア

関連記事

記事一覧に戻る