Git Worktree: Trabaja en múltiples ramas simultáneamente

Descubre cómo git worktree te permite tener múltiples ramas del mismo repositorio extraídas en diferentes directorios al mismo tiempo, evitando el uso excesivo de git stash.

¿Alguna vez has estado trabajando en una nueva funcionalidad y de repente te piden arreglar un bug urgente en otra rama? Normalmente, la solución habitual es hacer un git stash, cambiar de rama, arreglar el bug, hacer commit, volver a tu rama y aplicar el stash. Sin embargo, esto puede volverse engorroso, especialmente si tienes configuraciones de entorno o servidores de desarrollo corriendo.

Aquí es donde entra en juego Git Worktree.

git worktree te permite extraer el mismo repositorio en múltiples directorios del sistema de archivos, compartiendo la misma carpeta original .git subyacente. Esto significa que puedes tener varias ramas activas al mismo tiempo, sin necesidad de hacer múltiples clones completos del repositorio ni abusar de git stash.

¿Por qué usar worktree en lugar de clonar el repositorio dos veces? Principalmente por tres motivos: ahorras espacio y tiempo al instante (no descargas de nuevo el historial), las ramas y commits se comparten de forma local (sin necesidad de hacer push ni pull entre carpetas), y un solo git fetch mantiene todos los directorios actualizados a la vez.

Caso de uso de git worktree

Ejemplo en el sistema de archivos

Imagina que tu proyecto está en la carpeta mi-proyecto. Cuando creas un worktree para un hotfix, Git genera un directorio paralelo. Así se vería tu estructura de carpetas:

/home/usuario/proyectos/
├── mi-proyecto/                <-- Tu repositorio original (rama 'feature')
│   ├── .git/                   <-- Carpeta Git principal
│   ├── src/
│   └── package.json
└── mi-proyecto-hotfix/         <-- Tu nuevo worktree (rama 'hotfix')
    ├── .git                    <-- Un archivo .git que apunta al principal
    ├── src/
    └── package.json

Ambos directorios funcionan de forma independiente a nivel de archivos, pero comparten el mismo historial de Git. Los commits que hagas en mi-proyecto-hotfix estarán disponibles en el repositorio original.

Secuencia completa de comandos

Para conseguir esta estructura y luego volver a la normalidad, esta es la receta de terminal que ejecutarías de principio a fin:

# 1. Creamos el worktree y una nueva rama para el hotfix a partir de main
git worktree add -b hotfix-urgente ../mi-proyecto-hotfix main

# 2. Entramos a la carpeta del worktree
cd ../mi-proyecto-hotfix

# 3. (Aquí abres tu editor, haces los cambios y los guardas)

# 4. Haces commit de los cambios
git add .
git commit -m "Fix: corrección del bug crítico"

# 5. Vuelves a la carpeta de tu proyecto original
cd ../mi-proyecto

# 6. Borras el worktree (el código de la rama no se pierde)
git worktree remove ../mi-proyecto-hotfix

# 7. (Opcional) Borras la rama si ya la has fusionado (mergeado)
git branch -d hotfix-urgente

Flujo de desarrollo con VSCode

Trabajar con worktrees en VSCode es muy fluido. Así sería el paso a paso:

  1. Estás en VSCode trabajando en tu proyecto principal (ej. rama feature-login).
  2. Te avisan de un bug urgente. Abres la terminal integrada de VSCode (Ctrl + `) y ejecutas:
    git worktree add ../hotfix-bug-prod master
  3. Abres una nueva ventana de VSCode (Ctrl + Shift + N) y abres la nueva carpeta ../hotfix-bug-prod (File > Open Folder...).
  4. Ahora tienes dos ventanas de VSCode abiertas. La ventana original mantiene todo tu contexto (archivos, terminal, servidor de desarrollo). La nueva ventana está limpia y lista para arreglar el bug.
  5. En la nueva ventana, creas tu rama de corrección, haces los cambios, pruebas y haces commit.
  6. Cierras la segunda ventana de VSCode al terminar.
  7. Vuelves a tu primera ventana (que nunca dejaste de usar), eliminas el directorio extra con git worktree remove ../hotfix-bug-prod y continúas donde te quedaste.

Referencia de comandos de git worktree

Estos son los comandos principales para gestionar tus worktrees.

Comando Acción
git worktree add <ruta> <rama> Crea un nuevo directorio en la ruta indicada y hace checkout de la rama especificada.
git worktree add -b <nueva-rama> <ruta> <rama-origen> Crea una rama nueva y un nuevo worktree simultáneamente.
git worktree list Muestra una lista de todos los worktrees activos en tu repositorio.
git worktree remove <ruta> Elimina el worktree especificado (asegúrate de que los cambios estén comiteados).
git worktree prune Limpia las referencias internas a worktrees que has borrado del disco manualmente con rm -rf.