git stash
Guardar aparte los cambios de un directorio de trabajo con modificaciones
El comando 'git stash' toma tus cambios sin commit (preparados o no), los guarda para más adelante y los retira de tu copia de trabajo. Puedes volver a aplicarlos después con 'git stash pop' o 'git stash apply'. El stash es útil cuando necesitas cambiar rápido de contexto para trabajar en otra cosa, pero tienes un cambio a medias que no está listo para un commit. El stash funciona como una pila, así que puedes tener varios.
Sinopsis
git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <message>] [--] [<pathspec>...]]
git stash clearOpciones
Elegir la opción adecuada
Recuperar cambios guardados con stash
Elige el comando adecuado para recuperar tu trabajo guardado
| Comando | ¿Conserva el stash? | Se aplica a | Si hay conflicto |
|---|---|---|---|
git stash pop | No: se quita tras aplicarlo | Rama actual | Se conserva el stash; hay que resolver |
git stash apply | Sí: sigue en la pila | Rama actual | Se conserva el stash; hay que resolver |
git stash branch <name> | No: se quita tras aplicarlo | Rama nueva en la base del stash | Sin conflictos (rama nueva) |
¿Qué se guarda en el stash?
Controlar qué archivos entran en tu stash
| Comando | Con seguimiento modificados | Preparados | Sin seguimiento | Ignorados |
|---|---|---|---|---|
git stash | Sí | Sí | No | No |
git stash -u | Sí | Sí | Sí | No |
git stash -a | Sí | Sí | Sí | Sí |
git stash -k | Sí | Sí (y además siguen preparados) | No | No |
Stash frente a otras formas de guardar
Cuándo usar stash y cuándo las alternativas
| Comando | Dónde se guarda | Compartible | Ideal para |
|---|---|---|---|
git stash | Reflog local | No | Cambio de contexto rápido, guardado temporal |
git commit (WIP) | Historial de la rama | Sí (si se sube) | Trabajo que quizá quieras compartir o consultar |
git worktree | Directorio aparte | N/A | Trabajar en varias ramas a la vez |
Gestionar varios stash
Comandos para trabajar con la pila del stash
| Comando | Muestra el contenido | Modifica la pila | Caso de uso |
|---|---|---|---|
git stash list | Índice + mensaje | No | Ver todos los stash |
git stash show | Diffstat | No | Vistazo rápido a los cambios |
git stash show -p | Diff completo | No | Revisión detallada antes de aplicar |
git stash drop | No | Sí (quita uno) | Borrar un stash concreto |
git stash clear | No | Sí (los quita TODOS) | Empezar de cero (peligroso) |
Ejemplos
Guardar los cambios actuales con stash
git stashGuarda todos los cambios sin commit (preparados y sin preparar) en la pila del stash y devuelve el directorio de trabajo a HEAD.
Stash con un mensaje descriptivo
git stash push -m "WIP: login feature"Guarda los cambios con un mensaje personalizado para identificarlos fácilmente cuando tienes varios stash.
Aplicar y quitar el último stash
git stash popAplica el stash más reciente (stash@{0}) a tu directorio de trabajo y lo quita de la pila.
Listar todos los stash
git stash listMuestra todas las entradas del stash con su índice, el nombre de la rama y el mensaje. Útil para gestionar varios stash.
Ejemplos de flujos de trabajo
git stashGuardar los cambios actuales con stash
git checkout other-branchCambiarse a la otra rama
(do work, commit if needed)Terminar el trabajo urgente
git checkout original-branchVolver a tu rama
git stash popRecuperar los cambios guardados
git stash push -m "WIP: login validation"Stash con un mensaje descriptivo
(days later...)Pasa el tiempo
git stash listVer todos los stash con sus mensajes
git stash show stash@{0}Ver qué contiene el stash
git stash popAplicarlo y quitarlo cuando estés listo
git stashGuardar tus cambios con stash
git checkout branch-aCambiarse a la primera rama
git stash applyAplicar (conserva el stash)
git commit -m "Add feature"Hacer commit en branch-a
git checkout branch-bCambiarse a la segunda rama
git stash applyAplicar otra vez el mismo stash
git stash dropLimpiar al terminar
git add ready-file.jsPreparar los cambios listos
git stash -kGuardar lo no preparado y conservar lo preparado
git commit -m "Ready feature"Hacer commit de los cambios preparados
git stash popRecuperar el resto de tu trabajo
Solución de problemas
error: Your local changes to the following files would be overwritten by merge
Causa: Intentar hacer pop/apply de un stash que choca con el directorio de trabajo actual
Haz commit o stash de los cambios actuales primero, o usa 'git stash branch <name>' para crear una rama nueva a partir del stash
No stash entries found
Causa: La pila del stash está vacía o estás mirando el índice equivocado
Ejecuta 'git stash list' para ver los stash disponibles. Recuerda que stash@{0} es el más reciente.
El stash no guardó mis archivos nuevos
Causa: Por defecto, git stash solo guarda archivos con seguimiento
Usa 'git stash -u' para incluir los archivos sin seguimiento, o 'git stash -a' para incluir también los ignorados
Apliqué el stash equivocado / quiero deshacer un pop
Causa: Hiciste pop de la entrada equivocada del stash
Si el pop falló con conflictos, el stash sigue ahí. Si funcionó, tus cambios están en el directorio de trabajo: vuelve a hacer 'git stash' si hace falta
Stash perdido tras clear/drop
Causa: git stash clear/drop elimina para siempre entradas del stash
Prueba 'git fsck --unreachable | grep commit' y luego 'git show <hash>' para encontrar commits de stash perdidos. No se garantiza la recuperación.
Consejos y trampas
Buenas prácticas
- ✓Usa siempre mensajes descriptivos con 'git stash push -m "description"': te lo agradecerás más adelante
- ✓Mejor 'git stash apply' que 'git stash pop' cuando quizá vuelvas a necesitar el stash
- ✓Usa 'git stash -u' si tienes archivos nuevos sin seguimiento que quieres guardar
- ✓No dejes que se acumulen los stash: limpia a menudo los antiguos con 'git stash drop'
- ✓Para guardar algo a largo plazo, plantéate un commit WIP en lugar de un stash
- ✓Usa 'git stash show -p' para revisar el contenido de un stash antes de aplicarlo
- ✓Si stash pop falla por conflictos, el stash se conserva: resuelve los conflictos y luego bórralo a mano
Errores comunes
- ✗Olvidar que 'git stash' por defecto solo guarda archivos con seguimiento. Usa '-u' o '--include-untracked' para guardar archivos nuevos sin seguimiento.
- ✗Usar 'git stash pop' cuando quizá quieras aplicar el mismo stash en varias ramas. Usa 'git stash apply' para conservarlo.
- ✗No poner mensajes descriptivos a los stash y luego olvidar qué contiene cada uno. Usa siempre 'git stash push -m "description"'.
- ✗Ejecutar 'git stash clear' sin darse cuenta de que borra TODOS los stash sin pedir confirmación. Solo se pueden recuperar rebuscando commits huérfanos con 'git fsck'.
- ✗Confundir el orden de la pila: stash@{0} es el stash MÁS reciente, no el más antiguo.
Preguntas frecuentes
Pop aplica el stash Y lo quita de la pila. Apply solo lo aplica y lo deja disponible. Usa apply cuando quizá necesites el mismo stash en otro sitio.
Por defecto, el stash solo guarda archivos con seguimiento. Usa 'git stash -u' para incluir los archivos sin seguimiento, o 'git stash -a' para incluir también los ignorados.
Usa 'git stash show' para un resumen rápido, o 'git stash show -p' para el diff completo. Añade stash@{n} para ver un stash concreto.
¡Sí! Usa 'git stash push -m "message" -- file1.js file2.js' para guardar solo esos archivos, o 'git stash -p' para elegir los fragmentos de forma interactiva.
Si hay conflictos, el stash NO se quita. Resuelve los conflictos a mano y luego usa 'git stash drop' para quitar el stash cuando termines.
Los stash no dependen de las ramas. Haz checkout de la rama de destino y ejecuta 'git stash apply'. O usa 'git stash branch <name>' para crear una rama nueva.