Git
Tutorial Git: Stash de cambios entre ramas
Git stash: Aprender a guardar cambios temporalmente, perfecta herramienta para desarrolladores. Asegúrate de mantener un flujo de trabajo limpio y eficiente.
Aprende Git y certifícate¿Qué es git stash?: Guardar cambios temporalmente
Git stash es una herramienta que permite guardar de forma temporal los cambios no confirmados en el proyecto. Cuando se necesita cambiar de rama o realizar una actualización sin perder el trabajo en curso, se utiliza git stash
para almacenar los cambios en una pila de stashes.
Al ejecutar git stash
, se guardan los cambios del working directory y del staging area, limpiando el estado del repositorio. De esta forma, se puede cambiar de rama o actualizar el código sin conflictos, sabiendo que los cambios se han guardado.
Los stashes se almacenan en una estructura tipo pila, donde el último stash guardado será el primero en recuperarse, siguiendo el principio LIFO (Last In, First Out). Esto permite manejar múltiples conjuntos de cambios temporales y recuperarlos cuando se necesiten.
Se usa mucho cuando se está en medio de una tarea y de repente se necesita atender otra cosa en una rama diferente. En lugar de hacer un commit parcial o perder los cambios, se realiza un stash y se cambia de contexto.
Por defecto, git stash no guarda archivos sin seguimiento (untracked). Si se necesita incluir estos archivos, se utiliza la opción -u
o --include-untracked
. De esta forma, todos los cambios, incluidos los nuevos archivos no versionados, se mantienen en el stash.
Flujo de trabajo: git stash save
, git stash list
, git stash pop
Para gestionar cambios temporales en Git, se utilizan los comandos git stash save
, git stash list
y git stash pop
, que permiten guardar modificaciones sin confirmar, visualizar los stashes existentes y recuperarlos cuando sea necesario.
El comando git stash save
se emplea para almacenar los cambios actuales del working directory y del staging area en un nuevo stash. Por ejemplo:
git stash save "Mensaje descriptivo del stash"
Se recomienda incluir un mensaje entre comillas para poder identificar el stash en el futuro. Si no se proporciona un mensaje, Git asigna uno por defecto que incluye la rama actual y un indicador de trabajo en progreso (WIP).
Para visualizar todos los stashes almacenados, se utiliza **git stash list**
:
git stash list
Este comando muestra una lista de los stashes, ordenados del más nuevo al más antiguo. Cada entrada incluye un identificador único y el mensaje asociado. Por ejemplo:
stash@{0}: On main: Mensaje descriptivo del stash
stash@{1}: On feature-branch: Añadida funcionalidad X
Para recuperar los cambios guardados en el stash más reciente, se utiliza git stash pop
:
git stash pop
Este comando aplica los cambios del stash al working directory y elimina el stash de la lista. Si se quiere aplicar un stash específico sin eliminarlo, se utiliza git stash apply
seguido del identificador:
git stash apply stash@{1}
Al aplicar un stash, es posible que salgan conflictos si los cambios interfieren con modificaciones existentes. En tal caso, Git notifica los archivos en conflicto y se deben resolver manualmente antes de continuar.
Para eliminar un stash específico una vez que ya no es necesario, se emplea git stash drop
:
git stash drop stash@{1}
Hay que tener cuidado al eliminar stashes, porque esta acción es irreversible. Si se quieren limpiar todos los stashes de golpe, se usa el comando git stash clear
, que elimina todos los stashes que haya guardados.
Conflictos al aplicar stashes: Cómo resolverlos
Al usar un stash con git stash apply
o git stash pop
, puede que surjan conflictos si los cambios almacenados en el stash interfieren con modificaciones existentes en el working directory o en la rama actual. Estos conflictos ocurren cuando el código ha ido avanzando desde que se creó el stash, y Git no puede fusionar automáticamente los cambios.
Cuando se produce un conflicto al aplicar un stash, Git muestra mensajes indicando los archivos afectados y marca las partes en conflicto dentro de los archivos. Por ejemplo, al ejecutar:
git stash pop
Devuelve una salida como:
Auto-merging archivo_ejemplo.txt
CONFLICT (content): Merge conflict in archivo_ejemplo.txt
Para resolver los conflictos, se deben seguir los siguientes pasos:
1. Identificar los archivos en conflicto: Git señala los archivos que presentan conflictos. Se puede utilizar git status
para ver una lista de estos archivos.
git status
La salida resaltará los archivos con conflictos bajo la sección "Unmerged paths:".
2. Editar los archivos en conflicto: Abrir cada archivo y buscar las marcas de conflicto que Git añade:
<<<<<<< Updated upstream
Código en la rama actual o aplicado desde el stash
=======
Código en conflicto del stash o rama anterior
>>>>>>> Stashed changes
Se debe decidir qué partes del código conservar, eliminando las marcas <<<<<<<
, =======
y >>>>>>>
. Se pueden combinar manualmente los cambios o seleccionar una versión sobre la otra.
3. Marcar los archivos como resueltos: Una vez que se han resuelto los conflictos en un archivo, hay que agregarlo al staging area con git add
:
git add archivo_ejemplo.txt
4. Finalizar el proceso: Después de resolver todos los conflictos y agregar los archivos corregidos, se hace un commit para finalizar la aplicación del stash:
git commit -m "Resueltos conflictos al aplicar stash"
Sin embargo, cuando se usa git stash pop
, Git intenta aplicar el stash y luego eliminarlo. Si ocurren conflictos, el stash no se elimina automáticamente. Si se quiere mantener el stash para reutilizarlo, no hace falta hacer nada. Pero si no se quiere, se puede eliminar manualmente con git stash drop
:
git stash drop
Los conflictos al aplicar stashes son parecidos a los que ocurren cuando se hace un merge o un rebase. Se pueden utilizar herramientas de merge visual, como las de Visual Studio Code o IntelliJ IDEA.
Además, si se prefiere evitar modificar el historial de commits o complicar el proceso, se puede crear una nueva rama y aplicar el stash allí:
git checkout -b solucion-conflictos
git stash apply
De esta manera, se trabaja en una rama aislada y se resuelven los conflictos sin afectar a la rama principal. Una vez se hayan resuelto, se puede fusionar esta rama con la rama deseada.
Limpieza y eliminación: Borrar stashes innecesarios
Si la pila de stashes crece mucho y está guardando muchas entradas que ya no son importantes se pueden eliminar stashes para mantener el repositorio limpio.
Para visualizar todos los stashes almacenados, se utiliza el comando:
git stash list
Este comando muestra una lista numerada de todos los stashes existentes para poder indentificar los que ya no se quieren. Si se desea eliminar un stash en particular, se emplea el comando git stash drop
seguido del identificador del stash:
git stash drop stash@{n}
Donde n
es el índice del stash en la lista. Por ejemplo, para eliminar el tercer stash:
git stash drop stash@{2}
Al ejecutar este comando, Git elimina el stash especificado de la pila. Hay que tener cuidado y asegurarse de que se está eliminando el stash correcto porque esta acción es irreversible. En ocasiones, se necesitan eliminar todos los stashes de golpe, para eso se utiliza el comando git stash clear
:
git stash clear
Este comando elimina todos los stashes almacenados en el repositorio y deja la pila vacía. Hay que tener cuidado al usar git stash clear
, porque no es posible recuperar los stashes una vez eliminados.
Antes de borrar un stash, se recomienda revisar su contenido para asegurarse de que no contiene nada importante. Para ver un stash sin aplicarlo, se puede utilizar:
git stash show stash@{n}
Este comando muestra un resumen de los cambios almacenados en el stash especificado. Si se añade la opción -p
o --patch
, devuelve un detalle línea por línea:
git stash show -p stash@{n}
Además, se recomienda añadir descripciones claras al crear los stashes para que sea más fácil identificarlos. Esto se hace con git stash save "Mensaje descriptivo"
.
Aunque Git tiene una forma directa de recuperar un stash eliminado, se puede si se conoce el hash del commit donde se guardó el stash. Los stashes son almacenados internamente como commits, y se pueden ver utilizando el reflog:
git reflog show --stash
Este comando muestra el historial de operaciones realizadas sobre los stashes, incluyendo eliminaciones. Si se identifica el hash que se quiere, se puede crear una rama o aplicar el commit directamente para recuperar los cambios.
Ejercicios de esta lección Stash de cambios entre ramas
Evalúa tus conocimientos de esta lección Stash de cambios entre ramas con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Comandos básicos
GitHub como remoto
Comandos básicos
Comandos avanzados
Git con GitHub Desktop
Ramas
Instalación y configuración
Introducción a Git
Comandos avanzados
Resolución de conflictos
Git con Intellij IDEA
Git con Visual Studio Code
Todas las lecciones de Git
Accede a todas las lecciones de Git y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Git
Introducción Y Entorno
Instalación Y Configuración
Introducción Y Entorno
Primeros Pasos Con Git
Introducción Y Entorno
Ciclo De Vida De Los Archivos
Comandos
Comandos Básicos
Comandos
Comandos Avanzados
Comandos
Gitignore Y Archivos Temporales
Comandos
Visualización Y Navegación De Cambios
Comandos
Etiquetas Tags Y Releases
Comandos
Ramas
Ramas
Merge Vs Rebase
Ramas
Stash De Cambios Entre Ramas
Ramas
Cherry Pick De Cambios
Ramas
Deshacer Cambios
Ramas
Gitflow
Ramas
Resolución De Conflictos
Trabajo Remoto Y Colaboración
Github Como Remoto
Trabajo Remoto Y Colaboración
Git Con Visual Studio Code
Trabajo Remoto Y Colaboración
Git Con Intellij Idea
Trabajo Remoto Y Colaboración
Git Con Github Desktop
Trabajo Remoto Y Colaboración
Crear Y Organizar Issues En Github
Trabajo Remoto Y Colaboración
Github Pages Para Crear Sitios Web
Trabajo Remoto Y Colaboración
Repositorio Especial Username Github
Trabajo Remoto Y Colaboración
Pull Requests (Pr) En Github
Integración Continua Ci
Ci Con Github Actions
Integración Continua Ci
Análisis Estático Con Sonarcloud
Integración Continua Ci
Desplegar En Vercel Desde Github
Integración Continua Ci
Certificados de superación de Git
Supera todos los ejercicios de programación del curso de Git y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender el uso y propósito de
git stash
. - Aprender a guardar cambios temporales con
git stash save
. - Visualizar y gestionar stashes con
git stash list
. - Recuperar cambios con
git stash pop
ygit stash apply
. - Resolver conflictos al aplicar stashes.
- Limpiar la pila de stashes innecesarios.