git stash

Ramas y fusiones

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 clear
[ ] opcional| o<arg> valor a sustituir... repetible--flag opción

Opciones

Haz clic en una opción para desplegarla

Principiante (7)

Guardar tus modificaciones locales en una entrada nueva del stash y devolverlas al estado de HEAD. Usa -m para añadir un mensaje descriptivo. Es la acción por defecto de 'git stash'.

RecomendadoÚsalo con -m para poder identificar cada stash más tarde

Ejemplo

git stash push -m "Work in progress"

Aplicar el stash más reciente (stash@{0}) a tu directorio de trabajo y quitarlo de la pila. Si al aplicarlo hay conflictos, la entrada se conserva para que resuelvas y la borres tú.

RecomendadoRestaura y elimina el último stash; se conserva si aplicarlo da conflicto

Ejemplo

git stash pop

Aplicar un stash sin quitarlo de la pila. A diferencia de pop, el stash sigue disponible. Puedes indicar cuál con stash@{n}.

Cuando haga faltaCuando necesitas el mismo stash otra vez o en varias ramas

Ejemplo

git stash apply stash@{1}

Listar todas las entradas del stash. Cada una muestra su índice (stash@{n}), la rama en la que se creó y el mensaje o la descripción del commit.

RecomendadoRevisa lo que hay en el stash antes de hacer pop o drop

Ejemplo

git stash list

Mostrar como diff los cambios guardados en una entrada del stash. Por defecto muestra stash@{0}. Añade -p para ver el parche completo.

RecomendadoPrevisualiza con -p antes de aplicar

Ejemplo

git stash show -p stash@{0}

Quitar una sola entrada de la pila. Sin argumentos, borra stash@{0}. Indica stash@{n} para borrar otra. Apunta el hash que se muestra: es la única forma sencilla de recuperarla.

Cuando haga faltaLimpia después de apply; anota el hash que se muestra por si lo necesitas

Ejemplo

git stash drop stash@{1}

Borrar TODAS las entradas del stash de golpe, sin confirmación. Solo se pueden recuperar buscando commits huérfanos con git fsck. Úsalo con muchísimo cuidado.

No recomendadoBorra todos los stashes de una vez, sin confirmación

Ejemplo

git stash clear

Intermedio (3)

Incluir en el stash los archivos sin seguimiento. Por defecto, git stash solo guarda archivos con seguimiento. Úsalo para guardar también los archivos nuevos que aún no se han añadido.

RecomendadoSin ella, los archivos nuevos sin seguimiento se quedan atrás

Ejemplo

git stash -u

Dejar intacta el área de preparación. Solo se quitan del directorio de trabajo los cambios sin preparar; los preparados siguen preparados (y el stash también los guarda).

Cuando haga faltaProbar o confirmar el trabajo preparado apartando el resto

Ejemplo

git stash -k

Crear una rama nueva desde el commit en el que se creó el stash, aplicarlo y borrarlo si todo va bien. Útil cuando el stash choca con la rama actual.

Cuando haga faltaLa mejor solución cuando un stash ya no se aplica limpiamente a la rama actual

Ejemplo

git stash branch new-feature stash@{0}

Avanzado (1)

Elegir de forma interactiva qué fragmentos guardar con stash. Te permite guardar solo partes concretas de tus cambios y dejar otras en el directorio de trabajo.

Cuando haga faltaGuardar en el stash solo los hunks elegidos

Ejemplo

git stash -p

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 aSi hay conflicto
git stash popNo: se quita tras aplicarloRama actualSe conserva el stash; hay que resolver
git stash applySí: sigue en la pilaRama actualSe conserva el stash; hay que resolver
git stash branch <name>No: se quita tras aplicarloRama nueva en la base del stashSin conflictos (rama nueva)

¿Qué se guarda en el stash?

Controlar qué archivos entran en tu stash

ComandoCon seguimiento modificadosPreparadosSin seguimientoIgnorados
git stashSíSíNoNo
git stash -uSíSíSíNo
git stash -aSíSíSíSí
git stash -kSíSí (y además siguen preparados)NoNo

Stash frente a otras formas de guardar

Cuándo usar stash y cuándo las alternativas

ComandoDónde se guardaCompartibleIdeal para
git stashReflog localNoCambio de contexto rápido, guardado temporal
git commit (WIP)Historial de la ramaSí (si se sube)Trabajo que quizá quieras compartir o consultar
git worktreeDirectorio aparteN/ATrabajar en varias ramas a la vez

Gestionar varios stash

Comandos para trabajar con la pila del stash

ComandoMuestra el contenidoModifica la pilaCaso de uso
git stash listÍndice + mensajeNoVer todos los stash
git stash showDiffstatNoVistazo rápido a los cambios
git stash show -pDiff completoNoRevisión detallada antes de aplicar
git stash dropNoSí (quita uno)Borrar un stash concreto
git stash clearNoSí (los quita TODOS)Empezar de cero (peligroso)

Ejemplos

Guardar los cambios actuales con stash

git stash

Guarda 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 pop

Aplica el stash más reciente (stash@{0}) a tu directorio de trabajo y lo quita de la pila.


Listar todos los stash

git stash list

Muestra 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

1
git stash

Guardar los cambios actuales con stash

2
git checkout other-branch

Cambiarse a la otra rama

3
(do work, commit if needed)

Terminar el trabajo urgente

4
git checkout original-branch

Volver a tu rama

5
git stash pop

Recuperar los cambios guardados

1
git stash push -m "WIP: login validation"

Stash con un mensaje descriptivo

2
(days later...)

Pasa el tiempo

3
git stash list

Ver todos los stash con sus mensajes

4
git stash show stash@{0}

Ver qué contiene el stash

5
git stash pop

Aplicarlo y quitarlo cuando estés listo

1
git stash

Guardar tus cambios con stash

2
git checkout branch-a

Cambiarse a la primera rama

3
git stash apply

Aplicar (conserva el stash)

4
git commit -m "Add feature"

Hacer commit en branch-a

5
git checkout branch-b

Cambiarse a la segunda rama

6
git stash apply

Aplicar otra vez el mismo stash

7
git stash drop

Limpiar al terminar

1
git add ready-file.js

Preparar los cambios listos

2
git stash -k

Guardar lo no preparado y conservar lo preparado

3
git commit -m "Ready feature"

Hacer commit de los cambios preparados

4
git stash pop

Recuperar 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

A:

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.

A:

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.

A:

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.

A:

¡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.

A:

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.

A:

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.