Control de versiones distribuidos con Mercurial

Existen diversos programas para control de versiones, algunos centralizados (como CVS, SVN, etc.), otros descentralizados (git, bazaar, darcs, arch, etc.)

El esquema tradicionalmente usado es el modelo centralizado, en donde hay un repositorio en un servidor central contra el cual todos trabajan. Es el modelo que sigue GNOME. Cuando se ha usado por años, da la impresión que es la forma de trabajar.

No me referiré, sin embargo, al uso en proyectos grandes. Sino más bien al uso personal, ya sea para mantener bajo control los cambios realizados a distintos documentos, programas, páginas web, etc. En esta situación, es incómodo pensar en un servidor central. ¿Qué sucede si estoy desconectado y quiero realizar cambios? ¿O quiero volver hacia atrás? O simplemente, si quiero comenzar un nuevo repositorio.

En estos casos es muy útil contar con sistema de control de versiones distribuidos, no por el hecho de ser distribuida, sino porque no depende de un servidor central. Cualquiera podría llegar a serlo. De las alternativas, la que me gusta más es Mercurial. Es rápido, ocupa relativamente poco espacio y es fácil de usar. Bueno, hay más pero no quiero extenderme. Al final de este mensaje menciono varias lugares donde obtener más información.

En Debian o Ubuntu la instalación es fácil, y está disponible la última versión estable.

$ sudo apt-get install mercurial

Pero instalarlo en forma local es muy sencillo. Es 95% Python y 5% C (para las partes que se requiere eficiencia).

Un uso común: dispongo de un proyecto pequeño y deseo comenzar a controlar los cambios sin necesidad de inundarme de directorios proyeco-1, proyecto-2, proyecto-3, proyect-4-este-si-que-si, proyecto-final, proyecto-final-2, etc.

$ cd proyecto
$ hg init
$ hg add archivo1 archivo2 archivo3 archivo4 ...
$ hg commit

Todo el historial quedará almacenado en un subdirectorio llamado .hg. Luego, se puede trabajar y añadir los cambios que se deseen y aplicarlos con commit.

Para partir una nueva rama de trabajo, entonces basta obtener una copia y trabajar en ella.

$ hg clone proyecto proyecto-bar

Si además, converso con un amigo que quiere ayudar. Bueno, es posible habilitar un servidor web y que tome los cambios desde allí:

$ hg serve

La otra persona podrá obtener una copia de mi repositorio fácilmente con:

$ hg clone http://ip.de.mi.equipo:8000/

Con eso obtendrá una copia completa del proyecto, incluyendo el historial de cambios. Incluso, en el futuro podrá «traer» los cambios desde el repositorio y examinar la evolución del proyecto en el otro equipo, para ello basta ejecutar:

$ hg pull

Además, posee un visor de cambios similar al que cuenta con git. Basta invocarlo con:

$ hg view

Para cambiar de versiones de trabajo, basta ejecutar:

$ hg update

Donde id corresponde al identificador de cambios (en estricto rigor de un conjunto de cambios). Así es posible ir hacia adelante, hacia atrás de forma muy rápida. id se obtiene con el mismo visor o bien a través de:

$ hg log

Lo mejor de todos, es que si uno desea realizar pruebas de comandos sin dañar un proyecto en curso, se crea un repositorio nuevo o se puede sacar una copia de alguno existente. Es rápido y fácil. Por otro lado, la interfaz web permite muchas más cosas, como exportar un los cambios en formato RSS, o entregar una copia al vuelo en tar.gz, zip o tar.bz2.

Rafael Villar Burke (pachi) ha escrito artículos sobre mercurial, que explica muy bien, desde los conceptos básicos hasta el trabajo diario. En el sitio de Mercurial también hay suficiente documentación, como la guía guía rápida es muy buena para los impacientes. También hay tutoriales traducido a varios idiomas.

Para mí es útil, porque puedo trabajar en varios equipos (computadores). Antiguamente usaba rsync para todas esas operaciones, pero requería acordarme en cual fue el último donde trabaje. Si cometía un error, perdía los cambios. Ahora no.