Abr 272015
 

Una de las operaciones más frecuentes durante el desarrollo de un proyecto en el que se utiliza un sistema de control de versiones, es la de revisar las diferencias entre un fichero en el área de trabajo, y la última versión del mismo fichero guardada en el repositorio.

Por otra parte, una herramienta gráfica que presente de forma visual las diferencias entre dos versiones de un fichero de texto puede hacer mucho más cómoda la comparación.

En este artículo se explica la manera de realizar esta y otras operaciones similares en un proyecto que utiliza el sistema de control de versiones git.

 1. El área de trabajo, el área de “staging” y el repositorio de git

Cada instalación de git es un repositorio completamente independiente, a diferencia de otros sistemas de control de versiones como subversion, en donde hay un único repositorio central para un conjunto de clientes.

Por esta razón, un mismo fichero puede encontrarse en estados distintos en tres ubicaciones distintas:

  • El área de trabajo – Es el lugar en donde se editan los ficheros del proyecto.
  • El área de “staging” – Cuando se utiliza el comando “git add”, una copia de los ficheros modificados se guarda en una zona de almacenamiento intermedio, llamada “área de staging”. Si posteriormente se continúan modificando los ficheros en el área de trabajo, se pueden actualizar las copias en el área de “staging” volviendo a ejecutar el comando “git add”.
  • La versión guardada en el repositorio – Cuando se utiliza el comando “git commit”, las copias de ficheros existentes en el área de “staging” se guardan en el repositorio como una nueva versión del proyecto.

2. Comparar visualmente dos versiones de un fichero

La comparación entre dos versiones de un mismo fichero se realiza mediante el comando “git diff”. Utilizando el modificador correspondiente, podemos especificar cuales són las versiones a comparar:

  • git diff <fichero> – compara el contenido del fichero en el área de trabajo con el del área de staging
  • git diff HEAD <fichero> – compara el contenido del fichero en el área de trabajo con el de la última versión guardada en el repositorio
  • git diff –staged <fichero> – compara el contenido del fichero en el área de staging con el de la última versión guardada en el repositorio

En los tres casos, las diferencias entre las dos versiones comparadas se muestran en el terminal de texto.

Para realizar una comparación visual, podemos sustituir “git diff” por “git difftool –tool=<tool>” en cualquiera de los comandos anteriores.

Ejemplo:

Creamos un fichero “prueba.txt”, cuyo contenido inicial es:

Este es un fichero de prueba
La versión inicial tiene tres líneas
Esta es la última línea

Añadimos el fichero al área de staging:

$ git add prueba.txt

Y a continuación lo modificamos en el área de trabajo. El contenido modificado es:

Este es un fichero de prueba
La segunda versión tiene cuatro líneas
Esta es una línea añadida en la segunda versión
Esta es la última línea

Si realizamos la comparación estándar con el comando “git diff”, obtenemos en el terminal el siguiente resultado:

$ git diff prueba.txt
diff --git a/classes/prueba.txt b/classes/prueba.txt
index 0b83146..8443e54 100644
--- a/classes/prueba.txt
+++ b/classes/prueba.txt
@@ -1,3 +1,4 @@
 Este es un fichero de prueba
-La versión inicial tiene tres líneas
+La segunda versión tiene cuatro líneas
+Esta es una línea añadida en la segunda versión
 Esta es la última línea
$

Pero si realizamos la comparación utilizando una herramienta visual, como por ejemplo “meld”, obtenemos un resultado mucho más cómodo de leer:

$ git difftool --tool=meld prueba.txt

Viewing: 'prueba.txt'
Launch 'meld' [Y/n]:

git-visual-diff

La herramienta visual resalta con un fondo de color las líneas añadidas, eliminadas o modificadas, y además permite editar el fichero en el área de trabajo, copiando de la versión guardada las líneas que se quieran recuperar.

Otras herramientas visuales disponibles en difftool

Además de “meld”, el comando “git difftool” admite otras herramientas visuales de comparación. En la página de manual “git-difftool” se mencionan las siguientes:

araxis, bc3, deltawalker, diffuse, emerge, ecmerge, gvimdiff, kdiff3, 
kompare, meld, opendiff, p4merge, tkdiff, vimdiff and xxdiff

 

 Publicado por en 7:50 am

 Deja un comentario

(requerido)

(requerido)