W3docs

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.

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 status
On branch master
Changes to be committed:
  new file:   style.css
Changes not staged for commit:
  modified:   index.html

Guardar los cambios en el stash

git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Confirmar que el árbol de trabajo está limpio ahora

git status
On branch master
nothing to commit, working tree clean

Tus 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 pop vuelve a aplicar el stash más reciente a tu copia de trabajo y lo elimina de la lista del stash.
  • git stash apply vuelve 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 pop
On 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.

Nota

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 -u

Para guardar también los archivos ignorados en el stash, usa la opción -a (o --all):

Incluir archivos no rastreados e ignorados

git stash -a

Los 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-index

Esto 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 list
stash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layout

Es 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 -p
diff --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 -p
diff --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,?]? n

Comandos de hunk

ComandoDescripción
/Buscar un hunk por expresión regular.
?Mostrar ayuda.
nNo guardar el hunk en el stash.
aGuardar este hunk y todos los hunks posteriores del archivo en el stash.
dNo guardar este hunk ni ninguno de los hunks posteriores del archivo en el stash.
eEditar manualmente el hunk actual.
qSalir (los hunks seleccionados se guardarán en el stash).
sDividir el hunk en hunks más pequeños.
yGuardar 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 clear
Advertencia

git 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

ComandoQué hace
git stashGuardar en el stash los cambios preparados y no preparados de archivos rastreados.
git stash -uTambién guardar los archivos no rastreados en el stash.
git stash -aTambién guardar los archivos no rastreados e ignorados en el stash.
git stash --keep-indexGuardar 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 listListar todos los stashes (el más reciente es stash@{0}).
git stash show -pMostrar el diff completo de un stash.
git stash popVolver a aplicar el stash más reciente y eliminarlo.
git stash applyVolver a aplicar el stash más reciente y conservarlo.
git stash branch <name>Crear una rama desde un stash y aplicarlo.
git stash drop / clearEliminar uno / todos los stashes.

Para aprender otras formas de mover y deshacer trabajo, consulta git reset, git restore y git checkout.

Práctica

Práctica
¿Cuáles son las características y funcionalidades del comando 'git stash'?
¿Cuáles son las características y funcionalidades del comando 'git stash'?
Was this page helpful?