Una guía completa de Git Stash
Estás en plena implementación de una funcionalidad, sumergido en una refactorización, cuando un compañero de equipo te avisa sobre un bug crítico en producción. Tu directorio de trabajo es un caos de cambios a medio terminar. No estás listo para hacer commit, pero tampoco puedes cambiar de rama con trabajo sin confirmar dando vueltas.
Para esto sirve exactamente git stash. Esta guía cubre todos los comandos de git stash que realmente vas a usar, cómo manejar conflictos y los consejos de flujo de trabajo que hacen que usar stash se sienta natural en lugar de arriesgado.
Puntos clave
git stashguarda los cambios sin confirmar en una pila local y restaura tu directorio de trabajo para que coincida conHEAD, permitiéndote cambiar de contexto sin tener que confirmar trabajo a medio terminar.- Por defecto, los stashes solo incluyen los cambios rastreados. Usa
-upara archivos sin rastrear y-apara los ignorados. - Usa
git stash popcuando quieras recuperar los cambios y eliminar el stash, ogit stash applycuando quieras conservar el stash para reutilizarlo. - Cuando los conflictos durante un stash apply se vuelven inmanejables,
git stash branchcrea una nueva rama desde el commit original y aplica el stash limpiamente. - Siempre añade un mensaje descriptivo con
-m, mantén tu lista de stashes corta, y trata los stashes como almacenamiento temporal, no como copias de seguridad.
¿Qué es Git Stash?
git stash guarda tus cambios sin confirmar—tanto los que están en el staging como los que no—en una pila local y revierte tu directorio de trabajo para que coincida con el último commit (HEAD). Puedes restaurar esos cambios más tarde, en la misma rama o en una diferente.
Los stashes son solo locales. No se envían a tu remoto con git push, ni se comparten con tus compañeros de equipo.
Lo que se guarda en el stash por defecto:
- Cambios en el staging (index)
- Cambios sin staging en archivos rastreados
Lo que NO se guarda en el stash por defecto:
- Archivos sin rastrear (archivos nuevos que aún no se han añadido a Git)
- Archivos ignorados
Comandos principales de Git Stash
Guardar cambios con git stash push
git stash
El simple git stash es una abreviatura de git stash push. Es la forma más rápida de obtener un directorio de trabajo limpio.
Añade un mensaje descriptivo para saber qué contiene más adelante:
git stash push -m "WIP: refactor auth middleware"
Nota: La sintaxis más antigua
git stash saveestá obsoleta. Usagit stash pushen su lugar.
Guardar archivos sin rastrear
Por defecto, los archivos nuevos que aún no has añadido al staging se quedan fuera. Usa -u para incluirlos:
git stash push -u -m "WIP: new login component"
Para también guardar archivos que coinciden con .gitignore, usa -a (--all). Esto rara vez es necesario, pero resulta útil cuando los archivos ignorados podrían interferir con un cambio de rama o una compilación.
Guardar archivos específicos
Puedes guardar solo ciertos archivos usando un pathspec:
git stash push -m "WIP: api changes" -- src/api/client.js src/api/utils.js
Esto deja todo lo demás en tu directorio de trabajo intacto.
Listar tus stashes
git stash list
Salida:
stash@{0}: On main: WIP: refactor auth middleware
stash@{1}: WIP on feature/login: 9ab3c12 Add login form
Los stashes se almacenan en una pila tipo LIFO (último en entrar, primero en salir). stash@{0} siempre es el más reciente.
Inspeccionar un stash antes de aplicarlo
git stash show stash@{0} # resumen
git stash show -p stash@{0} # diff completo
Git Stash Pop vs Apply: ¿Cuál deberías usar?
Esta es una de las fuentes de confusión más comunes con los comandos de git stash.
git stash pop | git stash apply | |
|---|---|---|
| Restaura cambios | ✅ Sí | ✅ Sí |
| Elimina de la pila | ✅ Sí (solo si se aplica sin conflicto) | ❌ No |
| En caso de conflicto | Mantiene el stash en la pila | Mantiene el stash en la pila |
| Mejor para | Restauración única | Aplicar a varias ramas |
Usa pop cuando hayas terminado con el stash y solo quieras recuperar tus cambios.
Usa apply cuando quieras aplicar el mismo stash a varias ramas, o cuando quieras probar el resultado antes de comprometerte a eliminarlo.
Para aplicar un stash específico:
git stash pop stash@{1}
git stash apply stash@{1}
Restaurar el estado de staging con --index
Por defecto, al aplicar un stash se restauran todos los cambios como sin staging. Si quieres restaurar la distinción entre staged y unstaged tal como estaba cuando hiciste el stash, usa --index:
git stash pop --index
Discover how at OpenReplay.com.
Resolver conflictos al aplicar un stash
Si la rama ha cambiado desde que hiciste el stash, puedes encontrarte con conflictos:
CONFLICT (content): Merge conflict in src/api/client.js
The stash entry is kept in case you need it again.
Tanto pop como apply mantienen el stash en la pila cuando se producen conflictos. Para resolverlos:
- Ejecuta
git statuspara encontrar los archivos en conflicto. - Abre cada archivo y resuelve los marcadores de conflicto.
- Añade los archivos resueltos al staging:
git add src/api/client.js. - Elimina el stash manualmente cuando estés satisfecho:
git stash drop stash@{0}.
Cuando los conflictos se complican: usa git stash branch
Si los conflictos son demasiado enredados, git stash branch es la vía de escape más limpia. Crea una nueva rama desde el commit exacto donde hiciste el stash, y luego aplica el stash allí. Como la rama parte del commit donde se creó el stash, esto suele evitar los conflictos:
git stash branch fix/auth-refactor stash@{0}
Si la aplicación es exitosa, el stash se elimina automáticamente.
Gestionar y limpiar stashes
git stash drop stash@{0} # eliminar un stash específico
git stash clear # eliminar TODOS los stashes (irreversible)
⚠️
git stash cleares permanente. No hay forma de deshacerlo. Verifica dos veces antes de ejecutarlo.
Avanzado: stashing parcial y stash solo del staging
El modo de parche interactivo te permite elegir qué hunks guardar en el stash:
git stash push -p
Git te guía a través de cada cambio y te pregunta si quieres guardarlo. Útil cuando un archivo tiene cambios relacionados y no relacionados.
Guardar solo los cambios en staging (Git 2.35 y posteriores):
git stash push --staged
Esto guarda lo que está en tu index y deja el trabajo sin staging en su lugar—práctico para aislar un cambio que quieres apartar sin perder tu progreso actual.
Mantener los cambios en staging dentro del index mientras guardas todo lo demás:
git stash push --keep-index
Ten en cuenta que --keep-index aún guarda tanto los cambios en staging como los que no; simplemente deja los que están en staging en su lugar en tu directorio de trabajo después del stash.
Recuperar un Git Stash eliminado
Si accidentalmente eliminas o limpias los stashes, puede que aún sean recuperables como commits colgantes (dangling commits) en tu repositorio. Las entradas de stash se almacenan como merge commits, por lo que puedes buscarlas con:
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk --grep=WIP
Esto lista los merge commits inalcanzables que parecen entradas de stash. Una vez que encuentres el hash del commit que quieres, restáuralo con:
git stash apply <commit-hash>
La recuperación no está garantizada—el recolector de basura de Git eventualmente eliminará los objetos inalcanzables—así que actúa rápido.
Transferir stashes entre máquinas
Las versiones recientes de Git añadieron git stash export y git stash import, que permiten transferir stashes usando los flujos normales de fetch y push.
Para versiones anteriores de Git, o para transferencias simples y puntuales, las alternativas prácticas siguen incluyendo:
- Exportar como parche:
git stash show -p stash@{0} > my-stash.patch, luego aplícalo en otro lugar congit apply my-stash.patch. - Confirmarlo en una rama desechable: crea una rama, confirma el trabajo, súbela a un remoto, luego haz pull y reset en la otra máquina.
Los parches suelen ser el camino más sencillo para transferencias puntuales.
Buenas prácticas para Git Stash
- Siempre añade un mensaje.
git stash push -m "WIP: qué y por qué"te ahorra tener que mirar una lista de entradas anónimas tipoWIP on main. - El stash es almacenamiento temporal, no una copia de seguridad. Haz commit de tu trabajo cuando alcance un punto de control lógico.
- Mantén tu lista de stashes corta. Revísala regularmente y elimina los stashes que ya no necesites.
- Haz pull antes de hacer pop. Actualizar tu rama antes de restaurar un stash reduce la posibilidad de conflictos.
- Prefiere
applysobrepopcuando tengas dudas. Siempre puedes eliminar el stash manualmente una vez que hayas confirmado que todo se ve bien.
Referencia rápida: Comandos de Git Stash
| Comando | Qué hace |
|---|---|
git stash | Guarda cambios rastreados (abreviatura de push) |
git stash push -m "msg" | Guarda con un mensaje descriptivo |
git stash push -u | Incluye archivos sin rastrear |
git stash push -a | Incluye archivos sin rastrear e ignorados |
git stash push -- <path> | Guarda solo archivos específicos |
git stash push -p | Elige hunks de forma interactiva para guardar |
git stash push --staged | Guarda solo los cambios en staging |
git stash push --keep-index | Guarda todo, pero mantiene los cambios en staging en el index |
git stash list | Lista todos los stashes |
git stash show -p stash@{n} | Muestra el diff completo de un stash |
git stash pop | Aplica el stash más reciente y lo elimina |
git stash apply stash@{n} | Aplica un stash sin eliminarlo |
git stash pop --index | Restaura el estado de staged/unstaged |
git stash drop stash@{n} | Elimina un stash específico |
git stash clear | Elimina todos los stashes |
git stash branch <name> [stash] | Crea una rama a partir de un stash |
Conclusión
git stash es uno de esos comandos que parece opcional hasta que realmente lo necesitas—y entonces se vuelve parte de tu flujo de trabajo diario. Los hábitos clave: siempre nombra tus stashes, mantén la lista limpia y recurre a git stash branch cuando los conflictos hagan que un simple pop sea poco práctico. Bien utilizado, el stashing mantiene tu historial de Git limpio y tus cambios de contexto sin dolor.
Preguntas frecuentes
No. Por defecto, git stash solo guarda los cambios rastreados—tanto las modificaciones en staging como las que no, en archivos que Git ya conoce. Los archivos nuevos que no han sido añadidos con git add se dejan en tu directorio de trabajo. Para incluirlos, usa git stash push -u o --include-untracked. Para también guardar archivos que coinciden con .gitignore, usa -a o --all.
Ambos restauran tus cambios guardados al directorio de trabajo. La diferencia está en lo que ocurre después. git stash pop elimina el stash de la pila una vez que se aplica limpiamente, mientras que git stash apply lo deja en su lugar para que puedas reaplicarlo más tarde o en otra rama. Si ocurre un conflicto durante el pop, el stash se conserva para que no pierdas tu trabajo.
A menudo sí, si actúas rápido. Las entradas de stash se almacenan como merge commits, y los stashes eliminados se convierten en objetos inalcanzables que el recolector de basura de Git eventualmente eliminará. Ejecuta git fsck --unreachable para encontrar commits colgantes, identifica el stash por su mensaje WIP, y luego restáuralo con git stash apply seguido del hash del commit.
No. Los stashes son estrictamente locales y viven en la referencia refs/stash de tu repositorio. Nunca se incluyen en git push, git fetch o git pull. Si necesitas compartir trabajo en progreso con un compañero de equipo, confírmalo en una rama temporal y sube esa rama, o exporta los cambios como un parche usando git stash show -p.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.