git stash
Aprende a usar el comando git stash para guardar cambios temporalmente, trabajar con múltiples stashes y aplicar stashes parciales.
Qué hace git stash
El comando git stash guarda temporalmente los cambios realizados en tu copia de trabajo para que puedas trabajar en otra cosa y volver a aplicarlos más tarde. Es la solución a una situación muy común: estás a mitad de un cambio cuando necesitas cambiar de rama, obtener actualizaciones o corregir un error urgente, pero tu trabajo no está lo suficientemente terminado como para hacer un commit. En lugar de hacer un commit desechable, guardas los cambios en el stash, obtienes un árbol de trabajo limpio, realizas el otro trabajo y restauras tus cambios después.
Un stash se almacena como un objeto especial similar a un commit en una pila LIFO (último en entrar, primero en salir). Cada entrada contiene una instantánea de los archivos rastreados modificados y, por defecto, Git deja tu directorio de trabajo limpio una vez que se crea el stash.

Esta página cubre cómo guardar y restaurar cambios, incluyendo archivos no rastreados e ignorados, cómo trabajar con múltiples stashes, cómo inspeccionar y hacer stashes parciales, cómo crear ramas desde un stash y cómo limpiar el stash. Para repasar la diferencia entre cambios en el área de preparación y cambios no preparados, consulta git add y git status.
Guardar tu trabajo en el stash
El comando git stash toma los cambios no confirmados tanto preparados como no preparados de archivos rastreados, los guarda para su uso posterior y luego los elimina de tu copia de trabajo. Primero, ejecuta git status para ver el estado del directorio. Luego ejecuta git stash para guardar los cambios:
Verificar el estado del árbol de trabajo
git statusOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlGuardar los cambios en el stash
git stashSaved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepageConfirmar que el árbol de trabajo está limpio ahora
git statusOn branch master
nothing to commit, working tree cleanTus cambios están guardados de forma segura y tu directorio de trabajo coincide con el último commit, por lo que puedes cambiar de rama u obtener actualizaciones libremente.
Volver a aplicar los cambios del stash
Hay dos comandos para restaurar un stash, y la diferencia es importante:
git stash popvuelve a aplicar el stash más reciente a tu copia de trabajo y lo elimina de la lista del stash.git stash applyvuelve a aplicar los cambios pero los mantiene en la lista del stash, lo cual es útil cuando quieres aplicar el mismo stash a más de una rama.
Aplicar el stash más reciente y eliminarlo
git stash popOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)La línea Dropped refs/stash@{0} confirma que la entrada fue eliminada tras una aplicación exitosa.
Si al volver a aplicar un stash se producen conflictos de fusión (porque los archivos subyacentes cambiaron mientras tanto), git stash pop no eliminará el stash: dejará los marcadores de conflicto para que los resuelvas y mantendrá la entrada para que no pierdas tu trabajo. Resuelve los conflictos y luego elimínalo manualmente con git stash drop.
Guardar en el stash archivos no rastreados o ignorados
Por defecto, git stash solo almacena los cambios que Git ya está rastreando: los cambios preparados y las modificaciones a archivos rastreados. No guardará en el stash archivos nuevos que nunca hayan sido preparados, ni archivos ignorados. Para incluir archivos no rastreados, usa la opción -u (o --include-untracked):
Incluir archivos no rastreados
git stash -uPara guardar también los archivos ignorados en el stash, usa la opción -a (o --all):
Incluir archivos no rastreados e ignorados
git stash -aLos archivos que coincidan con tu .gitignore solo se guardan en el stash cuando usas -a. Utiliza esto con moderación, ya que puede incluir artefactos de compilación y configuraciones locales que probablemente no pretendías mover.
Mantener los cambios preparados con --keep-index
Cuando quieres probar solo los cambios preparados de forma aislada, git stash --keep-index guarda todo en el stash pero deja el contenido del índice en tu árbol de trabajo:
Guardar en el stash todo excepto lo que está preparado
git stash --keep-indexEsto es útil antes de hacer un commit: guarda el trabajo no preparado en el stash, ejecuta tus pruebas exactamente contra lo que estás a punto de confirmar y luego usa git stash pop para recuperar el resto.
Múltiples stashes
Puedes ejecutar git stash varias veces para crear múltiples stashes y luego ejecutar git stash list para verlos. Por defecto, cada stash se etiqueta como "WIP" (trabajo en progreso), junto con la rama y el commit desde el que se creó. El stash más reciente es stash@{0}; los más antiguos tienen índices más altos.
Listar los stashes
git stash liststash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layoutEs una buena práctica agregar un mensaje descriptivo en lugar de la etiqueta "WIP" predeterminada para poder distinguir los stashes más adelante:
Guardar en el stash con un mensaje
git stash push -m "wip: experimental dark theme"Por defecto, git stash pop vuelve a aplicar el stash más reciente, stash@{0}. Puedes apuntar a un stash específico pasando su referencia a pop o apply:
Hacer pop de un stash específico
git stash pop stash@{2}On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{2} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Ver los diffs de un stash
Usa git stash show para ver un resumen de los archivos que modificó un stash:
Resumen de un stash
git stash show index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)Por defecto, git stash show muestra el stash más reciente. Pasa una referencia como git stash show stash@{1} para inspeccionar uno más antiguo. Agrega la opción -p o --patch para ver el diff completo:
Diff completo de un stash
git stash show -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>Stashes parciales
Git te permite elegir si guardar un solo archivo, un grupo de archivos o cambios individuales dentro de los archivos. El comando git stash -p (o --patch) itera a través de cada hunk (un fragmento contiguo de cambios) en la copia de trabajo y pregunta si deseas guardarlo en el stash:
Guardar en el stash hunks seleccionados de forma interactiva
git stash -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? nComandos de hunk
| Comando | Descripción |
|---|---|
| / | Buscar un hunk por expresión regular. |
| ? | Mostrar ayuda. |
| n | No guardar el hunk en el stash. |
| a | Guardar este hunk y todos los hunks posteriores del archivo en el stash. |
| d | No guardar este hunk ni ninguno de los hunks posteriores del archivo en el stash. |
| e | Editar manualmente el hunk actual. |
| q | Salir (los hunks seleccionados se guardarán en el stash). |
| s | Dividir el hunk en hunks más pequeños. |
| y | Guardar el hunk en el stash. |
Crear una rama desde un stash
A veces el commit desde el que se creó el stash ha avanzado tanto que volver a aplicarlo generaría conflictos. git stash branch resuelve esto creando una nueva rama desde el commit en el que se creó el stash, aplicando el stash allí y eliminándolo si tiene éxito:
Crear una rama desde un stash
git stash branch add-stylesheet stash@{1}Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Limpiar el stash
Los stashes no se eliminan automáticamente, por lo que la lista puede crecer con el tiempo. Elimina un stash individual con git stash drop:
Eliminar un stash
git stash drop stash@{1}Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Para eliminar todos los stashes a la vez, usa git stash clear:
Eliminar todos los stashes
git stash cleargit stash clear y git stash drop descartan los cambios guardados de forma permanente y no forman parte de ninguna rama, por lo que un git log normal no los mostrará. Si eliminas un stash por error, aún puedes recuperar el objeto a través de git reflog y git stash apply <commit-hash> antes de que el recolector de basura lo elimine.
Referencia rápida de comandos
| Comando | Qué hace |
|---|---|
git stash | Guardar en el stash los cambios preparados y no preparados de archivos rastreados. |
git stash -u | También guardar los archivos no rastreados en el stash. |
git stash -a | También guardar los archivos no rastreados e ignorados en el stash. |
git stash --keep-index | Guardar en el stash, pero dejar los cambios preparados en el árbol de trabajo. |
git stash push -m "message" | Guardar en el stash con una etiqueta descriptiva. |
git stash list | Listar todos los stashes (el más reciente es stash@{0}). |
git stash show -p | Mostrar el diff completo de un stash. |
git stash pop | Volver a aplicar el stash más reciente y eliminarlo. |
git stash apply | Volver a aplicar el stash más reciente y conservarlo. |
git stash branch <name> | Crear una rama desde un stash y aplicarlo. |
git stash drop / clear | Eliminar uno / todos los stashes. |
Para aprender otras formas de mover y deshacer trabajo, consulta git reset, git restore y git checkout.