Control de Versiones

Introducción

Indice

  1. Definición
  2. Características
  3. Clasificación
  4. GIT vs Mercurial

Control de versiones

¿Qué es un control de versiones, y por qué debería importarte?

Un control de versiones o VCS (del inglés Version Control System) es un sistema que registra los cambios realizados en un archivo o conjunto de archivos a lo largo del tiempo, de modo que puedas recuperar versiones específicas más adelante.
Dicho sistema te permite regresar a versiones anteriores de tus archivos, regresar a una versión anterior del proyecto completo, comparar cambios a lo largo del tiempo, ver quién modificó por última vez algo que pueda estar causando problemas, ver quién introdujo un problema y cuándo, y mucho más.
Usar un VCS también significa generalmente que si arruinas o pierdes archivos, será posible recuperarlos fácilmente.

Características

Un sistema de control de versiones debe proporcionar:
  • Mecanismo de almacenamiento de los elementos que deba gestionar.
  • Posibilidad de realizar cambios sobre los elementos almacenados.
  • Registro histórico de las acciones realizadas con cada elemento o conjunto de elementos.

Clasificación

  • Locales
  • Centralizados
  • Distribuidos

Sistemas de versionado Locales

Un método de control de versiones usado por muchas personas es copiar los archivos a otro directorio (quizás indicando la fecha y hora en que lo hicieron, si son ingeniosos).
Antes de GIT
Este método es muy común porque es muy sencillo, pero también es tremendamente propenso a errores. Es fácil olvidar en qué directorio te encuentras, y guardar accidentalmente en el archivo equivocado o sobrescribir archivos que no querías.
Para afrontar este problema los programadores desarrollaron hace tiempo VCS locales que contenían una simple base de datos en la que se llevaba el registro de todos los cambios realizados a los archivos.
Una de las herramientas de control de versiones más popular fue un sistema llamado RCS, que todavía podemos encontrar en muchas de las computadoras actuales. Incluso el famoso sistema operativo Mac OS X incluye el comando rcs cuando instalas las herramientas de desarrollo.
RCS funciona guardando conjuntos de parches (es decir, las diferencias entre archivos) en un formato especial en disco, y es capaz de recrear cómo era un archivo en cualquier momento a partir de dichos parches.

Sistemas de versionado Centralizados

El siguiente gran problema con el que se encuentran las personas es que necesitan colaborar con desarrolladores en otros sistemas. Los sistemas de Control de Versiones Centralizados (CVCS por sus siglas en inglés) fueron desarrollados para solucionar este problema.
En un sistema de control de versiones centralizado todos nuestros fuentes y sus versiones están almacenados en un único directorio llamado repositorio de fuentes de un servidor.
Todos los desarrolladores que quieran trabajar con esos fuentes, deben pedirle al sistema de control de versiones una copia local para trabajar. En ella realizan todos sus cambios y cuando están listos y funcionando, le dicen al sistema de control de versiones que guarde los fuentes modificados como una nueva versión.
Tienen un único servidor que contiene todos los archivos versionados, y varios clientes que descargan los archivos desde ese lugar central. Este ha sido el estándar para el control de versiones por muchos años.
Ventajas
  • Todas las personas saben hasta cierto punto en qué están trabajando los otros colaboradores del proyecto.
  • Los administradores tienen control detallado sobre qué puede hacer cada usuario
Desventajas
  • La más obvia es el punto único de fallo que representa el servidor centralizado.

Cuando tienes toda la historia del proyecto en un mismo lugar, te arriesgas a perderlo todo.

CVS centralizados:

CVS

CVS ha estado durante mucho tiempo, y muchos desarrolladores están ya familiarizados con él. En su día fue revolucionario: fue el primer sistema de control de versiones de código abierto con acceso a redes de área amplia para desarrolladores, y el primero que ofreció "checkouts" anónimos de sólo lectura, los que dieron a los desarrolladores una manera fácil de implicarse en los proyectos.

CVS

CVS sólo versiona archivos, no directorios; ofrece ramas, etiquetado, y un buen rendimiento en la parte del cliente, pero no maneja muy bien archivos grandes ni archivos binarios. Tampoco soporta cambios atómicos.

Subversion

Subversion fue escrito ante todo para reemplazar a CVS es decir, para acceder al control de versiones aproximadamente de la misma manera que CVS lo hace, pero sin los problemas o falta de utilidades que más frecuentemente molestan a los usuarios de CVS.
Uno de los objetivos de Subversion es encontrar la transición a Subversion relativamente suave para la gente que ya está acostumbrada a CVS.

Subversión como evolución de CVS

  • Renombar, copiar y mover archivos y directorios sin perdida del histórico.
  • Commits atómicos.
  • Implementación de tres tipos de acceso:
  • Stand-alone
  • Local

Subversión como evolución de CVS

  • Apache + webDAV
  • Mejorado el sistema de permisos.
  • Reducción del riesgo de vulnerabilidades por sus distintos RA (repository access).
  • Integración con Project Software Manager (Por ejemplo: trac).

Sistemas de versionado Distribuidos

En un sistema de control de versiones distribuido no hay un repositorio central. Todos los desarrolladores tienen su propia copia del repositorio, con todas las versiones y toda la historia.
Por supuesto, según van desarrollando y haciendo cambios, sus fuentes y versiones van siendo distintas unas de otras. Sin embargo, los sistemas de control de versiones distribuidos permiten que en cualquier momento dos desarrolladores cualesquiera puedan sincronizar sus repositorios.
Si uno de los desarrolladores ha tocado determinados fuentes y el otro no, los modificados se convierten en la versión más moderna.

CVS distribuidos:

¿Notaste el scm en las páginas?

Software Configuration Management, también conocido como control de versiones, o control de revisiones, inclusive, control de código.

