¿Cuáles son las ventajas de un control de versión distribuida para un equipo que efectivamente nunca se distribuye?

Cuando trabajamos de forma remota, nuestro equipo solo tiene acceso a nuestro código fuente desde el escritorio remoto en las PC de nuestra oficina, por lo que nunca trabajamos en modo fuera de línea. ¿Un sistema de control de versiones distribuidas como Mercurial o Git todavía nos da ventajas sobre nuestra configuration de Subversion centralizada actual? Si es así, ¿Que son? ¿Hay inconvenientes o dificultades? He leído en numerosos lugares que el cambio al control de versiones distribuidas requiere un cambio de pensamiento. ¿Alguien puede explicar lo que debe cambiar a este respecto?

Yo recomendaría HgInit como una explicación muy completa de cómo svn se mejora con un set de herramientas descentralizado. También lo ayudará a comprender las diferencias conceptuales.

Una de las grandes mejoras que me gustaría destacar es la noción de seguimiento de fusión. Subversion no tenía esta característica hasta 1.5, y con la diferencia en la forma en que trata las revisiones y las sucursales, probablemente nunca será tan buena como las herramientas descentralizadas. A nadie le gustan las fusiones. Podría networkingucir tanto ese dolor como puedas. También vea: ¿Por qué es más fácil ramificarse y fusionarse en Mercurial que en Subversion? .

El mayor cambio en pensar para mí al hacer el cambio desde la subversión fue superar la idea de que la historia es estrictamente lineal, y la bifurcación no es más que copyr el código a otro directory. Tenga en count que en Git y Mercurial, no se puede extraer un subdirectory del repository. No verás 'git checkout http://github.com/project/branches/v2.0 ' ni nada. Eric Sink escribió una muy buena explicación de la diferencia en la forma en que se almacena la historia. Recomiendo echar un vistazo .

Como se explica en las diferencias entre DVCS y CVCS (VCS centralizado), las principales ventajas son:

  • confirmaciones locales (puede comprometerse más a menudo en sucursales privadas, luego limpiar el historial que desea enviar a otros repositorys)
  • process de publicación (extrae de varios repositorys, o repositorys intermedios establecidos rápidamente para enviar, donde puede realizar tareas intermedias, como testings de continuous integration)

Ese último punto requirió el mayor "cambio de pensamiento" y es un poco aterrador ("¿Puedo sacar de cualquier repository ?!")
Pero una vez que te das count de los beneficios, realmente puedes tener ciclos de desarrollo más productivos porque puedes monitorear (obteniendo compromisos de tus compañeros) el desarrollo de algunos de tus colegas. Si están desarrollando una function que necesita, puede comenzar a integrarla antes.
(Lo que hay que recordar con un DVCS es que no impide la configuration de un repository "central", para que otros desarrolladores puedan extraerlo)

En cuanto a la continuous integration, en lugar de enviar directamente desde su repository a un server central a cargo de CI, puede enviar un repository local en su escritorio, que ejecutará todas las testings, antes de presionar automáticamente (si es "verde") el código a un repo "central".
Es tan efectivo que ahora puede enviar al código central oficial un código que "nunca rompa la compilation", haciendo que su server de CI sea bastante inútil;)

Las máquinas de desarrollo pueden estar una al lado de la otra, pero el código fuente aún se distribuye entre ellas. Que las máquinas estén cerca físicamente no tiene importancia para gestionar los cambios en el código fuente realizados por diferentes desarrolladores.