¿Qué es Git Stash?
Estás a mitad del desarrollo de una funcionalidad cuando surge algo urgente. Un bug necesita ser corregido en la branch principal, o un compañero necesita que revises su pull request. No estás listo para hacer commit de tu trabajo en progreso, pero no puedes cambiar de branch con cambios sin commitear ocupando tu directorio de trabajo. Este es exactamente el problema que git stash fue diseñado para resolver.
Git stash toma tus cambios sin commitear -- tanto los que están en staging como los que no -- y los guarda en un área de almacenamiento temporal. Tu directorio de trabajo vuelve a un estado limpio, coincidiendo con el último commit. Cuando estés listo, puedes recuperar esos cambios. Piensa en ello como poner tu trabajo en una estantería para ocuparte de otra cosa, y luego retomarlo exactamente donde lo dejaste.
Uso básico: Stash, Apply y Pop
Guardar cambios en el stash
La forma más simple es:
git stash
Esto toma todos los archivos rastreados modificados y en staging y los almacena. Tu directorio de trabajo queda limpio. Ten en cuenta que los archivos no rastreados (archivos que nunca has añadido a Git) no se incluyen en el stash por defecto. Para incluirlos, usa:
git stash -u
O para incluir todo, incluso los archivos ignorados:
git stash -a
Recuperar cambios con apply
Una vez que hayas terminado tu tarea secundaria y quieras recuperar tu trabajo guardado en el stash, usa:
git stash apply
Esto restaura los cambios del stash en tu directorio de trabajo pero mantiene la entrada del stash intacta. El stash sigue en la estantería, lo cual puede ser útil si quieres aplicar los mismos cambios en varias branches.
Recuperar cambios con pop
git stash pop
Pop funciona como apply, pero también elimina la entrada del stash después de aplicarla. Es la opción más común cuando simplemente quieres recuperar tu trabajo y no necesitas conservar el stash.
La diferencia clave: apply conserva el stash, pop lo elimina después de restaurar. Usa apply cuando puedas necesitar el stash de nuevo. Usa pop cuando hayas terminado con él.
Añadir un mensaje a tu stash
Por defecto, Git etiqueta los stashes con una descripción autogenerada como WIP on main: a3b4c5d commit message. Eso no es muy útil cuando tienes varios stashes. Puedes añadir un mensaje descriptivo:
git stash push -m "refactoring the auth module"
Esto facilita mucho la identificación del contenido de cada stash cuando los listas más adelante.
Gestionar múltiples stashes
Listar tus stashes
Git mantiene una pila de stashes. Puedes verlos todos con:
git stash list
La salida se ve algo así:
stash@{0}: On main: refactoring the auth module
stash@{1}: WIP on feature/checkout: 9f2e1d0 add cart logic
stash@{2}: WIP on main: 7c8d9e1 update dependencies
El stash más reciente siempre es stash@{0}. Cada nuevo stash empuja los más antiguos hacia abajo en la pila.
Aplicar o hacer pop de un stash específico
Por defecto, apply y pop operan sobre el stash más reciente. Para apuntar a uno específico, referéncialo por su índice:
git stash apply stash@{2}
git stash pop stash@{1}
Ver el contenido de un stash
Antes de aplicar un stash, puede que quieras ver qué contiene:
git stash show stash@{0}
Esto muestra un resumen de los archivos modificados. Para el diff completo, añade -p:
git stash show -p stash@{0}
Hacer stash de archivos específicos
A veces no quieres hacer stash de todo. Quizás solo quieres apartar los cambios de uno o dos archivos. Desde Git 2.13, puedes hacer esto con:
git stash push -m "sidebar layout changes" src/components/Sidebar.tsx src/styles/sidebar.css
Solo los archivos especificados se guardan en el stash. Todo lo demás permanece en tu directorio de trabajo.
Eliminar y limpiar stashes
Eliminar un solo stash
Si ya no necesitas un stash específico, elimínalo con:
git stash drop stash@{1}
Esto elimina esa entrada del stash. Los stashes restantes se reindexan automáticamente.
Limpiar todos los stashes
Para eliminar todos los stashes de una vez:
git stash clear
Ten cuidado con esto. No hay forma de deshacerlo. Todos los cambios guardados en stash se eliminan permanentemente.
Crear una branch a partir de un stash
A veces haces stash de unos cambios y luego te das cuenta de que merecen su propia branch. En lugar de aplicar el stash y luego crear una branch, Git ofrece un atajo:
git stash branch new-feature-branch stash@{0}
Esto crea una nueva branch partiendo del commit donde se creó originalmente el stash, aplica el stash y lo elimina. Es especialmente útil cuando aplicar el stash en tu branch actual causaría conflictos.
Errores comunes
- Olvidar los stashes. Los stashes son fáciles de olvidar. Ejecuta
git stash listperiódicamente para comprobar si tienes stashes pendientes que deberían ser aplicados o eliminados. - Conflictos de stash. Si el código ha cambiado significativamente desde que hiciste el stash, aplicarlo puede producir conflictos de merge. Resuélvelos de la misma manera que resolverías cualquier conflicto de merge.
- Depender del stash en lugar de commits. Si te encuentras haciendo stash frecuentemente, considera hacer commit de tu trabajo en progreso en su lugar. Siempre puedes hacer amend o squash de esos commits después. El stash es ideal para cambios de contexto rápidos y de corta duración, no para almacenamiento a largo plazo.
Trabajar con stashes en GitSquid
GitSquid muestra los stashes directamente en el grafo de commits, para que puedas ver de un vistazo qué stashes existen y desde qué commit fueron creados. Hacer clic derecho en un stash abre un menú contextual con opciones para apply, pop, drop o limpiar todos los stashes. Esto hace que la gestión de stashes sea más rápida que escribir comandos, especialmente cuando tienes múltiples stashes y necesitas inspeccionarlos o limpiarlos.
Referencia rápida
| Comando | Qué hace |
|---|---|
git stash |
Guarda en stash los cambios rastreados |
git stash -u |
Stash incluyendo archivos no rastreados |
git stash push -m "msg" |
Stash con mensaje descriptivo |
git stash list |
Lista todos los stashes |
git stash apply |
Restaura el stash, conserva la entrada |
git stash pop |
Restaura el stash, elimina la entrada |
git stash drop stash@{n} |
Elimina un stash específico |
git stash clear |
Elimina todos los stashes |
git stash show -p |
Muestra el diff completo de un stash |
git stash branch <name> |
Crea una branch a partir de un stash |
Git stash es una de esas herramientas que parecen menores hasta que la necesitas. Una vez que te sientas cómodo con ella, cambiar de contexto entre tareas se vuelve fluido. Mantén tus stashes organizados con mensajes, limpia los antiguos regularmente y usa pop en lugar de apply cuando no necesites conservar el stash.