Retour à tous les articles
Publié le · par Renaud Deraison

Un dépôt, une flotte d'agents : les git worktrees dans Bromure Agentic Coding

Lancez deux agents de code sur un même dépôt et ils se percutent sur le même arbre de travail. Les git worktrees règlent le problème avec N checkouts indépendants sur un historique partagé. Bromure Agentic Coding en fait une primitive en un clic : tapez le nom d'une tâche et obtenez une branche isolée, un checkout isolé et un agent qui travaille dessus, chacun dans son propre onglet au sein d'une VM jetable.

Un dépôt, une flotte d'agents : les git worktrees dans Bromure Agentic Coding

Les agents de code vont vite ; c'est votre dépôt qui les freine. Bromure Agentic Coding donne à chaque tâche sa propre branche, son propre checkout et son propre agent, chacun dans son propre onglet.

Les agents de code vont vite. C'est votre dépôt qui les freine. Lancez deux agents sur un même checkout et ils se percutent : même arbre de travail, mêmes fichiers non commités, même branche. Un agent lance git checkout et le travail de l'autre disparaît sous ses pieds.

Git a résolu ce problème avec les worktrees. Bromure Agentic Coding transforme le worktree en une primitive en un clic : chaque tâche reçoit sa propre branche, son propre checkout et son propre agent, chacun dans son propre onglet.

D'abord, qu'est-ce qu'un git worktree ?

Un git clone vous donne un seul arbre de travail : un répertoire de fichiers checkoutés, un HEAD, un index. Pour travailler sur deux branches à la fois, soit vous jonglez (git stash, changer de branche, travailler, revenir, git stash pop, et croiser les doigts), soit vous faites un second clone, qui copie l'ensemble de la base d'objets et ne partage aucune vue de vos branches locales.

git worktree add est la troisième option. Il rattache un arbre de travail supplémentaire au dépôt que vous avez déjà :

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

Vous obtenez un nouveau répertoire avec un checkout complet sur une nouvelle branche, partageant le même magasin d'objets .git que votre checkout principal. Chaque worktree conserve son propre HEAD, son propre index et son propre état non commité ; un commit dans l'un apparaît dans tous les autres. Créer un worktree ne copie aucun objet, ce qui ne coûte donc presque rien. Réintégrer le travail se fait avec un git merge local : pas de push, pas de pull, pas d'aller-retour avec un dépôt distant.

Les worktrees vous donnent N répertoires de travail indépendants sur un historique partagé.

Pourquoi les worktrees conviennent au développement agentique

Un agent de code autonome a besoin d'un arbre de travail qu'il peut mettre sens dessus dessous : modifier des fichiers, lancer des builds, laisser traîner un état à moitié terminé pendant qu'il réfléchit. Impossible de partager cela.

Les worktrees épousent votre façon de déléguer :

  • Une tâche, un worktree, un agent. « Refactoriser le site » et « corriger le test instable » reçoivent chacun un checkout privé. Aucun des deux ne peut piétiner le travail non commité de l'autre, ni le vôtre.
  • Assez léger pour être décontracté. Comme un worktree ne copie aucun historique, en créer un pour une tâche de 20 minutes a du sens. Vous ne cloneriez pas le dépôt pour ça.
  • Fusionner sur place. Tous les worktrees partagent un seul dépôt, donc intégrer le travail terminé d'un agent revient à une fusion locale d'une branche locale. Vous relisez un diff, pas un pipeline de pull request.

Claude Code, Codex et les autres tournent très bien dans un worktree. La friction, c'est le cérémonial : choisir un répertoire, inventer un nom de branche, git worktree add, copier votre .env (les fichiers gitignorés ne suivent pas), cd, lancer l'agent, coller la tâche. Puis tout nettoyer ensuite.

Bromure Agentic Coding supprime le cérémonial.

Les worktrees dans Bromure Agentic Coding

Petit rappel pour les nouveaux venus : Bromure Agentic Coding exécute vos agents de code dans des VM Ubuntu jetables sur Virtualization.framework d'Apple. Un workspace est une VM ; il monte le dossier de votre projet via virtiofs (sans copie) ; chaque onglet d'un workspace est un terminal qui exécute ce que vous voulez, en général un agent. La frontière de la VM permet à un agent en mode pleine autonomie de lancer rm -rf ou curl | bash autant qu'il veut sans toucher à votre Mac.

