sábado, 16 de noviembre de 2013

Ficheros perdidos en el Stash. The lost file in the Stash



Hoy en la oficina hemos simulado un caso donde nuestro querido Yeradis, vino con un problema con el stash, donde "mágicamente" desaparecieron los ficheros que intentaba subir a git.

Yeradis siempre te abre un mundo donde las cosas ocurren  de una manera un tanto especial.

Y si, de verdad que desaparecen. Y tiene su lógica, aunque a priori, parece una incongruencia, profundizando , observaremos que el funcionamiento es el adecuado.

Vamos a realizar todos los pasos, porque son muy sencillos replicarlos en un simple directorio.
Creamos un directorio y nos colocamos y ejecutamos;

$ git init
$ touch readme
$ git commit -am "prueba"

Bien, tenemos ya nuestro primer commit en el repositorio local.
Ahora vamos a crear otro fichero, pero lo meteremos en el stash.



Bien, el fichero noseve.txt, efectivamente no se ve.
Si aplicamos $ git stash pop, volvería a parecer, borrando el stash, teniendo el fichero en cuestión.

Ahora bien, cuando usamos "herramientas visuales", a veces las facilidades nos causan destrozos, como por ejemplo, desde SourceTree, y le damos a "borrar" el stash. ¿ Donde está fichero ?

Ya no se puede recuperar. Porque no hay nada. El fichero noseve.txt, al estar en el stash, y borrar el stash, no podemos recuperarlo.

Para simularlo desde la consola, vamos a eliminar la pila del stash, borrando el contenido.
$git stash drop stash@{0}
Dropped stash@{0} (41fd10ece492b8f2f4911af2522bbf60b66ed789)

Horror! GIT ELIMINA FICHEROS SIN AVISAR!! ( mode yeradis )

Hay que ser piltrafilla ;-)

Como se ha realizado un movimiento, bueno, en este caso 2 movimientos, uno es dejarlo en el index, y el otro moverlo al stash, podemos seguir su rastro con este comando;
git fsck --unreachable | grep commit


Esto nos va a mostrar los sha1 , el del index y el del stash.
Y si tenemos el sha1, tenemos los ficheros ;-)

Creamos una rama para ubicarlos temporalmente o hacer un merge en la rama actual;
git checkout -b rama_test 41fd10ece492b8f2f4911af2522bbf60b66ed789
git merge 41fd10ece492b8f2f4911af2522bbf60b66ed789

Ahora, si miras los ficheros, verás que aparece por ahí el noseve.txt. ;-)




















Cada día que pasa, más me gusta Git.

No hay comentarios:

Publicar un comentario

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...