← Volver al blog

Git stash explicado: save, apply, pop y drop

tutorial git

¿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 list perió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.