¿Odias los anuncios? Ir Sin publicidad Hoy

git stash — Más que un guardado de emergencia (Stash parcial, Stashes nombrados y el resto)

Actualizado en

Más allá de la salvación en caso de pánico: estashes nombrados, lista de estashes, mostrar -p, estash parcial con --patch, aplicar versus pop, y el problema de los archivos no rastreados que eventualmente enfrentarás.

git stash — Más que una salvación en pánico (Stash parcial, Stash nombrado y el resto) 1
ANUNCIO · ¿ELIMINAR?

Aprendiste git stash en pánico. Alguien te notificó en medio de una característica, necesitabas cambiar de rama inmediatamente, y el stash era la salida más rápida. Salvó el día.

Luego tenías tres stashes, olvidabas qué contenía, aplicabas el malo en la mala rama y decidías que el stash estaba roto. No está roto. Solo necesitas un par más de comandos.

Los archivos no rastreados te atraparon (lee esto primero)

git stash solo guarda rastreados archivos — archivos ya conocidos por git. Los nuevos archivos que no has estudiado son invisibles para él.

# You created a new file mid-feature
echo "temp work" > new-feature.js

git stash
# new-feature.js is still sitting there — stash ignored it entirely

Añadir -u para incluir archivos no rastreados:

git stash push -u

También hay -a (--all) que incluye archivos ignorados también. Eso casi nunca es lo que quieres — almacenará tus node_modules cambios y .env archivos y hará que la restauración sea un infierno.

Nombra tus stashes antes de arrepentirte

El mensaje predeterminado del stash es:

stash@{0}: WIP on main: a3f1c2d Update dependencies

Eso es inútil cuando tienes tres stashes de tres características incompletas diferentes. Usa git stash push -m para nombrarlos:

git stash push -u -m "wip: oauth token refresh flow"
git stash push -u -m "experiment: lazy load images on scroll"
git stash push -u -m "fix: header z-index issue"

Ahora git stash list es realmente legible:

stash@{0}: On main: fix: header z-index issue
stash@{1}: On feature/images: experiment: lazy load images on scroll
stash@{2}: On feature/auth: wip: oauth token refresh flow

Aplica uno específico por índice:

git stash apply stash@{2}   # brings back the auth work

Revisa antes de aplicar: stash show -p

git stash show te da un resumen de los archivos modificados. Añade -p para el diferencial completo:

git stash show -p stash@{2}

Este es el comando que la mayoría de personas salta y luego se arrepienten. Sin él, estás restaurando cambios de forma ciega sobre una rama que pudo haber cambiado significativamente desde que lo guardaste. Un rápido show -p toma diez segundos y te dice exactamente qué estás a punto de aplicar.

Si quieres comparar el diferencial del stash con el estado actual de un archivo lado a lado, pega ambos en el Comparación de texto herramienta — más rápido que manipular git diff stash@{N}..HEAD -- path/to/file en tu mente.

Aplicar vs. pop: una diferencia que realmente importa

Ambos comandos restauran tu stash. Una diferencia crítica:

  • git stash pop = aplicar + eliminar la entrada del stash
  • git stash apply = aplicar, mantener la entrada del stash

Si pop y encuentras un conflicto de fusión, git elimina la entrada del stash antes de que resuelvas nada. Ahora tienes un árbol de trabajo en conflicto y ninguna referencia de stash para caer.

apply mantiene la entrada mientras resuelves el conflicto, luego limpias manualmente:

# Safer workflow when conflicts are possible
git stash apply stash@{0}
# resolve any conflicts
git stash drop stash@{0}   # explicit cleanup once you're happy

La extra drop etapa vale la pena cuando el stash representa horas de trabajo.

Stash parcial con –patch

A veces solo quieres guardar parte de tus cambios. Tienes un parche de bug y la mitad de una nueva característica en el mismo archivo, y quieres commitear el parche mientras guardas el código de la característica.

git stash push --patch (o -p) abre una sesión interactiva hunk por hunk:

git stash push -p -m "wip: new feature half"

