Skip to content

Latest commit

 

History

History
236 lines (158 loc) · 6.25 KB

File metadata and controls

236 lines (158 loc) · 6.25 KB

Curso: Dominando Git y la Conexión con la Nube

Introducción

Estás trabajando en algo a medias cuando de repente surge algo urgente: un bug en producción, un compañero que necesita que le eches un vistazo a algo, o simplemente que tienes que cambiar de rama por cualquier razón.

El problema: tienes cambios sin terminar en tu rama actual. No están listos para un commit. ¿Qué haces?

Una opción sería hacer un commit a medias con un mensaje tipo "trabajo en progreso". Funciona, pero ensucia el historial con commits que no significan nada.

La solución es el stash. Git te permite guardar esos cambios en un cajón temporal, dejar la rama limpia, hacer lo que necesitas, y luego recuperarlos cuando vuelvas.

El escenario

Vamos a trabajar sobre mi-proyecto. Tenemos la rama main con index.html, index.js y style.css. Nos piden añadir una sección de contacto a la web, así que creamos una rama para eso:

git switch -c feature/contacto
Switched to a new branch 'feature/contacto'

Empezamos a trabajar. Añadimos una nueva sección al final del <body> en index.html:

index.html

<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <title>Mi proyecto</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <section id="contacto">
      <h2>Contacto</h2>
      <p>Puedes escribirnos a:</p>
      <!-- falta añadir el email, lo busco luego -->
    </section>

    <script src="index.js"></script>
  </body>
</html>

A medias. Nos falta completarlo, pero de momento lo guardamos.

En ese momento nos llega un mensaje: hay un error en main, el título de la página pone "Mi proyecto" y debería poner "Mi empresa". Hay que arreglarlo ya.

El problema es que si intentamos cambiar a main ahora mismo, tenemos cambios sin confirmar. No podemos dejarlos ahí tirados, pero tampoco queremos hacer un commit con el trabajo a medias.

Guardar el trabajo con stash

Guardamos los cambios en el stash con un mensaje descriptivo:

git stash push -m "sección contacto a medias, falta el email"
Saved working directory and index state On feature/contacto: sección contacto a medias, falta el email

Git ha guardado los cambios y ha limpiado el directorio de trabajo. Si abres index.html ahora, la sección de contacto ha desaparecido. No se ha borrado, está guardada en el cajón.

Podemos comprobarlo con git status:

git status
On branch feature/contacto
nothing to commit, working tree clean

Cambiamos a main y arreglamos el problema

Ahora sí podemos cambiar de rama sin problema:

git switch main

Corregimos el título en index.html:

index.html

<title>Mi empresa</title>

Hacemos el commit:

git add index.html
git commit -m "Corrige el título de la página"
[main a4c1d2e] Corrige el título de la página
 1 file changed, 1 insertion(+), 1 deletion(-)

Mientras estamos en main, aprovechamos para empezar a añadir un pie de página. Lo añadimos en index.html:

index.html

<footer>
  <p>© 2026 Mi empresa</p>
  <!-- falta añadir los enlaces -->
</footer>

Pero antes de terminar nos llega otro aviso: ahora tenemos que revisar el trabajo de un compañero en otra rama. El pie de página también queda a medias.

Guardamos este segundo trabajo en el stash con su propio mensaje:

git stash push -m "footer en main a medias, faltan los enlaces"
Saved working directory and index state On main: footer en main a medias, faltan los enlaces

Ver qué hay en el stash

Ahora tenemos dos cosas guardadas en el cajón. Para verlas:

git stash list
stash@{0}: On main: footer en main a medias, faltan los enlaces
stash@{1}: On feature/contacto: sección contacto a medias, falta el email

El índice {0} es siempre el más reciente. El {1} es el anterior. Cuanto más alto el número, más antiguo.

Gracias a los mensajes descriptivos sabemos exactamente qué hay en cada uno sin necesidad de abrirlos.

Recuperar el trabajo

Terminamos lo que teníamos que hacer con el compañero. Ahora queremos retomar el pie de página en main. Estamos en main, así que recuperamos el stash {0}, que es el del footer:

git stash pop
On branch main
Changes not staged for commit:
        modified:   index.html

Dropped refs/stash@{0} (a1b2c3d...)

pop sin especificar nada recupera siempre el {0}, el más reciente. El footer ha vuelto. Lo terminamos y hacemos el commit:

git add index.html
git commit -m "Añade pie de página"

Ahora volvemos a feature/contacto para terminar la sección de contacto:

git switch feature/contacto

Recuperamos el stash que queda:

git stash pop
On branch feature/contacto
Changes not staged for commit:
        modified:   index.html

Dropped refs/stash@{0} (e5f6g7h...)

La sección de contacto ha vuelto exactamente como la dejamos. El cajón está vacío. Podemos continuar.

La diferencia entre pop y apply

Cuando quieres recuperar un stash tienes dos opciones:

git stash pop
git stash apply

La diferencia:

  • pop — aplica el stash y lo borra de la lista. Es lo que usarás el 99% de las veces.
  • apply — aplica el stash pero lo mantiene en la lista. Útil si quieres aplicar los mismos cambios en varias ramas.

Eliminar un stash sin aplicarlo

Si tienes un stash guardado que ya no necesitas, puedes borrarlo sin aplicarlo:

git stash drop stash@{0}

Para limpiar todos los stashes de golpe:

git stash clear

Cuándo usar stash y cuándo no

El stash es para trabajo temporal, de minutos u horas. Si guardas algo y no lo recuperas en el día, es fácil olvidarse de que está ahí.

Para trabajo que va a durar más tiempo, es mejor hacer un commit con un mensaje de "WIP"(work in progress) o algo similar en tu propia rama. Al menos así queda registrado en el historial y no corre riesgo de perderse.

En la siguiente guía verás los forks: cómo contribuir a proyectos de otras personas en GitHub sin tener permisos de escritura sobre el repositorio original.