Git vs SVN: ¿Cuál elegir?

Dificultad: Fácil
Tiempo de Lectura: 7 minutos

Algo que sin lugar a dudas es muy importante en el proceso de desarrollo de Software son los sistemas de control de versiones. Y por supuesto, como todo, existen muchos de ellos.

Es por ello que hoy estaremos comparando dos de los sistemas de control de versiónes más conocido y utilizados en la actualidad Git y SVN.

Hace un tiempo nos enfocamos en un artículo llamado 10 razones para usar Git como sistema de control de versiones, pero creemos que no era todo lo que había para hablar sobre control de versiones y Git, por eso hoy decidimos compararlo con su archi rival SVN.

En este versus llamado Git vs SVN, veremos en detalle cuales son sus similitudes y diferencias, así como también sus ventajas y desventajas.

Esperamos que al final de este artículo puedas determinar cual es en tu caso el mejor de ellos según tus necesidades, el que te será más productivo para tu proyecto, grupo de desarrollo y/o la empresa en la cual trabajas.

¿Qué es un Sistema de Control de Versiones?

Primero que nada veamos una definición muy importante, ya que ambos SVN y Git son sistemas de control de versiones (VCS, Version Control System), debemos saber qué significa esto.

​Un sistema de control de versiones, le permite a los usuarios llevar un control de los cambios realizados en proyectos y además colaborar en ellos.

Al utilizar este sistema, los desarrolladores pueden trabajar juntos en un mismo proyecto, con tareas separadas, las cuales luego pueden combinar.

Algo también muy importante, es que pueden ver el historial de cambios realizados, saber quién los realizó, cuándo y por qué.

Además, también es posible volver a un cierto momento en la historia de un proyecto o utilizar/cambiar código que fue creado en cualquier punto de éste.

Pero antes de implementar un sistema de control de versiones en tu equipo de trabajo, siempre es necesario saber cuál es el más conveniente según tus necesidades, las de tu equipo y por supuesto el proyecto en el que están trabajando.

SVN y Git, si bien son ambos sistemas de control de versiones, tienen una diferencia bastante significante. SVN es un sistema de control de versiones centralizado (CVCS, Centralized Version Control System), mientras que Git es un sistema de control de versiones distribuido (DVCS, Distributed Version Control System).

Esto es algo muy importante a tener en cuenta, ya que cual elijas determinará el modo en el que trabajes en tu proyecto.

¿Cuál es la diferencia entre DVCS y CVCS?

Un sistema de control de versiones centralizado opera con la idea de que hay una sola copia del proyecto a la cual los desarrolladores realizar el commit de los cambios, y un solo lugar en el cual todas las versiones de un proyecto se encuentran guardadas.

Un sistema de control de versiones distribuido, por otro lado, trabaja con el principio de que cada desarrollador «clona» el repositorio del proyecto al disco duro de su dispositivo.

Una copia del proyecto es guardado en cada maquina local, y los cambios deben ser subidos (pushed) y bajados (pulled) hacia y desde el repositorio online para actualizar la versión que cada desarrollador tiene en su maquina local.

Como vemos, si bien funcionan de forma similar, ambos cuentan con una gran diferencia, que según lo que necesites o la forma en la que trabajes, puede que necesites un sistema distribuido o centralizado.

Veamos ahora cuáles son las diferencias entre ambos para que puedas determinar cual es el mejor a utilizar en tu caso.

Ahora que sabemos qué es cada uno y cómo funciona, veamos algunas ventajas y desventajas de trabajar con ellos.

¿Qué es SVN?

SVN o también conocido como Subversion es uno de los CVCS más populares y utilizados en el mercado.

SVN como ya hemos mencionado, utiliza un sistema centralizado, todos los archivos así como también el historial de éstos son guardados en un servidor central.

Es decir que los desarrolladores deben realizar el «commit» de los cambios directamente al repositorio en el servidor central.

¿Cómo funciona SVN?

SVN fue diseñado originalmente como una interfaz de línea de comandos, es decir que para trabajar con él debes abrir una terminal y tipear los comandos.

