1

Trabajando con el historial en Git

Observando los cambios
Con la orden git log podemos ver todos los cambios que hemos hecho:

$ git log
commit fd4da946326fbe8b24e89282ad25a71721bf40f6
Author: Sergio Gómez 
Date: Sun Jun 1612:51:012013 +0200

Se añade un comentario al cambio del valor por defecto

commit 3283e0d306c8d42d55ffcb64e456f10510df8177
Author: Sergio Gómez 
Date: Sun Jun 1612:50:002013 +0200

Se añade un parámetro por defecto

commit efc252e11939351505a426a6e1aa5bb7dc1dd7c0
Author: Sergio Gómez <[email protected]>Date: Sun Jun 1612:13:262013 +0200

Parametrización del programa

commit e19f2c1701069d9d1159e9ee21acaa1bbc47d264
Author: Sergio Gómez <[email protected]>Date: Sun Jun 1611:55:232013 +0200

Creación del proyecto

Esto es solo un ejemplo del ejercicio que estoy haciendo, a ti que estas usando el comando git log no te va a salir esto, pero si algo muy similar con los cambios que hayas hecho en tu repositorio.

También es posible ver versiones abreviadas o limitadas, dependiendo de los parámetros:

$ git log--oneline
fd4da94 Se añade un comentario al cambio del valor por defecto
3283e0d Se añade un parámetro por defecto
efc252e Parametrización del programa
e19f2c1 Creación del proyecto
git log--oneline --max-count=2
git log--oneline --since='5 minutes ago'
git log--oneline --until='5 minutes ago'
git log--oneline --author=sergio
git log--oneline --all

Una versión muy útil de git log esla siguiente, pues nos permite ver en que lugar es está master y HEAD, entre otras cosas:

$ git log --pretty=tformat:'%h %ad | %s%d [%an]' --graph --date=short
* fd4da94 2013-06-16 | Se añade un comentario al cambio del valor por def
ecto (HEAD, master) [Sergio Gómez]
* 3283e0d 2013-06-16 | Se añade un parámetro por defecto [Sergio Gómez]* efc252e 2013-06-16 | Parametrización del programa [Sergio Gómez]* e19f2c1 2013-06-16 | Creación del proyecto [Sergio Gómez]

Crear alias

Como estas órdenes son demasiado largas, Git nos permite crear alias para crear nuevas órdenes parametrizadas. Para ello editaremos un archivo llamado .gitconfig que está en nuestro $HOME y le añadiremos estas líneas al final:

[alias]
hist = log --pretty=tformat:'%h %ad | %s%d [%an]' --graph --date=short

Recuperando versiones anteriores

Cada cambio es etiquetado por un hash, para poder regresar a ese momento del estado del
proyecto se usa la orden git checkout.

$ git checkout e19f2c1
Note: checking out 'e19f2c1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want tocreate a new branch to retain commits you create, you may
do so (nowor later) byusing -b with the checkout command again. Exampl
e:

git checkout -b new_branch_name

HEADisnowat e19f2c1... Creación del proyecto
$ cat hola.php
<?php
echo "Hello, World\n";

El aviso que nos sale nos indica que estamos en un estado donde no trabajamos en ninguna rama concreta. Eso significa que los cambios que hagamos podrían “perderse” porque si no son guardados en una nueva rama, en principio no podríamos volver a recuperarlos. Hay que pensar que Git es como un árbol donde un nodo tiene información de su nodo padre, no de sus nodos hijos, con lo que siempre necesitaríamos información de dónde se encuentran los nodos finales o de otra manera no podríamos acceder a ellos.
Volver a la ultima version de la rama master
Usamos git checkout indicando el nombre de la rama:

$ git checkout masterPrevious HEAD position was e19f2c1... Creación del proyecto

Etiquetando versiones
Para poder recuperar versiones concretas en la historia del repositorio, podemos etiquetarlas, lo cual es más facil que usar un hash. Para eso usaremos la orden git tag.

$ git tagv1

Ahora vamos a etiquetar la versión inmediatamente anterior como v1-beta. Para ello podemos usar los modificadores ^ o ~ que nos llevarán a un ancestro determinado. Las siguientes dos órdenes son equivalentes:

$ git checkout v1^
$ git checkout v1~1
$ git tag v1-beta

Si ejecutamos la orden sin parámetros nos mostrará todas las etiquetas existentes.

$ git tagv1
v1-beta

Y para verlas en el historial:

$ git hist master --all
* fd4da94 2013-06-16 | Se añade un comentario al cambio del valor por def
ecto (tag: v1, master) [Sergio Gómez]
* 3283e0d 2013-06-16 | Se añade un parámetro por defecto (HEAD, tag: v1-b
eta) [Sergio Gómez]
* efc252e 2013-06-16 | Parametrización del programa [Sergio Gómez]* e19f2c1 2013-06-16 | Creación del proyecto [Sergio Gómez]

Borrar etiquetas
Para borrar etiquetas:

git tag-d nombre_etiqueta

Visualizar cambios
Para ver los cambios que se han realizado en el código usamos la orden git diff. La orden sin especificar nada más, mostrará los cambios que no han sido añadidos aún, es decir, todos los cambios que se han hecho antes de usarla orden git add. Después se puede indicar un parámetro y dará los cambios entre la versión indicada y el estado actual. O para comparar dos versiones entre sí, se indica la más antigua y la más nueva. Ejemplo:

$ git diff v1-beta v1
diff --git a/hola.php b/hola.php
index a31e01f..25a35c0100644
--- a/hola.php
+++ b/hola.php
@@ -1,3 +1,4 @@
<?php
+// El nombre por defecto es Mundo
$nombre = isset($argv[1]) ? $argv[1] : "Mundo";
@print "Hola, {$nombre}\n";
Escribe tu comentario
+ 2