Git worktree vs rama para agentes de IA en paralelo: cuál usar

Si quieres varios agentes de código de IA trabajando a la vez, la pregunta de fondo es de git: ¿cómo consigue cada agente un sitio donde trabajar sin sobrescribir a los demás? Hay tres respuestas honestas. Un solo árbol de trabajo y vas cambiando de rama. Varios clones completos del repo. O git worktrees. Solo una de ellas deja de verdad que N agentes se ejecuten a la vez de forma limpia, y no es la que la mayoría prueba primero. En esta guía comparo cambiar de rama, varios clones y los worktrees para agentes en paralelo en concreto, con una nota honesta sobre cuándo basta con una rama, y cómo CodeAgentSwarm usa los worktrees por debajo. Para la explicación desde cero de qué es un worktree y por qué importa el aislamiento, lee primero la guía de git worktrees para agentes de IA. Esta página es la comparativa.

La verdadera pregunta con agentes en paralelo

Varios agentes de código de IA ejecutándose en paralelo en un workspace de CodeAgentSwarm, cada uno en su propia rama en su propio git worktree
Un enjambre de agentes en paralelo. El montaje de debajo decide si de verdad se ejecutan a la vez o van por turnos peleándose por una sola copia de trabajo.

Un solo agente de IA en una sola carpeta nunca tiene este problema. Edita archivos, hace commit, sigue. El problema es enteramente ejecutar más de uno a la vez sobre el mismo repositorio. Cada agente necesita un sitio donde hacer cambios que los demás no estén cambiando también.

Hay tres formas de darles ese espacio, y no son iguales para el trabajo en paralelo. Cambiar de rama comparte un solo árbol de trabajo. Varios clones dan a cada agente una copia completa del repo. Los git worktrees dan a cada agente su propio árbol de trabajo sobre un mismo repositorio compartido. Vamos con ellas en ese orden.

Opción A: un árbol de trabajo, cambiar de rama

El instinto de mucha gente son las ramas. Haz una rama por tarea, y deja que cada agente trabaje en la suya. Es la idea correcta para mantener el trabajo separado en el historial, pero se rompe en cuanto quieres que los agentes se ejecuten a la vez.

La razón es que una rama no es un sitio donde trabajar, es una etiqueta sobre un commit. Sigues teniendo un solo árbol de trabajo, un solo conjunto de archivos en disco. git checkout otra-rama intercambia los archivos de esa única carpeta para que coincidan con la otra rama. Dos agentes en esa carpeta siguen compartiendo exactamente los mismos archivos, por muchas ramas que existan.

bash
# Un árbol de trabajo. checkout intercambia sus archivos en el sitio.
git checkout -b agente-auth   # la carpeta ahora en agente-auth
# ...otro agente...
git checkout -b agente-tests  # la MISMA carpeta, ahora en agente-tests

Así que si dos agentes intentan trabajar a la vez, pasa una de dos cosas. O van por turnos, haciendo checkout, avanzando un poco, commiteando o guardando en stash, y volviendo a hacer checkout, que no es nada en paralelo, es una copia de trabajo compartida a ratos. O los dos editan la carpeta mientras está en una rama y vuelves al choque original, con la confusión añadida de ramas que ya no coinciden con lo que hay en disco.

Las ramas organizan el historial, no te dan workspaces en paralelo. No puedes tener la misma carpeta checkouteada en dos ramas a la vez. Este es justo el hueco que los worktrees existen para llenar.

Opción B: un clon completo por agente

La siguiente idea es dar a cada agente una copia de verdad separada: ejecuta git clone unas cuantas veces y apunta un agente a cada carpeta. Esto sí da aislamiento real. Cada carpeta tiene sus propios archivos, su propia rama, su propio todo, así que los agentes no pueden chocar.

bash
# Una copia completa e independiente por agente
git clone git@github.com:me/app.git app-auth
git clone git@github.com:me/app.git app-tests
git clone git@github.com:me/app.git app-docs

Funciona, pero es pesado. Cada clon carga una copia completa del historial y del almacén de objetos, un remoto aparte que hacer fetch y push, y su propio espacio en disco. En un repo grande eso es mucha duplicación para lo que intentas hacer. Además ahora mantienes varias copias independientes: traer actualizaciones, mantener los remotos sincronizados y limpiarlos se multiplican por el número de agentes.