Para poder trabajar con SVN, se necesitan dos elementos importantes

  1. El servidor, el cual tiene todas las versiones de los archivos
  2. Una copia local de los archivos, la cual será tu computadora

Con SVN realizarás los cambios en tu ambiente de trabajo y luego, una vez que se encuentre todo funcional, se realiza el commit de los cambios al servidor SVN, el cual es llamado repositorio.

Cada vez que se realiza un commit, SVN se encarga de realizar una nueva versión, para que sea posible regresar a viejos commits.

Normalmente siempre se trabaja en las últimas versiones, pero siempre que lo necesites podrás regresar a una vieja.

¿Qué es Git?

Git como ya hemos mencionado anteriormente, es un DVCS, es decir que utiliza múltiples repositorios: un repositorio central y una serie de repositorios locales.

Los repositorios locales son una copia exacta del repositorio completo, incluyendo el historial de cambios.

¿Cómo funciona Git?

La forma de trabajo en Git es bastante similar a SVN, con la diferencia de que contiene un paso extra: para crear una nueva funcionalidad, debes crear una copia del repositorio en tu maquina local.

Luego de eso, trabajarás en ella de la misma forma, y al finalizar realizarás el push de los cambios desde el repositorio local al central.

Ventajas de Git vs SVN

Sistema Distribuido

El hecho de ser un sistema distribuido significa que múltiples repositorios redundantes y ramificaciones son conceptos de primera clase de la herramienta.

En un sistema distribuido como Git, cada usuario tiene una copia completa guardada del proyecto, haciendo que el acceso a la historia de cada uno sea extremadamente rápida.

Algo muy importante es que debido a ello permite que puedas utilizarlo con poca o sin conexión a Internet.

También significa que cada usuario tiene una copia completa del repositorio, es decir que si por algún caso alguno queda corrupto, solo los cambios que hayan sido únicos para ese repositorio serán perdidos.

En SVN por otro lado, solamente el repositorio central contiene la historial completa. Por lo cual los usuarios deben comunicarse a través de la red al repositorio central para obtener el historial de los archivos.

Por otro lado, si el repositorio central es perdido por algún fallo del sistema, éste debe ser restablecido desde un backup y esto puede provocar que cambios sean perdidos.

Dependiendo de las políticas de backup que hayan, podrían incluso perderse semanas de trabajo.

Control de Acceso

Al ser un sistema distribuido, no hay que otorgar acceso a otras personas para que puedan utilizar las funciones de control de versiones. En vez de eso, es el dueño del repositorio el que decide a qué cambios realizar el merge y de quién.

Subversión por otro lado sí controla el acceso, por ejemplo, el usuario requiere acceso para realizar commits.

En git, los usuarios pueden tener control de versión de su propio proyecto, mientras que el proyecto principal está controlado por el propietario del repositorio.

Manejo de Ramas (Branches)

En Git utilizar branches es muy común y fácil, mientras que se puede considerar que en SVN es un proceso un poco más engorroso y no tan habitual.

De hecho, la queja más común sobre SVN es lo tan tedioso que es trabajar con ramas. En SVN, las braches se crean como directorios, algo que a muchos desarrolladores no les gusta.

Además en SVN 1.6, se introdujo un concepto llamado conflicto de árboles, los cuales son causados por cambios en la estructura de los directorios y ocurren con frecuencia.

Y debido a ellos las complicaciones para realizar commits entre branches se hace más compleja.

Performance

Dado que git trabaja con un repositorio local, no hay latencia en la mayoría de las operaciones, exceptuando push y fetch, en las cuales sí necesitarás conectarte al repositorio central.

Ventajas de SVN vs Git

Historial Permanente

Con Subversion siempre obtendrás exactamente la misma información de tu repositorio, tal y como estaba en el pasado.

Así como también puedes rastrear todos los cambios de un archivo o carpeta, debido a que el historial en Subversion es permanente.

En Git por otro lado, puede que el historial de un archivo/directorio sea perdido. Git no se preocupa del rastro o la historia precisa de cada archivo en los repositorios.