Les worktrees ajoutent un second axe d'isolation. La VM isole la machine ; le worktree isole l'arbre de travail, de sorte que plusieurs agents peuvent partager un même workspace et un même dépôt sans partager d'état.

Une fenêtre de workspace avec un onglet de dépôt ouvert dans la liste des sources et un terminal visible
Un workspace avec un onglet de dépôt ouvert dans la liste des sources.

En créer un

Depuis n'importe quel onglet dont le répertoire est un dépôt git, soit :

  • faites un clic droit sur l'onglet et choisissez New worktree…, soit
  • appuyez sur ⇧⌘G (le menu Workspaces le liste aussi, à côté de Merge worktree ⇧⌘M).

Les raccourcis fonctionnent même quand la VM a la main sur votre clavier : le gestionnaire de fenêtres invité capte la combinaison et la renvoie à l'application.

Le menu contextuel de l'onglet ouvert, montrant l'action New worktree
Le menu contextuel de l'onglet avec « New worktree… ».
La barre de menu Workspaces ouverte, montrant New worktree ⇧⌘G, Merge worktree ⇧⌘M et Discard worktree
Le menu Workspaces liste les mêmes actions avec leurs raccourcis.

Vous obtenez une petite boîte de dialogue : un nom de tâche, un sélecteur d'outil (claude, codex ou grok, avec par défaut l'outil du workspace) et un prompt initial optionnel.

La boîte de dialogue New worktree avec un nom de tâche, le sélecteur d'outil ouvert et un prompt initial rempli
La boîte de dialogue New worktree, remplie.

Appuyez sur Create et, à l'intérieur de la VM, Bromure :

  1. crée une branche wt/<slug> à partir du commit courant de l'onglet (nom de tâche « Website refactoring » → branche wt/website-refactoring),
  2. en fait le checkout sous ~/.bromure/worktrees/<repo>/<slug>,
  3. y copie les fichiers gitignorés que votre dépôt liste dans .worktreeinclude (plus de détails ci-dessous),
  4. ouvre un nouvel onglet dans ce répertoire, et
  5. lance l'outil que vous avez choisi, en l'installant d'abord si la VM ne l'a pas, amorcé avec votre prompt initial.

Quelques secondes après avoir tapé un nom de tâche, un agent travaille dessus sur sa propre branche.

Surveiller une flotte

Chaque worktree est un onglet dans la liste des sources du workspace, marqué d'un glyphe de branche et indenté sous l'onglet dont il est issu. L'icône indique quel agent tourne, et une pastille d'état montre son statut : orange pulsant pendant qu'il travaille, verte quand il a terminé, rouge quand il a besoin de vous. Un coup d'œil à la barre latérale répond à la question « qui est bloqué ? » sans rien ouvrir.

Une liste des sources avec plusieurs onglets de worktree sous l'onglet du dépôt, des pastilles d'état variées et un worktree imbriqué
Plusieurs onglets de worktree en parallèle, avec des pastilles d'état et un worktree imbriqué.

Les worktrees s'imbriquent. Un onglet de worktree est lui-même un checkout git, donc New worktree… y fonctionne aussi. L'agent qui refactorise le site peut lancer un sous-agent qui tente une variante risquée sur une branche fille de wt/website-refactoring, indentée d'un niveau supplémentaire.

Réintégrer le travail

Quand la pastille d'état d'un worktree passe au vert, faites un clic droit dessus et choisissez Merge… (ou ⇧⌘M). Comme les worktrees s'imbriquent, la boîte de dialogue demande fusionner : le menu de destination liste la chaîne d'ancêtres, de la branche parente immédiate jusqu'au checkout racine du dépôt, avec un avertissement en suffixe sur tout ce qui saute des intermédiaires.

Le menu contextuel sur un onglet de worktree, montrant les actions Merge et Discard worktree
Le menu contextuel d'un onglet de worktree, avec Merge… et Discard worktree.
La boîte de dialogue Merge avec le menu de destination ouvert, montrant la chaîne d'ancêtres
La boîte de dialogue Merge avec le menu de destination ouvert.

La fusion ne cache rien. Elle s'exécute dans un nouvel onglet dans le checkout de destination, pour que vous la voyiez se dérouler. Seul le travail commité sur la branche du worktree est fusionné. Deux issues :

  • Propre : l'onglet affiche bromure: merged wt/website-refactoring into main. et attend Entrée.
  • Conflits : l'onglet affiche bromure: merge conflicts — starting claude to resolve… et lance l'agent directement dans le checkout en conflit, avec pour instructions de résoudre les conflits, de les stager, de résumer ce qu'il a fait et de ne commiter qu'après votre confirmation. Vous préférez résoudre à la main et changer d'avis plus tard ? Le menu contextuel de l'onglet de fusion conserve une action Have the agent resolve conflicts.
Un onglet de fusion affichant que la branche du worktree a été fusionnée dans main, en attente d'Entrée
Une fusion propre : la branche est intégrée et l'onglet attend Entrée.
Un onglet de fusion après un conflit, l'agent résumant sa résolution
Un onglet de fusion en conflit, l'agent en train de le résoudre.

La fusion laisse le worktree en place. Vous voudrez peut-être une autre série de changements, ou fusionner la même branche plus haut dans la chaîne. Quand vous en avez définitivement terminé, clic droit → Discard worktree. C'est l'action destructrice, et elle le dit : elle supprime le checkout, efface la branche wt/ et vous avertit que vous perdrez tout commit non fusionné.

La boîte de dialogue de confirmation Discard worktree avec l'avertissement de suppression de branche
La confirmation de Discard worktree.

Les détails qui le rendent vivable

Les fichiers gitignorés suivent, si vous le demandez. Un worktree neuf est un checkout propre, donc votre .env, vos certificats locaux et vos jetons d'outils n'y sont pas, et un agent qui ne peut pas démarrer le serveur de dev ne sert pas à grand-chose. Placez un fichier .worktreeinclude à la racine de votre dépôt (un chemin relatif par ligne, la même convention que celle utilisée par Claude Code) et Bromure copie ces fichiers du checkout principal vers chaque nouveau worktree.

Vos modifications non commitées restent les vôtres. Bromure crée un worktree à partir du commit courant de l'onglet, pas de son état non propre. Le travail à moitié terminé dans l'onglet parent reste en dehors du checkout de l'agent, et l'inverse est vrai aussi.

Les worktrees survivent à un redémarrage. Les onglets sont éphémères, mais les checkouts et les branches vivent sur le disque, et Bromure tient un petit registre par dépôt. Éteignez le workspace, rallumez-le une semaine plus tard, et vos onglets de worktree réapparaissent avec les mêmes branches, les mêmes libellés et les agents relancés.

Ça fonctionne en SSH. Vous pouvez atteindre chaque workspace à distance, et l'interface en terminal a une parité complète pour les worktrees : un menu 🌿 Worktrees… liste chaque onglet de worktree et de fusion du dépôt, et vous pouvez créer, fusionner, résoudre et supprimer depuis un téléphone en SSH exactement comme vous le feriez sur le Mac.

Les échecs ne font pas planter l'application. Les opérations sur les worktrees s'exécutent à l'intérieur de l'invité. Si l'une échoue (répertoire disparu, pas un dépôt git, hoquet de tmux), vous obtenez une entrée de journal et une feuille non bloquante sur la fenêtre du workspace, pas une fenêtre modale qui gèle tout le reste.

Deux formes d'isolation, un seul workflow

Les worktrees et les VM résolvent des moitiés différentes du même problème. Le worktree isole l'état du dépôt, pour que des agents parallèles ne puissent pas corrompre le travail des autres. La VM isole tout le reste, du système de fichiers au réseau en passant par les identifiants, pour que vous puissiez laisser ces agents tourner sans surveillance. Bromure Agentic Coding compose les deux : tapez un nom de tâche, choisissez un agent, et obtenez une branche isolée, un checkout isolé et une machine isolée, le tout derrière un seul onglet.

Tout le flux tient en trois frappes : ⇧⌘G pour déléguer, une pastille verte quand c'est fini, ⇧⌘M pour fusionner. Le reste, c'est git, le genre ennuyeux et fiable.


Les worktrees nécessitent Bromure Agentic Coding 4.0.8 ou une version ultérieure. Bromure Agentic Coding est livré avec Bromure — téléchargez-le sur bromure.io/download. La prise en charge des worktrees nécessite aussi un workspace exécutant l'agent in-VM actuel, alors redémarrez une fois les anciens workspaces pour en bénéficier.