Zurück zu allen Beiträgen
Veröffentlicht am · von Renaud Deraison

Ein Repo, eine Flotte von Agenten: git worktrees in Bromure Agentic Coding

Lassen Sie zwei Coding-Agenten auf einem Repo laufen, und sie geraten sich am selben Working Tree in die Quere. Git worktrees lösen das mit N unabhängigen Checkouts über einer gemeinsamen Historie. Bromure Agentic Coding macht sie zu einem Ein-Klick-Primitiv: Sie tippen einen Task-Namen und bekommen einen isolierten Branch, einen isolierten Checkout und einen Agenten, der daran arbeitet, jeweils in einem eigenen Tab innerhalb einer wegwerfbaren VM.

Ein Repo, eine Flotte von Agenten: git worktrees in Bromure Agentic Coding

Coding-Agenten arbeiten schnell; Ihr Repository ist das, was sie ausbremst. Bromure Agentic Coding gibt jedem Task seinen eigenen Branch, seinen eigenen Checkout und seinen eigenen Agenten, jeweils in einem eigenen Tab.

Coding-Agenten arbeiten schnell. Ihr Repository ist das, was sie ausbremst. Lassen Sie zwei Agenten auf einem Checkout laufen, und sie geraten sich in die Quere: derselbe Working Tree, dieselben nicht committeten Dateien, derselbe Branch. Ein Agent führt git checkout aus, und die Arbeit des anderen bricht ihm unter den Füßen weg.

Git hat das mit Worktrees gelöst. Bromure Agentic Coding macht den Worktree zu einem Ein-Klick-Primitiv: Jeder Task bekommt seinen eigenen Branch, seinen eigenen Checkout und seinen eigenen Agenten, jeweils in einem eigenen Tab.

Zunächst: Was ist ein git worktree?

Ein git clone gibt Ihnen einen Working Tree: ein Verzeichnis mit ausgecheckten Dateien, ein HEAD, einen Index. Um an zwei Branches gleichzeitig zu arbeiten, jonglieren Sie (git stash, wechseln, arbeiten, zurückwechseln, git stash pop und hoffen) oder Sie legen einen zweiten Clone an, der die gesamte Objektdatenbank kopiert und keine Sicht auf Ihre lokalen Branches teilt.

git worktree add ist die dritte Option. Es hängt einen zusätzlichen Working Tree an das Repository an, das Sie bereits haben:

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

Das gibt Ihnen ein neues Verzeichnis mit einem vollständigen Checkout auf einem neuen Branch, das denselben .git-Objektspeicher wie Ihr Haupt-Checkout nutzt. Jeder Worktree behält seinen eigenen HEAD, Index und nicht committeten Zustand; ein Commit in einem taucht in allen auf. Das Erstellen eines Worktrees kopiert keine Objekte und kostet daher fast nichts. Die Arbeit zurückzumergen ist ein lokales git merge: kein push, kein pull, kein Umweg über das Remote.

Worktrees geben Ihnen N unabhängige Arbeitsverzeichnisse über einer gemeinsamen Historie.

Warum Worktrees zu agentischem Coding passen

Ein autonomer Coding-Agent braucht einen Working Tree, den er auseinandernehmen kann: Dateien editieren, Builds ausführen, halbfertigen Zustand liegen lassen, während er nachdenkt. Das können Sie nicht teilen.

Worktrees bilden ab, wie Sie delegieren:

  • Ein Task, ein Worktree, ein Agent. „Refactoring der Website“ und „den flaky Test reparieren“ bekommen jeweils einen privaten Checkout. Keiner kann die nicht committete Arbeit des anderen zertrampeln, und Ihre auch nicht.
  • Günstig genug, um beiläufig zu sein. Weil ein Worktree keine Historie kopiert, ist es sinnvoll, für einen 20-Minuten-Task einen aufzusetzen. Dafür würden Sie das Repo nicht klonen.
  • An Ort und Stelle mergen. Alle Worktrees teilen sich ein Repository, sodass das Integrieren der fertigen Arbeit eines Agenten ein lokaler Merge eines lokalen Branches ist. Sie reviewen ein Diff, keine Pull-Request-Pipeline.

Claude Code, Codex und der Rest laufen problemlos innerhalb eines Worktrees. Die Reibung ist die Zeremonie: ein Verzeichnis wählen, einen Branch-Namen erfinden, git worktree add, Ihre .env hinüberkopieren (gitignorierte Dateien kommen nicht mit), cd, den Agenten starten, den Task einfügen. Und anschließend alles wieder aufräumen.

Bromure Agentic Coding beseitigt die Zeremonie.

Worktrees in Bromure Agentic Coding

Kurze Auffrischung für alle, die neu dabei sind: Bromure Agentic Coding führt Ihre Coding-Agenten innerhalb wegwerfbarer Ubuntu-VMs auf Apples Virtualization.framework aus. Ein Workspace ist eine VM; er mountet Ihren Projektordner über virtiofs (ohne Kopieren); jeder Tab in einem Workspace ist ein Terminal, das ausführt, was auch immer Sie wollen, meist einen Agenten. Die VM-Grenze lässt einen Agenten im Voll-Autonomie-Modus rm -rf oder curl | bash ausführen, so viel er will, ohne dass Ihr Mac davon berührt wird.

