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.

miércoles, 6 de noviembre de 2013

Git. Creando un Custom Action.


Una de las cosas que más uso en GIT, es la combinación de mirar diferencias entre diversas ramas y comprobar si en la rama donde estoy actual, necesito hacer un refactor de una rama a otra.

No, no puede fusionarlas, porque son paralelas, y algunas cosas que están de una manera , en otra se hacen de otra, por lo tanto, "master" hay más de una.

Entonces, era muy fácil coger el hash sobre el cual quiero mirar un archivo en concreto.

Por ejemplo:

git difftool 23dc453a stdio.h

Esto hace que se nos abre nuestro comparador , y podamos comparar contra el commit 23dc453a y modificar nuestro fichero stdio.h 

Si esto lo hacemos desde SourceTree , con External Diff, tenemos el inconveniente que siempre lo hace contra 2 ficheros temporal. Eso es una faena, porque por mucho que adaptemos el código, ese stdio.h es una copia del original.

Ahora con los "Custom Action" de SourceTree, podemos crear el comando adecuado que haga lo que nos interesa.

Primero, vamos a explicar que tenemos un problema, y es que el $SHA, nos esta devolviendo los 2 hash de los commit seleccionados en SourceTree.
Entonces, no podemos hacerlo directamente. 

Lo que haremos es crear un diff.bat, que va a contener lo siguiente;

git difftool %1 %3


Lo único que falta es crear el comando como esta imagen.



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...