Por ejemplo, el renombrar un archivo o el comando «git rebase» hacen difícil el encontrar el historial «verdadero» de nuestros repositorios.

Ya que, en caso de renombrar un archivo o realizar un git rebase, la historia de los archivos involucrados puede ser perdida.

Un único repositorio

Dado que SVN solamente permite tener un repositorio, no debemos preocuparnos por dónde algo está guardado.

En caso de necesitar un backup o querer buscar algo, no nos quedará duda de que todo lo que necesitemos se encuentra en el repositorio central.

Dado que Git trabaja con repositorios distribuidos, puede que sea más dificil saber qué cosas están ubicadas dónde.

Control de acceso

Dado que Subversion tiene un repositorio central, es posible especificar allí el control de lectura y escritura y será forzado en todo el proyecto.

Archivos Binarios

Los sistemas de control de versiones tienen como idea que la mayoría de los archivos que serán versionados son fusionables.

Es decir, que debería de ser posible funsionar dos cambios simultáneos realizados en un archivo. Este modelo es llamado Copy-Modify-Merge y tanto Git como SVN lo utilizan.

El único problema, es que esto generalmente no es aplicable a archivos binarios, y es por ello que Subversion brinda soporte para el modelo Bloquear-Modificar-Desbloquear para estos casos.

Por otra parte Git no admite bloqueos de archivos exclusivos, lo cual hace que sea más difícil para empresas con proyectos donde existen muchos archivos binarios no fusionables.

En caso de querer utilizar git con archivos binarios, deberás especificarle cuales de ellos lo son.

Comparación de comandos

Comparemos algunos comandos en SVN vs Git. Veremos que realmente son muy similares.

Crear un nuevo Repositorio

En SVN

svnadmin create /ruta/del/repo
svn import /ruta/del/repo http://ejemplo.com/svn/trunk -m "Iniciando repositorio"

En Git

git init
git add .
git commit -m "Commit inicial"

Clonando un Repositorio Remoto

En SVN

svn checkout svn+ssh://ejemplo.com/svn/trunk

En Git

git clone ssh://git@ejemplo.com/ruta/del/repositorio-git.git

Inspeccionando el Historial

En SVN

svn log | less

En Git

git log

Inspeccionando cambios locales

En SVN

svn status
svn diff | less

En Git

git status
git diff

Commit de cambios locales

En SVN

svn commit -m "Mensaje"

En Git

git commit -a -m "Mensaje" (Con la opción -a le decimos a git que añada todos los cambios)

Git vs SVN: Tabla Comparativa


SVNGIT
Punto de fallo Uno solo Múltiples
Manejo de Ramas Complejo Simple
Performance Buena Buena
Conexión a Internet Siempre Necesaria No necesaria
Fíabilidad Mayor Menor
Archivos Binarios Compatible No siempre compatible

¿Cuál es mejor: Git o SVN?

Ahora que hemos profundizado en ambas tecnologías en este versus Git vs SVN, es hora de decidir cual de ellas es la mejor para nosotros.

Lo más importante en este caso, es fijarnos en los pros y contras que hemos mencionado en cada una de ellas.

Podremos ver por ejemplo que si en nuestra empresa trabajamos mucho con archivos binarios, la mejor opción será sin duda SVN, ya que trae consigo compatibilidad para éstos.

Un punto fuerte de Git por ejemplo es el hecho de poder trabajar sin conexión, por lo que si nuestros desarrolladores pueden encontrarse trabajando en zonas sin conexión, lo mejor es sin duda utilizar Git.

Algo en lo que también es muy bueno SVN, es en su simplicidad. Te permite hacer todo lo que un VCS debe, pero de forma sumamente sencilla.

Por otro lado, Git puede ser un poco más complejo, tiene una infinidad de comandos y opciones, pero esto no necesariamente es algo malo.

Es decir, si lo que necesitas es flexibilidad y tienes tiempo de aprender a utilizarlo, entonces Git es una herramienta muy poderosa que sin duda te permitirá más flexibilidad de algunos puntos que SVN.


¿Te resultó útil el artículo? Compártelo con tus colegas: