¿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
- Estás desarrollando una funcionalidad compleja en una rama y tu servidor local está ejecutándose.
- Te entra un reporte de un bug crítico en producción (rama master o main).
- En lugar de detener tu entorno, hacer stash y cambiar de rama, usas
git worktreepara extraer la rama de producción en un directorio paralelo. - Abres ese nuevo directorio, levantas otro entorno si es necesario, arreglas el bug y haces el commit.
- Una vez terminado, eliminas el worktree y sigues trabajando en tu funcionalidad principal sin haber interrumpido tu flujo de trabajo.
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:
- Estás en VSCode trabajando en tu proyecto principal (ej. rama
feature-login). - Te avisan de un bug urgente. Abres la terminal integrada de VSCode (
Ctrl + `) y ejecutas:git worktree add ../hotfix-bug-prod master - Abres una nueva ventana de VSCode (
Ctrl + Shift + N) y abres la nueva carpeta../hotfix-bug-prod(File > Open Folder...). - 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.
- En la nueva ventana, creas tu rama de corrección, haces los cambios, pruebas y haces commit.
- Cierras la segunda ventana de VSCode al terminar.
- Vuelves a tu primera ventana (que nunca dejaste de usar), eliminas el directorio extra con
git worktree remove ../hotfix-bug-prody 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. |