Para cada hunk, obtienes la misma y/n/s/q interfaz que git add -p. Escribe s para dividir un hunk en piezas más pequeñas si el auto-dividir de git no es suficientemente fino. Es más lento que un stash normal, pero es la forma más limpia de dividir un árbol de trabajo sucio sin crear una rama de descarte.

Una advertencia: --patch modo no incluye archivos no rastreados, por lo que no puedes combinarlo con -u. Si tienes nuevos archivos no rastreados que forman parte de la característica que estás guardando, necesitarás git add primero para que se conviertan en rastreados, luego ejecuta el stash parcial.

Casos de uso reales

Conmutación de contexto en medio de una característica. Un revisor deja retroalimentación urgente en otra PR mientras estás profundamente inmerso en código incompleto. Guarda con un nombre, cambia de rama, realiza la revisión, regresa y aplica. Sin commits en proceso, sin ejercicios de ramas.

git stash push -u -m "wip: refactor auth middleware"
git checkout fix/urgent-prod-bug
# ... review and fix ...
git checkout feature/auth-refactor
git stash pop

Verificación de una ejecución limpia de pruebas. Quieres confirmar que tus pruebas pasan en un árbol de trabajo limpio — no con tus cambios parciales accidentalmente filtrándose en el entorno de prueba:

git stash push -u
npm test          # or pytest, cargo test, whatever
git stash pop

Esto detecta el caso en el que las pruebas pasan solo debido a modificaciones locales. Ocurre más frecuentemente de lo que crees en repositorios con fijos de pruebas compartidos.

Conmutación de ramas con un árbol de trabajo en conflicto. Git se niega a verificar una rama cuando tu árbol de trabajo tiene cambios que serían sobrescritos. Guarda primero, cambia de rama, deshaz. Más rápido que git commit --fixup solo para mover ramas.

hoja de referencia de git stash

ComandoQué hace
git stash pushGuarda cambios rastreados (abreviatura: git stash)
git stash push -uIncluye archivos no rastreados
git stash push -m "name"Guarda con un nombre descriptivo
git stash push -u -m "name"No rastreados + nombrados (la combinación que usarás más)
git stash push -pGuarda parcialmente interactiva (por hunk)
git stash listLista todos los stashes
git stash show stash@{N}Resumen de archivos modificados en un stash
git stash show -p stash@{N}Diferencial completo de un stash
git stash apply stash@{N}Aplica un stash, mantiene la entrada
git stash popAplica el último stash, elimina la entrada
git stash drop stash@{N}Elimina una entrada específica de stash
git stash clearElimina todas las entradas de stash
git stash branch <branchname>Crea una nueva rama a partir de un stash y aplica

La salida de escape de la rama de stash

Una más comando que vale la pena conocer: git stash branch <branchname>. Esto crea una nueva rama en el commit donde guardaste, aplica el stash y lo elimina si la aplicación es limpia. Es la opción correcta cuando tus cambios guardados han crecido lo suficiente como para merecer su propia rama — y evita completamente el problema de conflicto porque estás reejecutando el stash en el árbol exacto desde el que proviene.

La costumbre que soluciona el 90% de dolor de stash: nombra todo con -m, y usa apply en lugar de pop hasta que estés seguro de que los cambios se integraron correctamente. La extra drop etapa cuesta dos segundos. Perder un stash que necesitabas cuesta mucho más.

¿Quieres eliminar publicidad? Adiós publicidad hoy

Instalar extensiones

Agregue herramientas IO a su navegador favorito para obtener acceso instantáneo y búsquedas más rápidas

añadir Extensión de Chrome añadir Extensión de borde añadir Extensión de Firefox añadir Extensión de Opera

¡El marcador ha llegado!

Marcador es una forma divertida de llevar un registro de tus juegos, todos los datos se almacenan en tu navegador. ¡Próximamente habrá más funciones!

ANUNCIO · ¿ELIMINAR?
ANUNCIO · ¿ELIMINAR?
ANUNCIO · ¿ELIMINAR?

Noticias Aspectos técnicos clave

Involucrarse

Ayúdanos a seguir brindando valiosas herramientas gratuitas

Invítame a un café
ANUNCIO · ¿ELIMINAR?