Worktrees fügen eine zweite Isolationsachse hinzu. Die VM isoliert die Maschine; der Worktree isoliert den Working Tree, sodass mehrere Agenten sich einen Workspace und ein Repo teilen können, ohne den Zustand zu teilen.

Ein Workspace-Fenster mit einem geöffneten Repo-Tab in der Quellenliste und einem sichtbaren Terminal
Ein Workspace mit einem geöffneten Repo-Tab in der Quellenliste.

Einen erstellen

Aus jedem Tab, dessen Verzeichnis ein git-Repo ist, entweder:

  • rechtsklicken Sie auf den Tab und wählen New worktree…, oder
  • drücken Sie ⇧⌘G (das Workspaces-Menü listet es ebenfalls auf, neben Merge worktree ⇧⌘M).

Die Shortcuts funktionieren sogar, während die VM Ihre Tastatur besitzt: Der Fenstermanager des Gasts fängt den Tastenakkord ab und reicht ihn an die App zurück.

Das geöffnete Tab-Kontextmenü, das die Aktion New worktree zeigt
Das Tab-Kontextmenü mit „New worktree…“.
Das geöffnete Workspaces-Menü in der Menüleiste, das New worktree ⇧⌘G, Merge worktree ⇧⌘M und Discard worktree zeigt
Das Workspaces-Menü listet dieselben Aktionen mit ihren Shortcuts auf.

Sie bekommen einen kleinen Dialog: einen Task-Namen, eine Tool-Auswahl (claude, codex oder grok, standardmäßig das Tool des Workspaces) und einen optionalen initialen Prompt.

Der New-worktree-Dialog mit einem Task-Namen, der geöffneten Tool-Auswahl und einem ausgefüllten initialen Prompt
Der New-worktree-Dialog, ausgefüllt.

Drücken Sie Create, und innerhalb der VM tut Bromure Folgendes:

  1. schneidet einen Branch wt/<slug> vom aktuellen Commit des Tabs ab (Task-Name „Website refactoring“ → Branch wt/website-refactoring),
  2. checkt ihn unter ~/.bromure/worktrees/<repo>/<slug> aus,
  3. kopiert alle gitignorierten Dateien hinein, die Ihr Repo in .worktreeinclude auflistet (dazu unten mehr),
  4. öffnet einen neuen Tab in diesem Verzeichnis und
  5. startet das von Ihnen gewählte Tool, installiert es zuvor, falls die VM es nicht hat, angestoßen mit Ihrem initialen Prompt.

Ein paar Sekunden nach dem Eintippen eines Task-Namens arbeitet ein Agent auf seinem eigenen Branch daran.

Eine Flotte beobachten

Jeder Worktree ist ein Tab in der Quellenliste des Workspaces, markiert mit einem Branch-Symbol und eingerückt unter dem Tab, aus dem er stammt. Das Icon zeigt, welcher Agent läuft, und ein Statuspunkt zeigt seinen Zustand: pulsierend orange, während er arbeitet, grün, wenn er fertig ist, rot, wenn er Sie braucht. Ein Blick auf die Seitenleiste beantwortet „Wer ist blockiert?“, ohne dass Sie etwas öffnen müssen.

Eine Quellenliste mit mehreren Worktree-Tabs unter dem Repo-Tab, gemischten Statuspunkten und einem verschachtelten Worktree
Mehrere Worktree-Tabs parallel, mit Statuspunkten und einem verschachtelten Worktree.

Worktrees lassen sich verschachteln. Ein Worktree-Tab ist selbst ein git-Checkout, sodass New worktree… auch dort funktioniert. Der Agent, der die Website refaktoriert, kann einen Sub-Agenten hervorbringen, der eine riskante Variante auf einem Kind-Branch von wt/website-refactoring ausprobiert, eine Ebene tiefer eingerückt.

Zurückmergen

Wenn der Statuspunkt eines Worktrees grün wird, rechtsklicken Sie ihn und wählen Merge… (oder ⇧⌘M). Weil Worktrees verschachtelt sind, fragt der Dialog, wohin gemergt werden soll: Das Ziel-Popup listet die Vorfahrenkette auf, vom unmittelbaren Eltern-Branch bis hinauf zum Root-Checkout des Repos, mit einem Warnhinweis-Suffix bei allem, das Zwischenstufen überspringt.

Das Kontextmenü auf einem Worktree-Tab, das die Aktionen Merge und Discard worktree zeigt
Das Kontextmenü eines Worktree-Tabs, mit Merge… und Discard worktree.
Der Merge-Dialog mit geöffnetem Ziel-Popup, das die Vorfahrenkette zeigt
Der Merge-Dialog mit geöffnetem Ziel-Popup.

