すべての投稿に戻る
公開日 · 著者 Renaud Deraison

1つのリポジトリに、エージェントの艦隊を: Bromure Agentic Coding における git worktree

2つのコーディングエージェントを1つのリポジトリに対して走らせると、同じ作業ツリーの上で衝突してしまいます。git worktree は、共有された1つの履歴の上に N 個の独立したチェックアウトを持たせることでこれを解決します。Bromure Agentic Coding はこれをワンクリックのプリミティブに変えました。タスク名を入力するだけで、独立したブランチ、独立したチェックアウト、そしてそこで作業するエージェントが手に入り、それぞれが使い捨ての VM の中の自分専用のタブで動きます。

1つのリポジトリに、エージェントの艦隊を: Bromure Agentic Coding における git worktree

コーディングエージェントは速く動きます。足を引っ張っているのはあなたのリポジトリです。Bromure Agentic Coding は、すべてのタスクに専用のブランチ、専用のチェックアウト、専用の エージェントを与え、それぞれを自分専用のタブに配置します。

コーディングエージェントは速く動きます。足を引っ張っているのはあなたのリポジトリです。2つのエージェントを1つのチェックアウトに対して走らせると、両者は衝突します。同じ作業ツリー、同じコミットされていないファイル、同じブランチ。片方のエージェントが git checkout を実行すると、もう片方の作業が足元から消えてしまうのです。

git はこれを worktree で解決しました。Bromure Agentic Coding は worktree をワンクリックのプリミティブに変えます。すべてのタスクに専用のブランチ、専用のチェックアウト、専用のエージェントが与えられ、それぞれが自分専用のタブで動きます。

まず、git worktree とは何か?

git clone は1つの作業ツリーを与えます。チェックアウトされたファイルが入った1つのディレクトリ、1つの HEAD、1つのインデックスです。2つのブランチで同時に作業するには、やりくりする(git stash して、切り替えて、作業して、戻して、git stash pop して、うまくいくよう祈る)か、2つ目のクローンを作るしかありません。後者はオブジェクトデータベース全体をコピーし、ローカルブランチのビューは共有されません。

git worktree add は3つ目の選択肢です。すでに手元にあるリポジトリに追加の作業ツリーを取り付けます。

git worktree add -b fix-login ../fix-login HEAD

これにより、新しいブランチ上に完全なチェックアウトを持った新しいディレクトリができ、メインのチェックアウトと同じ .git オブジェクトストアを共有します。各 worktree は自分専用の HEAD、インデックス、コミットされていない状態を保ちます。片方でのコミットはすべての worktree に現れます。worktree の作成はオブジェクトを一切コピーしないので、コストはほとんどありません。作業をマージして戻すのはローカルの git merge です。push も pull もなく、リモートとの往復もありません。

worktree は、共有された1つの履歴の上に N 個の独立した作業ディレクトリを与えてくれます。

なぜ worktree はエージェント型コーディングに向いているのか

自律的なコーディングエージェントは、思う存分いじり倒せる作業ツリーを必要とします。ファイルを編集し、ビルドを走らせ、考えている間に中途半端な状態を散らかしたままにする。それを共有することはできません。

worktree は、あなたが委任するやり方にそのまま対応します。

  • 1つのタスク、1つの worktree、1つのエージェント。 「ウェブサイトをリファクタリングする」と「不安定なテストを直す」は、それぞれプライベートなチェックアウトを得ます。どちらも他方のコミットされていない作業を踏み荒らすことはできませんし、あなたの作業も同様です。
  • 気軽に使えるほど安い。 worktree は履歴を一切コピーしないので、20分のタスクのために1つ立ち上げるのは理にかなっています。そんなことのためにリポジトリをクローンしたりはしないでしょう。
  • その場でマージ。 すべての worktree は1つのリポジトリを共有するので、エージェントが仕上げた作業を統合するのはローカルブランチのローカルマージです。プルリクエストのパイプラインではなく、diff をレビューします。

Claude Code、Codex、その他のツールは worktree の中で問題なく動きます。摩擦になるのは儀式のほうです。ディレクトリを選び、ブランチ名を考え出し、git worktree add して、.env をコピーし(gitignore されたファイルは付いてきません)、cd して、エージェントを起動し、タスクを貼り付ける。そして後片付けをする。

Bromure Agentic Coding はこの儀式を取り除きます。

Bromure Agentic Coding における worktree

