Git: guardar cambios no confirmados

Si ha estado trabajando con Git el tiempo suficiente, probablemente haya tenido momentos en los que realizó cambios en su base de código, pero necesitaba cambiar de rama o trabajar con el l...

Si ha estado trabajando con Git el tiempo suficiente, probablemente haya tenido momentos en los que realizó cambios en su base de código, pero necesitaba cambiar de rama o trabajar con la última versión funcional de su código. Sin embargo, no desea perder los cambios que ya realizó, pero aún no están listos para confirmar las actualizaciones ya que no están terminados. ¿Qué debes hacer?

Alijo Git

Afortunadamente, Git proporciona un mecanismo para manejar casos como este a través del comando git stash. El comando stash toma los cambios no confirmados en su directorio de trabajo, tanto los archivos rastreados actualizados como los cambios preparados, y los guarda.

Digamos que está trabajando en una nueva función y realizó algunas modificaciones en su código, y ahora tiene uno o más archivos con modificaciones no confirmadas:

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   index.js

no changes added to commit (use "git add" and/or "git commit -a")

Sin embargo, los cambios no han finalizado y debe cambiar a una rama diferente para corregir rápidamente un error antes de continuar con la función actual. Para evitar perder las actualizaciones actuales que ha realizado, puede ocultar los cambios y recuperarlos más tarde sin estropear su historial de confirmaciones.

1
2
3
$ git stash
Saved working directory and index state WIP on master: bbf6ef9 Initial commit
HEAD is now at bbf6ef9 Initial commit

Como puede ver, HEAD ahora está de vuelta en nuestra última confirmación, que en este caso es la confirmación inicial. Para verificar, busque cambios usando git status:

1
2
3
$ git status
On branch master
nothing to commit, working tree clean

¡Regresamos a donde empezamos como si nunca hubiéramos hecho los cambios! Ahora puedes salir y corregir ese error.

Pero, ¿qué pasa con la restauración de los cambios? Para recuperarlos, simplemente podemos usar el subcomando aplicar, que toma los últimos cambios guardados y los vuelve a colocar en su directorio de trabajo.

1
2
3
4
5
6
7
8
9
$ git stash apply
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   index.js

no changes added to commit (use "git add" and/or "git commit -a")

Y así, tienes tus cambios de vuelta.

Funciones avanzadas {#funciones avanzadas}

En los ejemplos anteriores, usamos stash en el contexto más simple. Como tendemos a descubrir en nuestra programación diaria, los casos de uso del mundo real no suelen ser tan simples. ¿Qué sucede si, por ejemplo, termina necesitando ocultar los cambios de su directorio de trabajo varias veces? Afortunadamente, stash te permite hacer precisamente eso. Técnicamente, cuando almacena cambios, Git coloca los cambios en una pila, que luego se puede extraer en un orden LIFO (último en entrar, primero en salir). Puede ver esta pila usando el subcomando list.

1
2
3
4
5
$ git stash list
[correo electrónico protegido]{0}: WIP on master: 7513525 Fixed console output
[correo electrónico protegido]{1}: WIP on master: 91f33cc Fixed output punctuation
[correo electrónico protegido]{2}: WIP on master: bbf6ef9 Initial commit
[correo electrónico protegido]{3}: WIP on master: bbf6ef9 Initial commit

El trabajo escondido en la parte superior de la lista es lo que obtendrá al usar el comando aplicar sin argumentos adicionales. Si hay un alijo diferente que le gustaría obtener en su lugar, puede especificarlo usando el identificador al comienzo de cada línea. Por ejemplo, para obtener el segundo alijo, usaría lo siguiente:

1
2
3
$ git stash apply [correo electrónico protegido]{1}
On branch master
nothing to commit, working tree clean

Puede notar que después de usar el subcomando aplicar, el alijo todavía estará en la pila. Para aplicarlo y eliminarlo de la pila, use pop en su lugar.

1
2
3
4
$ git stash pop [correo electrónico protegido]{0}
On branch master
nothing to commit, working tree clean
Dropped [correo electrónico protegido]{0} (9079b4ffdf46574701cffcd68eb4feba80ebcf72)

Este alijo ya no está en nuestra pila:

1
2
3
4
$ git stash list
[correo electrónico protegido]{0}: WIP on master: 91f33cc Fixed output punctuation
[correo electrónico protegido]{1}: WIP on master: bbf6ef9 Initial commit
[correo electrónico protegido]{2}: WIP on master: bbf6ef9 Initial commit

Pero, ¿qué sucede si desea eliminar un alijo sin aplicarlo a su directorio de trabajo actual? Esto se puede lograr con drop, que funciona sintácticamente como apply y pop:

1
2
$ git stash drop [correo electrónico protegido]{2}
Dropped [correo electrónico protegido]{2} (5483fdec3496572c8b943504b6029d45a7999453)

Y, como era de esperar, ese alijo no se aplicó y desapareció de la pila de alijo:

1
2
3
4
5
6
$ git status
On branch master
nothing to commit, working tree clean
$ git stash list
[correo electrónico protegido]{0}: WIP on master: 91f33cc Fixed output punctuation
[correo electrónico protegido]{1}: WIP on master: bbf6ef9 Initial commit

Conclusión

Como era de esperar, Git tiene una solución para la mayoría de los problemas que surgen en el control de versiones, ya que existe desde hace mucho tiempo. Aquí hemos visto cómo manejar el caso de uso en el que tiene cambios en su directorio de trabajo, pero desea cambiar de rama y no confirmar los cambios inconclusos. El comando stash puede ser muy poderoso, y tiene más funciones de las que se cubrieron aquí, como varias banderas disponibles, que guardaremos para otro artículo.

Licensed under CC BY-NC-SA 4.0