Si estás trabajando en un proyecto de software, ya sea solo o en un equipo, considero imprescindible el uso de un control de versiones. En el caso de que estés solo en ese proyecto no tendrás problema con lo que haces en el repositorio, puedes hacer tantos commits como quieras, no te tienes que preocupar de si habrá una nueva versión en remoto ni nada por el estilo. Sin embargo, ¿qué sucede cuando trabajas con un equipo? ¿Qué sucede cuando sois varios los que estáis metiendo mano en el mismo repositorio?
Es llegado ese caso cuando hay posibilidad de que solapéis vuestros pulls
. También es muy posible que estés trabajando en una parte del proyecto que no esté terminada y necesites cambiar a otra rama para realizar un trabajo específico.
¿Qué haces entonces? ¿Qué hacer con el trabajo que tienes a medio terminar? ¿Lo confirmas? La solución se encuentra en stash
.
git stash
git stash
es una herramienta realmente poderosa que resuelve el problema anterior. Se trata de un comando que permite guardar los cambios que has hecho en tu directorio de trabajo, dejándolo completamente limpio.
De esta forma es posible guardar el estado del directorio lo tengas como lo tengas. El comando guarda todas las modificaciones locales y hace coincidir el directorio de trabajo con el HEAD
. Es decir, con la cabeza de nuestro repositorio.
Digamos que con git stash
tienes un almacén donde guardar temporalmente todo lo que tengas a medio terminar. Evidentemente, el archivo tiene que estar bajo control de versiones. Es decir, tienes que haber hecho un git add
sobre él o, lo que es lo mismo, debe estar pendiente de ser confirmado, es decir, pendiente de hacer un commit
.
Por otro lado, git stash
dispone de una serie de herramientas que te van a permitir hacer todo tipo de operaciones, operaciones relacionadas con guardar y sacar archivos de este almacén temporal.
En los próximos apartados encontrarás cada una de estas herramientas. Te las voy a indicar conforme vamos avanzando en un proyecto, para que el proceso sea más clarificador.
git stash push
El primer paso, como siempre sueles hacer, es iniciar tu repositorio con git init
. A continuación, crea un archivo touch doc1.md
y añádelo al repositorio con git add doc1.md
y lo confirmas con git commit -m "doc1"
.
Si todo ha ido como debe ser, la foto debe tener un aspecto como este:
commit 976da2 (HEAD -> master) Author: Date: doc1
Crea y añade un nuevo archivo, pero no lo confirmes. En lugar de eso, tienes que hacer un `git stash push -m «primer». En resumidas cuentas, los pasos que tienes que hacer son los siguientes:
$ touch doc2.md $ git add doc2.md $ git stash push -m "primer"
De esta manera, si haces un git log
, verás que tu foto es exactamente igual que anteriormente. Pero, además, el directorio de trabajo está completamente limpio, como si no hubieras hecho absolutamente nada.
¿Dónde está el documento doc2.md
? Ahora te digo dónde está. Sin embargo, debo hacerte una observación antes. Y es que también es posible hacer un git stash push
sin tanta parafernalia. Simplemente git stash
. El único inconveniente es que no te va a dejar introducir un mensaje. Pero, por contra, es mucho más rápido y práctico.
git stash list
Ahora toca averiguar a dónde ha ido a parar tu archivo doc2.md
. Pues esto es tan sencillo como ejecutar git stash list
. En tu caso, te debe dar el siguiente resultado, o parecido:
stash@{0}: On master: primer
Crea conmigo unos cuantos archivos más para añadirlos unos al stash y otros los confirmas. Para dejarlo claro, las operaciones a realizar son las siguientes:
touch doc3.md git add doc3.md git stash touch doc4.md git add doc4.md git commit -m "doc4.md" touch doc5.md git add doc5.md git stash
Si has copiado y pegado estas instrucciones en un terminal el resultado de ejecutar git log --graph
será algo como:
commit 85967f (HEAD -> master) | Author: | Date: | doc4.md * commit 976da2 Author: Date: doc1
Y si haces un git stash list
el resultado debería arrojarte un resultado como el que ves:
stash@{0}: WIP on master: 85967ff doc4.md stash@{1}: WIP on master: 976da25 doc1 stash@{2}: On master: primer
Si te das cuenta, stash
se comporta como una pila (de apilar, amontonar), de forma que lo primero que entra está al final de la pila (en este caso, en la posición 2) mientras que lo último que has introducido está en la primera posición.
git stash show
Para obtener mas información de cada una de las operaciones git stash
que has realizado, tienes git stash show
. Así, para ver lo correspondiente a la operación de la pila 1, tienes que ejecutar git stash show 1
. Esto te arrojará el siguiente resultado:
doc3.md | 0 1 file changed, 0 insertions(+), 0 deletions(-)
git stash pop
Ahora ya sabes qué es lo que tienes en la pila, pero ¿qué puedes hacer con ello? Pues, como te puedes imaginar, las opciones son: sacarlo y utilizarlo, o sacarlo y tirarlo.
La primera de las opciones, la de sacarlo y utilizarlo, se realiza con git stash pop
. Esta posibilidad quita un elemento de la lista, el que tú le indiques, y lo aplica en el directorio de trabajo. Vamos, que hace exactamente el paso opuesto al que has visto antes de git push
. En el caso de que se produzca algún conflicto al intentar aplicarlo, no saldrá de la pila, si no que permanecerá en ella. Tienes que resolver los conflictos y luego quitar el elemento de ella.
Así, en el ejemplo que llevas entre manos, saca el elemento 1 de la lista. Para ello, ejecuta git stash pop 1
. Ahora solo te queda confirmar el cambio con un git commit -m "doc3"
.
Ahora, si ejecutas un git stash list
, el resultado será el siguiente:
stash@{0}: WIP on master: 85967ff doc4.md stash@{1}: On master: primer
git stash drop
¿Y qué sucede si, simplemente, quieres sacar un cambio de la pila pero no aplicarlo? Para estos casos tienes git stash drop
. Así, por ejemplo, si quisieras quitar el 0
, tendrías que ejecutar:
git stash drop 1
Y si quisieras borrar todo lo que queda en la pila solo tendrías que ejecutar la orden:
git stash clear
Y así la pila te ha quedado completamente limpia.
Conclusiones
Ya has podido ver el potencial de esta herramienta, que te puede salvar en más de una ocasión. Solo te queda practicar con ella y sacarle el máximo rendimiento. Sinceramente, espero que lo hagas.
Documentación
Git/ git stash
Tutoriales y libros sobre Git
La imagen de la portada es CC0 Creative Commons. Fue realizada por Markus Spiske.
Git y el logo de Git son ambos marcas registradas de Software Freedom Conservancy, Inc.
Gran trabajo Lorenzo, cuando acabe con las decenas de cosas que llevo a mis espaldas, a ver si encuentro un hueco y lo pruebo. Saludos!!