Para un par de copias de larga vida está bien. Para levantar tres o cuatro workspaces de agente de corta vida varias veces al día, clonar el repo entero cada vez es más maquinaria de la que el trabajo necesita.

Opción C: git worktrees, un solo repo compartido

Los git worktrees son el camino intermedio que encaja con los agentes en paralelo justo. Un worktree es un árbol de trabajo extra de un repositorio. Sigue habiendo un único .git compartido por todos, pero cada worktree es una carpeta separada checkouteada en su propia rama. Consigues el aislamiento de carpetas real de los clones sin duplicar el historial.

bash
# Un repo, varios árboles de trabajo ligeros
git worktree add ../agente-auth -b agente-auth
git worktree add ../agente-tests -b agente-tests
git worktree add ../agente-docs -b agente-docs

# Limpia uno cuando su trabajo esté fusionado
git worktree remove ../agente-auth

Ahora N agentes pueden ejecutarse de verdad a la vez. Cada uno edita su propio checkout, en su propia rama, así que las ediciones solapadas son imposibles. Como comparten un solo almacén de objetos, un worktree nuevo solo cuesta los archivos checkouteados, no otra copia del repo, así que añadir un agente es barato. Y comparten un remoto y un historial, así que el fetch y el push siguen siendo simples.

Esa es toda la razón de ser de los worktrees: varios árboles de trabajo respaldados por un solo repositorio. Es el montaje que se corresponde directamente con "varios agentes, un repo, todos a la vez".

La única restricción: dos worktrees no pueden tener checkouteada la misma rama a la vez, así que cada agente necesita su propia rama. Para agentes en paralelo eso no es una limitación, es justo como quieres tenerlos organizados.

Comparativa rápida

Las tres opciones según lo que importa cuando quieres agentes ejecutándose a la vez:

Paralelismo real

  • Cambiar de rama: No, un solo árbol de trabajo significa que los agentes van por turnos o chocan
  • Varios clones: Sí, cada carpeta es totalmente independiente
  • Worktrees: Sí, cada agente tiene su propio checkout en su propia rama

Peso y disco

  • Cambiar de rama: Lo más ligero, pero no resuelve el problema
  • Varios clones: Pesado, un historial completo y un remoto copiados por agente
  • Worktrees: Ligero, un almacén de objetos compartido, solo los archivos checkouteados por agente

Remotos e historial

  • Cambiar de rama: Uno, pero compartido de forma insegura entre agentes
  • Varios clones: Uno por clon, cada uno con su fetch y su sincronización aparte
  • Worktrees: Un remoto y un historial compartidos por todos los worktrees

Limpieza

  • Cambiar de rama: Nada que eliminar, pero nada quedó aislado
  • Varios clones: Borrar carpetas enteras, y antes desenredar cualquier estado solo local
  • Worktrees: git worktree remove, un comando por workspace de agente

Cambiar de rama es la herramienta equivocada para ejecutar agentes a la vez. Varios clones funcionan pero son más pesados de lo que el trabajo necesita. Los worktrees son el encaje: aislamiento real, baratos de añadir, un solo repo que mantener.

Cuándo basta con una rama

Nada de esto significa que los worktrees sean siempre la respuesta. Si ejecutas un agente cada vez, una rama por tarea no solo está bien, es lo correcto. Haz una rama, deja que el agente trabaje, haz commit, cambia a la siguiente tarea. No hay choque porque nada más está tocando la carpeta, y consigues todas las ventajas de siempre de las ramas para organizar y revisar el historial.

Incluso con varios agentes, si solo editan archivos claramente distintos, un checkout compartido puede aguantar: las ediciones no se solapan, así que nada sobrescribe nada, y Git fusiona limpio. Los worktrees empiezan a importar en concreto cuando los agentes se ejecutan a la vez y pueden tocar los mismos archivos, o cuando quieres que dos trabajen la misma zona en ramas separadas. Tira del aislamiento cuando los choques son reales, no por defecto.