初めての方への簡単なおさらい: Bromure Agentic Coding は、あなたのコーディングエージェントを Apple の Virtualization.framework 上の使い捨て Ubuntu VM の中で走らせます。workspace(ワークスペース)は1つの VM です。プロジェクトフォルダを virtiofs でマウントし(コピーはしません)、ワークスペース内の各tab(タブ)は好きなものを走らせる端末で、たいていはエージェントです。VM の境界のおかげで、完全自律モードのエージェントが rm -rfcurl | bash をいくら実行しても、あなたの Mac には触れません。

worktree は2つ目の分離の軸を加えます。VM はマシンを分離し、worktree は作業ツリーを分離します。これにより、複数のエージェントが状態を共有することなく、1つのワークスペースと1つのリポジトリを共有できます。

ソースリストにリポジトリタブが開かれ、端末が見えているワークスペースのウィンドウ
ソースリストにリポジトリタブを開いたワークスペース。

作成する

ディレクトリが git リポジトリであるどのタブからでも、次のいずれかを行います。

  • タブを右クリックして New worktree… を選ぶ、または
  • ⇧⌘G を押す(Workspaces メニューにも、Merge worktree ⇧⌘M の隣に載っています)。

このショートカットは、VM がキーボードを握っているときでも機能します。ゲストのウィンドウマネージャがこのコード(組み合わせ)を捕まえて、アプリに引き渡してくれるのです。

タブのコンテキストメニューが開き、New worktree アクションが表示されている様子
「New worktree…」が表示されたタブのコンテキストメニュー。
Workspaces メニューバーが開き、New worktree ⇧⌘G、Merge worktree ⇧⌘M、Discard worktree が表示されている様子
Workspaces メニューには、同じアクションがショートカット付きで並びます。

小さなダイアログが出ます。タスク名、ツールピッカー(claudecodexgrok。既定はワークスペースのツール)、そして省略可能な初期プロンプトです。

タスク名が入り、ツールピッカーが開き、初期プロンプトが入力された New worktree ダイアログ
入力済みの New worktree ダイアログ。

Create を押すと、VM の中で Bromure は次を行います。

  1. タブの現在のコミットからブランチ wt/<slug> を切り出す(タスク名「Website refactoring」→ ブランチ wt/website-refactoring)、
  2. それを ~/.bromure/worktrees/<repo>/<slug> の下にチェックアウトする、
  3. あなたのリポジトリが .worktreeinclude に列挙した gitignore 済みファイルをコピーして入れる(詳しくは後述)、
  4. そのディレクトリで新しいタブを開く、そして
  5. 選んだツールを起動する。VM に無ければ先にインストールし、初期プロンプトを渡した状態で始める。

タスク名を入力してから数秒後には、エージェントが専用のブランチ上でそれに取り組んでいます。

艦隊を見守る

各 worktree はワークスペースのソースリスト内の1つのタブで、ブランチの記号が付き、元になったタブの下にインデントされます。アイコンはどのエージェントが動いているかを示し、ステータスドットがその状態を示します。作業中はオレンジで脈打ち、完了すると緑、あなたを必要とするときは赤になります。サイドバーを一目見れば、何も開かずに「誰が詰まっているか?」がわかります。

リポジトリタブの下に複数の worktree タブが並び、さまざまなステータスドットと、ネストされた worktree が1つあるソースリスト
並行して動く複数の worktree タブ。ステータスドットと、ネストされた worktree が1つ。

worktree はネストできます。worktree タブそのものが git のチェックアウトなので、そこでも New worktree… が使えます。ウェブサイトをリファクタリングしているエージェントは、wt/website-refactoring の子ブランチ上でリスキーな別案を試すサブエージェントを生成でき、それは1段深くインデントされます。

マージして戻す

worktree のステータスドットが緑になったら、右クリックして Merge…(または ⇧⌘M)を選びます。worktree はネストするので、ダイアログはどこへマージするかを尋ねます。宛先のポップアップには、直接の親ブランチからリポジトリのルートチェックアウトまで、先祖の連なりが並び、途中を飛ばすものには警告が付きます。

worktree タブのコンテキストメニューで、Merge と Discard worktree のアクションが表示されている様子
worktree タブのコンテキストメニュー。Merge… と Discard worktree が表示されている。
宛先のポップアップが開き、先祖の連なりが表示された Merge ダイアログ
宛先のポップアップを開いた Merge ダイアログ。