Der Merge verbirgt nichts. Er läuft in einem neuen Tab im Checkout des Ziels, sodass Sie zusehen können, wie er passiert. Nur committete Arbeit auf dem Branch des Worktrees wird hinübergemergt. Zwei Ergebnisse:

  • Sauber: Der Tab gibt bromure: merged wt/website-refactoring into main. aus und wartet auf Enter.
  • Konflikte: Der Tab gibt bromure: merge conflicts — starting claude to resolve… aus und startet den Agenten direkt dort im konfliktbehafteten Checkout, mit der Anweisung, die Konflikte aufzulösen, sie zu stagen, zusammenzufassen, was er getan hat, und erst zu committen, nachdem Sie es bestätigt haben. Möchten Sie lieber von Hand auflösen und es sich später anders überlegen? Das Kontextmenü des Merge-Tabs behält eine Aktion Have the agent resolve conflicts bereit.
Ein Merge-Tab, der ausgibt, dass der Worktree-Branch in main gemergt wurde, und auf Enter wartet
Ein sauberer Merge: Der Branch landet und der Tab wartet auf Enter.
Ein Merge-Tab nach einem Konflikt, in dem der Agent seine Auflösung zusammenfasst
Ein konfliktbehafteter Merge-Tab, in dem der Agent ihn auflöst.

Das Mergen lässt den Worktree an Ort und Stelle. Vielleicht möchten Sie eine weitere Runde Änderungen oder denselben Branch weiter oben in der Kette mergen. Wenn Sie endgültig fertig sind, rechtsklicken → Discard worktree. Das ist die destruktive Aktion, und das sagt sie auch: Sie entfernt den Checkout, löscht den wt/-Branch und warnt Sie, dass Sie alle nicht gemergten Commits verlieren.

Der Discard-worktree-Bestätigungsdialog mit der Warnung zum Löschen des Branches
Die Discard-worktree-Bestätigung.

Die Details, die es alltagstauglich machen

Gitignorierte Dateien kommen mit, wenn Sie danach fragen. Ein frischer Worktree ist ein sauberer Checkout, sodass Ihre .env, lokale Zertifikate und Tool-Tokens nicht darin sind, und ein Agent, der den Dev-Server nicht starten kann, ist nicht viel wert. Legen Sie eine .worktreeinclude-Datei in das Wurzelverzeichnis Ihres Repos (ein relativer Pfad pro Zeile, dieselbe Konvention, die Claude Code verwendet), und Bromure kopiert diese Dateien aus dem Haupt-Checkout in jeden neuen Worktree.

Ihre nicht committeten Änderungen bleiben Ihre. Bromure schneidet einen Worktree vom aktuellen Commit des Tabs ab, nicht von seinem dirty Zustand. Halbfertige Arbeit im Eltern-Tab bleibt aus dem Checkout des Agenten heraus, und umgekehrt gilt das auch.

Worktrees überstehen einen Neustart. Tabs sind flüchtig, aber die Checkouts und Branches leben auf der Festplatte, und Bromure führt eine kleine Registry pro Repo. Fahren Sie den Workspace herunter, starten Sie ihn eine Woche später, und Ihre Worktree-Tabs erscheinen mit denselben Branches, denselben Labels und den neu gestarteten Agenten wieder.

Es funktioniert über SSH. Sie können jeden Workspace aus der Ferne erreichen, und das Terminal-UI hat volle Worktree-Parität: Ein 🌿 Worktrees…-Menü listet jeden Worktree- und Merge-Tab im Repo auf, und Sie können vom Telefon über SSH genauso erstellen, mergen, auflösen und verwerfen, wie Sie es am Mac täten.

Fehler legen die App nicht lahm. Worktree-Operationen laufen innerhalb des Gasts. Wenn eine fehlschlägt (Verzeichnis verschwunden, kein git-Repo, tmux-Schluckauf), bekommen Sie einen Log-Eintrag und ein nicht blockierendes Sheet auf dem Workspace-Fenster, kein modales Fenster, das alles andere einfriert.

Zwei Arten von Isolation, ein Workflow

Worktrees und VMs lösen verschiedene Hälften desselben Problems. Der Worktree isoliert den Repository-Zustand, sodass parallele Agenten nicht die Arbeit des jeweils anderen beschädigen können. Die VM isoliert alles andere, vom Dateisystem über das Netzwerk bis zu den Zugangsdaten, sodass Sie diese Agenten unbeaufsichtigt laufen lassen können. Bromure Agentic Coding setzt die beiden zusammen: Sie tippen einen Task-Namen, wählen einen Agenten und bekommen einen isolierten Branch, einen isolierten Checkout und eine isolierte Maschine, alles hinter einem Tab.

Der gesamte Ablauf ist drei Tastenanschläge tief: ⇧⌘G zum Delegieren, ein grüner Punkt, wenn es fertig ist, ⇧⌘M zum Mergen. Der Rest ist git, die langweilige und verlässliche Sorte.


Worktrees erfordern Bromure Agentic Coding 4.0.8 oder neuer. Bromure Agentic Coding wird als Teil von Bromure ausgeliefert — laden Sie es unter bromure.io/download herunter. Worktree-Unterstützung braucht außerdem einen Workspace, auf dem der aktuelle In-VM-Agent läuft, starten Sie also ältere Workspaces einmal neu, um sie zu übernehmen.