Regla general: un agente cada vez, usa ramas. Varios agentes que puedan solaparse, un worktree para cada uno. La guía del enjambre de agentes CLI de IA cubre el flujo más amplio de ejecutar varios agentes juntos.

Cómo usa los worktrees CodeAgentSwarm

CodeAgentSwarm es una app de escritorio para ejecutar un enjambre de agentes CLI de IA (Claude Code, Codex CLI, opencode, Antigravity CLI) en un solo sitio, y mete la opción de worktree directamente en cada terminal, así nunca ejecutas los comandos tú mismo.

Configuración de sesión por terminal de CodeAgentSwarm con una fila OPTIONS que muestra un interruptor Git Worktree junto a Turbo Mode
La fila OPTIONS en la configuración de un terminal tiene un interruptor Git Worktree. Actívalo y ese agente se ejecuta aislado en su propia rama.

En la configuración de sesión por terminal, la fila OPTIONS tiene un interruptor Git Worktree (junto a Turbo para los agentes que lo admiten; para opencode solo aparece Git Worktree). Actívalo y esa conversación obtiene un worktree en <repoRoot>/.codeagentswarm/worktrees/<slug>/ en una nueva rama cas/<slug>, partida desde tu HEAD local. Es la Opción C de arriba, un comando por agente, hecho por ti y con un nombre consistente.

También te quita el desorden de en medio. CodeAgentSwarm añade .codeagentswarm/ a tu .gitignore para que los worktrees nunca aparezcan en git status, y es a prueba de fallos: si la carpeta no es un repo de git, el terminal se abre con normalidad. Un ajuste global puede activar los worktrees en todos los terminales, y puedes fusionar o eliminar un worktree desde Ajustes cuando el trabajo esté hecho. Consigues el paralelismo de los worktrees sin los malabares con las ramas ni la limpieza.

Preguntas frecuentes

Una rama es una etiqueta sobre un commit; no te da un sitio separado donde trabajar. Con un solo árbol de trabajo, cambiar de rama intercambia los archivos de esa única carpeta, así que dos agentes no pueden usarla los dos a la vez sin chocar o ir por turnos. Un worktree es una carpeta separada de verdad, checkouteada en su propia rama. Para ejecutar agentes a la vez necesitas worktrees (árboles de trabajo separados), no solo ramas separadas.

No para paralelismo real. Cambiar de rama trabaja sobre un solo árbol de trabajo, así que los agentes comparten un conjunto de archivos. O van por turnos haciendo checkout y stash, que no es paralelo, o editan la misma carpeta y se sobrescriben. Para ejecutar varios agentes de verdad a la vez das a cada uno su propio árbol de trabajo, que es lo que dan los worktrees.

Para agentes en paralelo, normalmente sí. Varios clones dan aislamiento real pero cada uno carga una copia completa del historial, su propio remoto que sincronizar y su propio uso de disco. Los worktrees dan el mismo aislamiento de carpetas compartiendo un solo repositorio, así que un worktree nuevo solo cuesta los archivos checkouteados y mantienes un solo remoto e historial. Los clones tienen sentido para copias independientes de larga vida; los worktrees encajan con workspaces de agente de corta vida.

Cuando ejecutas un agente cada vez, o cuando varios agentes solo editan archivos claramente distintos. En esos casos una rama por tarea mantiene el historial organizado y nada choca en el checkout compartido. Los worktrees se ganan su sitio en concreto cuando los agentes se ejecutan a la vez y podrían tocar los mismos archivos.

Cada terminal tiene un interruptor Git Worktree en su fila OPTIONS. Actívalo y ese agente se ejecuta en un worktree en <repoRoot>/.codeagentswarm/worktrees/<slug>/ en una nueva rama cas/<slug> desde tu HEAD local. Añade .codeagentswarm/ a tu .gitignore para que quede fuera del git status, vuelve al directorio normal si la carpeta no es un repo de git, y te deja fusionar o eliminar worktrees desde Ajustes. Un ajuste global puede activarlo en todos los terminales.

Deja de hacer malabares con las ramas. CodeAgentSwarm da a cada terminal su propio worktree en su propia rama con un solo interruptor, así tus agentes van en paralelo sin pisarse.

Probar CodeAgentSwarm