マージは何も隠しません。宛先のチェックアウト内の新しいタブで実行されるので、進行を見届けられます。マージされて渡るのは、worktree のブランチ上のコミット済みの作業だけです。結果は2通り。

  • クリーン: タブに bromure: merged wt/website-refactoring into main. と表示され、Enter を待ちます。
  • コンフリクト: タブに bromure: merge conflicts — starting claude to resolve… と表示され、コンフリクトの起きたチェックアウトのその場でエージェントが起動します。コンフリクトを解決し、ステージし、行ったことをまとめ、あなたの確認を得てからのみコミットするよう指示が与えられます。手作業で解決したいけれど後で気が変わるかもしれない? マージタブのコンテキストメニューには Have the agent resolve conflicts アクションが常に用意されています。
worktree のブランチが main にマージされたと表示し、Enter を待つマージタブ
クリーンなマージ: ブランチが着地し、タブは Enter を待つ。
コンフリクト後のマージタブで、エージェントが自分の解決内容をまとめている様子
コンフリクトしたマージタブで、エージェントがそれを解決している様子。

マージしても worktree はその場に残ります。もう一巡の変更をしたいかもしれませんし、同じブランチを連なりのもっと上へマージしたいかもしれません。完全に終わったら、右クリック → Discard worktree。これは破壊的なもので、そのことを明言します。チェックアウトを削除し、wt/ ブランチを消し、マージされていないコミットを失うことになると警告します。

ブランチ削除の警告が表示された Discard worktree の確認ダイアログ
Discard worktree の確認。

実用に耐えさせるための細部

gitignore されたファイルも、頼めば付いてきます。 新しい worktree はクリーンなチェックアウトなので、.env、ローカル証明書、ツールのトークンなどは入っておらず、開発サーバーを起動できないエージェントはあまり役に立ちません。リポジトリのルートに .worktreeinclude ファイルを置けば(1行に1つの相対パス。Claude Code が使うのと同じ規約)、Bromure がそれらのファイルをメインのチェックアウトからすべての新しい worktree にコピーします。

あなたのコミットしていない変更は、あなたのものです。 Bromure は worktree をタブの現在のコミットから切り出すのであって、汚れた状態からではありません。親タブの中途半端な作業はエージェントのチェックアウトに入り込みませんし、その逆も同様です。

worktree は再起動を生き延びます。 タブははかないものですが、チェックアウトとブランチはディスク上に残り、Bromure はリポジトリごとの小さなレジストリを保持します。ワークスペースをシャットダウンし、1週間後に起動しても、worktree タブは同じブランチ、同じラベルで再び現れ、エージェントも再起動されます。

SSH 越しでも動きます。 すべてのワークスペースにリモートで到達でき、端末 UI は worktree に関して完全に同等です。🌿 Worktrees… メニューがリポジトリ内のすべての worktree とマージタブを列挙し、スマートフォンから SSH 越しに、Mac 上とまったく同じように作成、マージ、解決、破棄ができます。

失敗がアプリを落とすことはありません。 worktree の操作はゲストの中で走ります。1つが失敗しても(ディレクトリが消えた、git リポジトリでない、tmux の不具合など)、他のすべてを凍りつかせるモーダルではなく、ログのエントリとワークスペースウィンドウ上のブロックしないシートが表示されます。

2種類の分離、1つのワークフロー

worktree と VM は、同じ問題の別々の半分を解決します。worktree はリポジトリの状態を分離するので、並行するエージェントが互いの作業を壊すことはありません。VM はそれ以外のすべてを、ファイルシステムからネットワーク、認証情報まで分離するので、それらのエージェントを監督なしで走らせることができます。Bromure Agentic Coding はこの2つを組み合わせます。タスク名を入力し、エージェントを選ぶと、独立したブランチ、独立したチェックアウト、独立したマシンが、すべて1つのタブの裏に手に入ります。

フロー全体はキー3つ分の深さです。⇧⌘G で委任し、終わると緑のドット、⇧⌘M でマージ。あとは git、退屈で信頼できるやつです。


worktree には Bromure Agentic Coding 4.0.8 以降が必要です。Bromure Agentic Coding は Bromure の一部として提供されます。bromure.io/download からダウンロードしてください。worktree サポートには最新の VM 内エージェントが動いているワークスペースも必要なので、古いワークスペースは一度再起動して取り込んでください。