Trucos que te ayudarán con Git

A menudo no aprovechamos las herramientas de que disponemos, no les sacamos todo el partido que podríamos. A menudo, conocer la potencia de esas herramientas nos ahorraría trabajo. Es el caso de unos cuantos “trucos” de Git (nada excepcional, está todo en el manual) que hoy os contamos.

git

¿Qué es Git?

Git, para quien aún no lo conozca, es un sistema de control de versiones, que tiene la particularidad de ser distribuido (no requiere que haya un repositorio central de código) y altamente eficiente manejando múltiples ramas de desarrollo.

Normalmente bastan unos cuantos comandos para trabajar con git y rara vez necesitamos hacer algo más elaborado. La siguiente lista de sentencias sirve para: obtener el código fuente, guardar los cambios que hayamos hecho en el histórico, y publicar los cambios:

$ git clone <url del repositorio>
#hacer cambios
$ git commit -m '<descripción de los cambios>'
$ git push

Ésto, junto con el comando pull para obtener los cambios remotos que hayan publicado nuestros compañeros, suele ser más que suficiente para el trabajo del día a día.

No obstante, de vez en cuando se dan situaciones en las que el resto de operaciones de git resultan particularmente útiles. Hoy vamos a ver cómo deshacer cambios.

La orden git log muestra el historial de cambios en el código, de forma que podemos identificar inmediatamente el autor, fecha, archivos afectados, motivo del cambio, etc. Supongamos que tenemos el siguiente historial en git:

$ git log
commit 7b94588...
Author: Carlos López
Date: Mon Jun 10 13:10:33 2013 +0200

<descripción de los cambios>

commit 6b1b744...
Author: Carlos López
Date: Mon Jun 10 13:00:33 2013 +0200

<estado anterior del código>
[...]

Y queremos deshacer precisamente ese cambio (7b94588…), dejando el código tal y como estaba en la versión anterior (6b1b744…).

Es posible volver a una versión anterior del código mediante git reset. Es la opción más sencilla, aunque debemos usarla únicamente si los cambios no se habían publicado (es decir, el cambio es local, hemos hecho commit, pero no hemos hecho push), y tiene el inconveniente de que los cambios que deshacemos se pierden por completo (digamos que no hay una opción de “rehacer”).

$ git reset --hard 6b1b744

No obstante, si el código ya había sido publicado, tenemos otras opciones (también más seguras).

Por supuesto, está la opción de volver a escribir los cambios. A menudo, simplemente basta con dejar como estaba el código que hemos cambiado, volver a hacer commit indicándolo en el mensaje, y listo. Resulta fácil siempre que los cambios que tengamos que deshacer sean sencillos y localizados en uno o dos archivos de código.

$ git commit -m 'Deshago los últimos cambios porque el cliente ha cambiado de opinión'

Sin embargo, cuando el alcance del cambio es más amplio, o se produjo hace más tiempo, es difícil controlar qué debe cambiar, y recordar cómo estaba antes. Git nos permite hacerlo con facilidad. El comando git revert se encarga de dar la vuelta al commit que indiquemos:

$ git revert 7b94588

Tan sencillo como eso. Si hemos tenido cuidado de ir haciendo corresponder cada commit con un conjunto lógico de cambios (es decir, si procuramos evitar incluir en un mismo commit cambios que son independientes entre sí), git revert puede resultar una herramienta muy útil. El historial de cambios quedaría como sigue:

$ git log
commit 9f48bf
Author: Carlos López
Date: Tue Jun 11 12:01:27 2013 +0200

This reverts commit 7b94588, reversing
changes made to 6b1b744.

commit 7b94588...
Author: Carlos López
Date: Mon Jun 10 13:10:33 2013 +0200

<descripción de los cambios>

commit 6b1b744...
Author: Carlos López
Date: Mon Jun 10 13:00:33 2013 +0200

<estado anterior del código>
[...]

Por supuesto, estos comandos ofrecen muchas más opciones. Están documentados en:
https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
https://www.kernel.org/pub/software/scm/git/docs/git-reset.html