Ejemplos prácticos y listos para copiar-pegar para el flujo de trabajo diario con worktrees: crear, cambiar de rama, fusionar, traer cambios y eliminar. Todos los comandos asumen una versión reciente de Git (2.23+) para que git switch funcione junto con el antiguo git checkout.
Tarjeta de referencia rápida -- lista para copiar-pegar.
# Crear + cambiar a una rama existente en un nuevo worktreegit worktree add ../feature-branch feature-branch# Crear una nueva rama y cambiar a ella en un nuevo worktreegit worktree add ../new-feature -b new-feature# HEAD desacoplado en un commit o tag específicogit worktree add ../hotfix abc1234# Listar worktrees y la rama que cada uno tiene verificadagit worktree list# Eliminar un worktree cuando terminesgit worktree remove ../feature-branch# Limpiar entradas obsoletas después de haber eliminado una carpeta manualmentegit worktree prune
Cuándo usarlo: Cualquier flujo de trabajo basado en worktrees -- desarrollo de features, aislamiento de hotfixes, revisión de PRs, comparación lado a lado.
# 1. Iniciar la feature en un nuevo worktree en una nueva ramagit worktree add ../my-feature -b my-feature# 2. Moverte a él y trabaja normalmentecd ../my-feature# ...edita archivos, ejecuta pruebas, haz commit...git add .git commit -m "feat: scaffold my-feature"# 3. Vuelve a main y fusionacd ../main-repogit switch maingit pull origin maingit merge my-feature# 4. Haz push y limpiagit push origin maingit worktree remove ../my-featuregit branch -d my-feature
Lo que esto demuestra:
Los worktrees y las ramas comparten historial inmediatamente -- no se necesita un ciclo push/pull entre ellos.
La fusión ocurre en el worktree destino (el que cuya rama recibirá los cambios).
Eliminar un worktree deja la rama intacta; eliminar la rama es un paso separado e intencional.
# Crear un nuevo worktree y cambiar a una rama existentegit worktree add ../feature-branch feature-branch# Crear una nueva rama Y cambiar a ella en un nuevo worktreegit worktree add ../new-feature -b new-feature# Cambiar a un commit o tag específico (HEAD desacoplado)git worktree add ../hotfix abc1234# Alternativa moderna a git checkout (más segura para ramas)git switch <branch> # Dentro de un worktreegit switch -c <new-branch> # Crear + cambiar
Consejo: Prefiere git switch sobre git checkout para operaciones de ramas (introducido en Git 2.23+). git checkout todavía funciona pero está sobrecargado con comportamiento de restauración de archivos, que es un arma de doble filo si escribes mal un nombre de rama.
git branch -a # Todas las ramas (locales + remotas)git branch -v # Con información del último commitgit worktree list # Qué rama tiene verificada cada worktreegit worktree list --porcelain # Legible por máquinas para scripts
git worktree list es la respuesta a "espera, ¿dónde dejé ese hotfix?"
La fusión ocurre en el worktree destino -- usualmente el que tiene main o una rama de lanzamiento verificada.
# Desde tu worktree principal:cd ../main-projectgit switch main # o: git checkout maingit pull origin main # Siempre actualiza primero# Fusionar una rama de feature completada (desarrollada en otro worktree)git merge feature-branch # Fast-forward o crear un commit de fusión# Fusionar con opcionesgit merge --no-ff feature-branch # Siempre crear un commit de fusióngit merge --squash feature-branch # Aplastar cambios (luego hacer commit manualmente)# Hacer rebase en su lugar, para un historial más limpiogit switch feature-branch # Cambiar al worktree de la rama de feature primerogit rebase maingit switch maingit merge feature-branch # Ahora un fast-forward limpio
Ejemplo de fusión entre worktrees:
Termina el trabajo y haz commit dentro de ../feature-worktree.
cd de vuelta al worktree principal.
git merge feature-branch -- el puntero de rama se actualizó automáticamente por el commit en el otro worktree.
Sin push, sin pull, sin viaje redondo remoto. La carpeta .git compartida hace que esto sea sin fricciones.
git fetch origin # Actualiza refs remotas -- visible desde todos los worktreesgit pull origin main # Traer + fusionar en el worktree donde ejecutaste esto# Actualizar la base de un worktree de featurecd ../my-featuregit fetch origingit rebase origin/main # Reproducir tus commits de feature en la parte superior de main más reciente
Punto clave:git fetch actualiza el estado en la carpeta .git compartida, así que cada worktree ve las nuevas refs remotas inmediatamente. git pull solo afecta la rama verificada en el worktree donde lo ejecutaste.
# Estás profundo en el trabajo de feature en ../my-feature, y la producción falla.# No hagas stash. No cambies de rama. Solo crea un worktree de hotfix.cd ~/projects/main-repogit fetch origingit worktree add ../hotfix -b hotfix/login-500 origin/maincd ../hotfix# ...depura, arregla, commit, push, abre PR...git push -u origin hotfix/login-500# Una vez que el PR se fusione, limpiacd ~/projects/main-repogit worktree remove ../hotfixgit branch -D hotfix/login-500 # Si la rama remota se eliminó al fusionar# Vuelve a tu trabajo de feature, exactamente como lo dejastecd ../my-feature
# Un compañero de equipo hizo push a una rama que necesitas revisargit fetch origingit worktree add ../review-pr-482 origin/feature/teammate-thingcd ../review-pr-482npm installnpm run dev# ...lee código, pruébalo, deja comentarios en el PR...# Destrúyelo cuando terminescd ../main-repogit worktree remove ../review-pr-482
# Ejecuta dos implementaciones a la vez para una comparación realgit worktree add ../approach-a -b experiment/approach-agit worktree add ../approach-b -b experiment/approach-b# Dos ventanas de terminal, dos servidores de desarrollo en puertos diferentes, ambos editables.# Cuando termines, mantén el ganador, elimina el perdedor.git worktree remove ../approach-bgit branch -D experiment/approach-b
Siempre haz commit o stash en los cambios antes de eliminar un worktree. Git se niega por defecto; usa --force solo cuando estés seguro.
Ejecuta git worktree prune después de eliminar manualmente un directorio de worktree.
git fetch una vez, ve actualizaciones en todas partes -- la carpeta .git compartida hace que las refs sean instantáneamente visibles en todos los worktrees.
Para fusiones complejas, considera git mergetool -- funciona igual en cualquier worktree.
Los submódulos necesitan git submodule update --init --recursive por worktree.
Cosas que te morderán. Cada gotcha incluye qué sale mal, por qué sucede y la solución.
fatal: '<branch>' is already checked out at ... -- Intentaste añadir un worktree en una rama que está verificada en otro lugar. Solución: Trabaja en el worktree existente, o bifurca: git worktree add ../scratch -b scratch <branch>.
Conflictos de rebase en un worktree de feature, luego olvidar actualizar el destino de fusión -- Hiciste rebase de feature sobre origin/main dentro de ../my-feature, pero en tu worktree principal olvidaste hacer git pull primero. Solución: Siempre git fetch + git pull en el worktree destino antes de fusionar.
git checkout <branch> cambia los archivos en el worktree actual -- Querías añadir un worktree pero escribiste el comando antiguo. Solución: Usa git worktree add para crear un nuevo worktree; git switch/git checkout solo cambian el actual.
Los stashes se aplican en worktrees y te sorprenden -- Hiciste stash en el worktree A, luego git stash pop en el worktree B aplica los archivos equivocados. Solución: Los stashes se comparten. Nómbralos (git stash push -m "feature X wip") y revisa con git stash list antes de hacer pop.
Force-push de una rama desde un worktree rompe fusiones en otro -- El worktree A hace force-push de feature, el worktree B todavía tiene los commits antiguos verificados y un git pull desencadena un rechazo de fast-forward confuso. Solución: Coordina force-pushes; vuelve a ejecutar git fetch + git reset --hard origin/feature en el otro worktree si estás seguro.
node_modules fuera de sincronización entre worktrees -- Actualizaste una dependencia en el worktree A; el worktree B todavía tiene la versión antigua instalada. Solución: Vuelve a ejecutar npm install (o tu equivalente) por worktree después de cambios de dependencias.
Commit de fusión va a la rama equivocada -- Ejecutaste git merge feature desde un worktree que tenía develop verificado, no main. Solución: Ejecuta git branch --show-current antes de fusionar. Usa git reset --hard ORIG_HEAD para deshacer la fusión si no ha sido hecho push.
Git crea un HEAD desacoplado por defecto. Para rastrear la rama remota como una local, usa -b: git worktree add ../review -b feature/teammate-branch origin/feature/teammate-branch.
¿Cuál es la diferencia entre `git switch` y `git checkout` en un worktree?
Ambos funcionan. git switch se agregó en Git 2.23+ para aclarar la intención (solo ramas).
git checkout está sobrecargado -- cambia ramas y restaura archivos. Un error de escritura puede destruir cambios sin commit.
Dentro de un worktree, prefiere git switch <branch> para operaciones de ramas y git restore <file> para archivos.
¿Puedo hacer `git pull` en un worktree y afectar a los otros?
git pull solo hace fast-forward o fusiona la rama verificada en el worktree donde lo ejecutaste.
Las refs remotas traídas (origin/main, etc.) se vuelven visibles en todos los worktrees, pero los punteros de rama local en otros worktrees no se mueven automáticamente.
¿Cómo hago rebase en un worktree de feature sobre el main más reciente?
cd ../my-featuregit fetch origingit rebase origin/main
git fetch actualiza la ref remota. git rebase origin/main reproduce tus commits de feature en la parte superior.
Si tienes commits locales para hacer push después, necesitarás git push --force-with-lease (nunca --force simple).
¿Qué sucede si hago `git merge feature-branch` desde el worktree equivocado?
El commit de fusión aterriza en cualquier rama que el worktree actual tenga verificada, que podría no ser lo que querías.
git branch --show-current antes de fusionar evita esto.
Si no has hecho push, git reset --hard ORIG_HEAD deshace la fusión limpiamente.
¿Puedo hacer cherry-pick de un commit desde la rama de otro worktree?
git cherry-pick <sha>
Sí. El commit vive en la carpeta .git compartida, así que cherry-pick funciona entre worktrees sin sintaxis especial.
Si el SHA está en una rama que nunca has traído, ejecuta git fetch primero.
¿Cómo comparo dos ramas verificadas en diferentes worktrees?