Empezamos respondiendo esta pregunta explicando que es el control de versiones. Lo definimos como la gestión de cambios en documentos, código fuente de un software, o cualquier otro tipo de ficheros. Hay dos tipos de sistemas de control de versiones:

  • Sistemas de control de versiones centralizados.
  • Sistemas de control de versiones distribuidos.

Veamos con más detalles cada uno de ellos.

Sistema de control de versiones centralizado

Un sistema de control de versiones centralizado (SCVC) utiliza un servidor central para almacenar todos los archivos y permite el trabajo colaborativo de un equipo. Trabaja sobre un repositorio único al que los usuarios pueden acceder desde un servidor central. La siguiente imagen puede clarificar el concepto de SCVC:

El repositorio indica un servidor central que está directamente conectado al puesto de trabajo de cada programador. Todos los programadores pueden actualizar (update) sus puestos de trabajo con los datos presentes en el repositorio o pueden hacer cambios (commit) en los mismos. Cada operación se realiza directamente en el repositorio.

A pesar que parece más conveniente mantener un solo repositorio, tiene algunos inconvenientes importantes:

  • No está disponible localmente, por lo que siempre es necesario estar conectado a una red para realizar cualquier acción.
  • Como todo está centralizado, si el servidor se rompe provocará la pérdida completa del proyecto.

Los sistemas de control de versiones distribuidos resuelven estos inconvenientes.

Sistema de control de versiones distribuido

Los sistemas de control de versiones distribuidos (en adelante SCVD) no dependen necesariamente de un servidor central para almacenar las versiones de los ficheros del proyecto.

En los SCVD cada programador tiene una copia local o clon del repositorio principal. Esto quiere decir que cada programador mantiene un repositorio local propio que contiene todos los archivos y metadata presente en el repositorio principal. Todos pueden operar con su repositorio local sin ninguna interferencia.

La siguiente imagen puede clarificar el concepto de SCVD:

Todos los programadores pueden actualizar sus repositorios locales con nuevos datos del servidor central con una operación llamada ‘pull‘ y persistir cambios en el repositorio principal con una operación llamada ‘push‘ desde su repositorio local. El hecho de clonar un repositorio entero en tu propio puesto de trabajo para tener un repositorio local proporciona las siguientes ventajas:

  • Todas las operaciones (excepto push y pull) son muy rápidas porque la herramienta sólo necesita acceder al disco duro, no a un servidor remoto. Por tanto, no siempre se necesita conexión a internet.
  • Los nuevos cambios se pueden guardar (commit) localmente sin manipular los datos del repositorio principal. Una vez se tenga listo un conjunto de cambios, se pueden persistir (push) todos a la vez en el repositorio principal.
  • Dado que cada programador tiene una copia completa del repositorio del proyecto, pueden compartir los cambios entre sí si fuera necesario obtener un feedback antes de persistir los cambios en el repositorio principal.
  • Si el servidor central sufre algún percance en algún momento, los datos perdidos pueden ser recuperados fácilmente desde cualquiera de los repositorios locales de los colaboradores.

Y tras esta introducción teórica, podemos pasar a responder la pregunta que abría este artículo.

Los SCV permiten tener versiones -valga la redundancia- de un proyecto que muestran los cambios que se han hecho en el código a lo largo del tiempo, y permiten retroceder si fuera necesario y deshacer esos cambios. Esta capacidad por sí sola, de poder comparar dos versiones o revertir cambios, los hace muy valiosos cuando se trabaja en grandes proyectos. Un SCV no guarda copias completas de proyectos sino que tan sólo guarda los cambios. Un archivo ‘parche’ que podría aplicarse a una versión para que sea igual a la versión siguiente.

Para un proyecto con un único desarrollador, con estas ventajas serían más que suficientes. Pero los SCV aportan más ventajas si se trata de un proyecto en el que trabajan varios desarrolladores simultáneamente. Todas las versiones se almacenan en un servidor central y cada desarrollador verifica y carga los cambios de nuevo en este servidor.

Los beneficios de un sistema como éste es que varios desarrolladores pueden realizar cambios, y cada cambio puede atribuirse a un desarrollador específico. No podía terminar el artículo sin mencionar algún ejemplo de SCV. Probablemente el más conocido y utilizado sea Git, pero existen otros como Mercurial que es el utilizado por Openbravo.