¿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).
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 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.
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