Los sistemas de control de versiones son una parte fundamental para todo software de desarrollo. Los sistemas de control combinan el repositorio de archivos de un proyecto con un historial de todos los cambios de código que ha habido, lo que facilita la edición y la comprensión del código a lo largo del tiempo.
La principal ventaja de utilizar un sistema de control de versiones es que mantiene los flujos de trabajo de un equipo organizados a medida que distintos usuarios trabajan con varios tipos de versiones. Con un sistema de control de versiones en su lugar, los miembros del equipo pueden fácilmente investigar, rastrear y deshacer distintas partes del código. Pueden programar para el mismo proyecto simultáneamente sin que surjan conflictos entre las versiones. Estos sistemas pueden rastrear quién hizo qué cambios, cuándo y por qué.
Pero antes de implementar un sistema de control de versiones en el flujo de trabajo de un equipo, es necesario determinar cuál será el sistema adecuado para cada caso. Aunque la mayoría de las opciones tienen beneficios similares, sus diferencias son importantes.
Para entenderlas correctamente, lo primero que vamos a hacer es dejar clara la diferencia entre los sistemas de control de versiones centralizados y distribuidos.
La diferencia clave entre sistemas de control de versiones centralizados y distribuidos, gira en torno al hecho de que no hay bloqueo de elementos en un sistema distribuido.
Así que cada nuevo conjunto de cambios que hace un desarrollador es esencialmente como una nueva rama del código, que necesita ser fusionada de nuevo en el repositorio central. En el modelo distribuido, es posible que dos desarrolladores trabajen en el mismo archivo fuente al mismo tiempo.
Esa diferencia fundamental significa que:
El rendimiento de los sistemas distribuidos es mejor, porque no hay que esperar a que se produzcan bloqueos en conexiones de red potencialmente lentas. Además, el código base completo siempre está disponible en el sistema local.
La ramificación y la fusión son mucho más fáciles de lograr en un sistema distribuido, en gran medida porque está integrado en la forma en que funciona el sistema.
Con un sistema distribuido, no es necesario estar conectado a Internet todo el tiempo.
Por estas razones, muchas personas se han convertido en fans de los sistemas Gift, porque son distribuidos. Sin embargo, los sistemas centralizados como Subversion (SVN) también tienen algunos beneficios:
En definitiva, SVN y Git son los sistemas de control de versiones más populares del mundo. Estos son usados por los programadores de todo el planeta para almacenar su código, compartirlo con otros programadores y ayudarles de esta forma a trabajar juntos más fácilmente.
A continuación, analizaremos los pros y los contras el sistema de subversión y el Git
SVN también es conocido formalmente como Apache Sub Version, y se utiliza para almacenar y gestionar el código fuente, la documentación y las páginas web. La configuración del SVN requiere dos elementos:
SVN es un sistema de control de versiones usado para que varios desarrolladores puedan trabajar en un mismo proyecto en forma más o menos ordenada.
Tiene una arquitectura cliente servidor con controles de concurrencia para cuando varios desarrolladores están trabajando en el mismo archivo y funciona más o menos así:
En algún servidor se monta un repositorio SVN. En este lugar se van a registrar los cambios y revisiones, así como lo que se vaya generando. El cliente de SVN se baja una copia local de alguna revisión, generalmente la última, el desarrollador hace los cambios y los sube al servidor para que estén disponibles para los otros desarrolladores, además de generar un log con un comentario de qué modifico, para qué, etc.
El beneficio de la ramificación es la capacidad de hacer aportaciones al trabajo común sin romper el repositorio central. Sólo se fusiona en el repositorio cuando el código está libre de errores. Esto mantiene el proyecto estable. Y los usuarios generalmente aprecian lo fácil que es usar y entender SVN.
Sin embargo, trabajar en un servidor central significa que hay un solo punto de fallo. Si hay un error, puede destruir todas las construcciones. El acceso limitado fuera de línea es también un punto de queja frecuente.
Por su parte, Git es un sistema de control de versiones de código abierto o distribuido, que se utiliza en proyectos de gran y pequeña escala.
Mientras que los sistemas centralizados fueron el sistema de control de versiones preferido durante casi una década, Git los ha superado en los últimos años.
A diferencia de SVN, Git utiliza múltiples repositorios distribuidos: un repositorio central y una serie de repositorios locales. Los repositorios locales son copias exactas del repositorio central con el historial completo de cambios.
El flujo de trabajo de Git es similar al de SVN, pero con un paso más: para crear una nueva característica, utilizas una copia exacta del repositorio central para crear tu repositorio local en tu servidor local.
Luego trabajarás en tu repositorio local exactamente como lo harías en SVN creando nuevas ramas, etiquetas, etc. Cuando hayas terminado, fusiona tus ramas en tu repositorio local. Cuando esté listo para fusionarse en el repositorio central, pasarás los cambios del repositorio local al repositorio central.
Mucha gente prefiere Git para el control de versiones por las siguientes razones:
Debido a que se envía al repositorio central con más frecuencia en SVN, el tráfico de red ralentiza a todo el mundo. Mientras que con Git, trabajas principalmente en tu repositorio local y sólo te comprometes con el repositorio central de vez en cuando.
Con SVN, si el repositorio central se cae o algún código rompe la compilación, entonces ningún otro desarrollador puede confirmar el código hasta que el repositorio esté arreglado.
Al ser un sistema de control de versiones distribuido, con Git, cada desarrollador tiene su propio repositorio, así que no importa si el repositorio central está roto. Los desarrolladores pueden continuar enviando código localmente hasta que el repositorio central haya sido arreglado, y luego se pueden meter los cambios.
A diferencia de SVN, con Git puedes trabajar sin conexión, lo que permite a tu equipo seguir trabajando sin perder funciones si pierden la conexión.
Los equipos también optan por Git porque es de código abierto y multiplataforma, por lo que el soporte está disponible para todas las plataformas, lenguajes y frameworks. Y es compatible con prácticamente todos los sistemas operativos.
Hay una desventaja que resulta frustrante para los programadores: la creciente complejidad de los registros de cambios. Debido a que los desarrolladores toman medidas adicionales cuando se fusionan, los registros históricos de cada problema pueden volverse densos y difíciles de descifrar. Esto puede dificultar potencialmente el análisis de un sistema.