Mercurial

Mercurial ofrece, entre otras cosas, una completa indexación cruzada de archivos y conjutos de cambios; unos procotolos de sincronización SSH y HTTP eficientes respecto al uso de CPU y ancho de banda; una fusión arbitraria entre ramas de desarrolladores; una interfaz web autónoma integrada; portabilidad a UNIX, MacOS X, y Windows y más.

Características de Mercurial

  • Está implementado principalmente haciendo uso del lenguaje de programación Python, pero incluye una implementación binaria de diff escrita en C.
  • Mercurial es una herramienta de gestión de control de fuente distribuida gratuita. Maneja eficientemente proyectos de cualquier tamaño y ofrece una interfaz fácil e intuitiva.

Características de Mercurial

  • Es rápido y poderoso Mercurial maneja eficientemente proyectos de cualquier tamaño y tipo. Cada clon contiene el historial completo del proyecto, por lo que la mayoría de las acciones son locales, rápidas y convenientes.
  • Mercurial admite una multitud de flujos de trabajo y puede mejorar fácilmente su funcionalidad con extensiones.
  • Es fácil de aprender

GIT

GIT es un proyecto empezado por Linus Torvalds para manejar el arbol fuente del kernel de Linux. Esta diseñado para manejar proyectos muy grandes eficaz y velozmente.
Cada directorio de trabajo de GIT es un repositorio completo con plenas capacidades de gestión de revisiones, sin depender del acceso a la red o de un servidor central.

Características de GIT

  • Fuerte apoyo al desarrollo no lineal, por ende rapidez en la gestión de ramas y mezclado de diferentes versiones.
  • Gestión distribuida. Git le da a cada programador una copia local del historial del desarrollo entero, y los cambios se propagan entre los repositorios locales.
  • Los cambios se importan como ramas adicionales y pueden ser fusionados en la misma manera que se hace con la rama local.

Características de GIT

  • Los almacenes de información pueden publicarse por HTTP, FTP, rsync o mediante un protocolo nativo, ya sea a través de una conexión TCP/IP simple o a través de cifrado SSH.
  • Git puede emular servidores CVS, lo que habilita el uso de clientes CVS pre-existentes y módulos IDE para CVS pre-existentes en el acceso de repositorios Git.

Características de GIT

  • Los repositorios Subversion y svk se pueden usar directamente con git-svn.
  • Gestión eficiente de proyectos grandes, dada la rapidez de gestión de diferencias entre archivos, entre otras mejoras de optimización de velocidad de ejecución.
  • Todas las versiones previas a un cambio determinado, implican la notificación de un cambio posterior en cualquiera de ellas a ese cambio (denominado autenticación criptográfica de historial).

Características de GIT

  • Los renombrados se trabajan basándose en similitudes entre archivos, aparte de nombres de archivos, pero no se hacen marcas explícitas de cambios de nombre con base en supuestos nombres únicos
  • Realmacenamiento periódico en paquetes (archivos). Esto es relativamente eficiente para escritura de cambios y relativamente ineficiente para lectura si el reempaquetado (con base en diferencias) no ocurre cada cierto tiempo.

Bazaar

Es un sistema de control de versiones distribuido patrocinado por Canonical Ltd., diseñado para facilitar la contribución en proyectos de software libre y opensource.
Puede ser usado por un usuario único trabajando en múltiples ramas de un contenido local, o por un equipo colaborando a través de la red.
Está escrito en Python y tiene versiones empaquetadas para la mayoría de distribuciones GNU/Linux, así como Mac OS X y MS Windows.

GIT vs Mercurial

MacGyver vs James Bond
En realidad su origen es muy similar, hace algún tiempo el grupo de trabajo que desarrolla el kernel de Linux decidió escribir su propia herramienta de control de versiones.
Se abrieron dos vías de desarrollo, una capitaneada por el mismo Linus Torvals que desarrolló Git usando C, Bash y Perl, la otra la lideraba Matt Mackall que desarrolló Mercurial usando C y Python.
Al final se optó por Git en parte porque se finalizó unos días antes y en parte, dicen las malas lenguas, por ser obra de Linus.

GIT, el MacGyver de las herramientas de control de versión

Git parte del enfoque de Unix de que cada tarea concreta se haga con un ejecutable particular, de manera que las tareas más complejas se realicen combinando los ejecutables individuales.
Como consecuencia de ellos instalar Git supone la instalación de más de 100 programitas especializados en tareas concretas del control de versiones.
Esto eleva la dificultad de aprender Git pero aumenta exponencialmente su flexibilidad permitiendo que pueda ser configurado para dar soporte a los workflows de desarrollo más complejos que se nos puedan ocurrir.
Ese enfoque de combinar elementos sencillos para dar lugar a sistemas más potentes es lo que hace de Git el MacGyver de las herramientas de control de versión.

Mercurial, es como James Bond

Te sobrará tiempo para tomarte un martini con vodka

Sólo instala un ejecutable el cual se usa en cada situación con unos argumentos u otros. Esta sencillez facilita enormemente su aprendizaje y de hecho, se dice que los que conocen Subversion encuentran realmente fácil pasar a Mercurial porque los comandos principales son muy parecidos.
Hay que reconocer que en Mercurial todo es bastante intuitivo y limpio. Al final, el 80% del tiempo uno acaba usando siempre unos pocos comandos nada más. Mercurial ofrece sencillez.
Grandes proyectos de la comunidad libre lo utilizan, como el que desarrolla el mismo Python o varios de la fundación Mozilla.
Por eso, Mercurial es como James Bond, si lo utilizas en la situación correcta será capaz de solucionarla de manera espectacularmente elegante y aún te sobrará tiempo para tomarte un martini con vodka.
Ir al siguiente módulo