Diferencia de models de versiones svn y git

Me gustaría saber cuál es la diferencia entre los enfoques de control de versiones sugeridos por git (u otros DVCS) y subversión (u otros CVCS).

Esto es lo que encontré en http://www.xsteve.at/prg/vc_svn/svn.txt con respecto a este tema:

Los manuscritos de Subversion versionaron treees como objects de primer order (el repository es una matriz de treees) y los sets de cambios son cosas que se derivan (al comparar treees adyacentes). Sistemas como Arch o Bitkeeper se construyen al revés: están diseñados para administrar sets de cambios como objects de primer order (el depósito es una bolsa de parches), y los treees se obtienen componiendo sets de parches juntos.

Pero no está claro cómo cambia el almacén de repository de subversión, si contiene la variante más antigua del file versionado, etc. ¿Por qué no podríamos generar un montón de parches como en el caso de git, por ejemplo? Siempre se menciona como una diferencia principal entre svn y git que simplifica / complejiza las fusiones, pero, desafortunadamente, todavía no entiendo la idea.

Hay una buena explicación sobre las principales diferencias entre VCS basadas en sets de cambios y en instantáneas en el blog de Martin . No lo repetiré aquí.

Sin embargo, destacaría un punto que puede no ser obvio al principio. Los VCS basados ​​en cambios facilitan el seguimiento de las fusiones, lo que es mucho más difícil para sistemas como Subversion, que se basa en instantáneas.

En un VCS basado en sets de cambios, las fusiones son simplemente sets de cambios (o commits, como se llaman en git) que tienen más de un set de cambios principal. La representación gráfica del repository generalmente muestra un DAG (gráfico acíclico dirigido) donde los nodos representan sets de cambios y las flechas representan relaciones entre padres e hijos. Cuando ve un nodo con más de un padre, sabe exactamente qué tipo de fusión se produjo allí.

En Subversion, "seguimiento de fusión" es algo nuevo. Hasta la versión 1.4 no existía dicho concepto, por lo que para conocer el historial de las fusiones, tenía que tomar notas en los posts de logging de sus confirmaciones. La versión 1.5 implementó el seguimiento de fusión para facilitar la realización de fusiones repetidas de una twig a otra sin forzar al usuario a ser explícito sobre los ranges de revisión y similares. Esto se implementa con una propiedad (svn: mergeinfo) asociada al directory que recibe la combinación. Realiza un seguimiento de las revisiones que ya se han fusionado de qué twigs. Esto es suficiente para inferir qué revisiones deben fusionarse en fusiones posteriores. Pero no hace que sea fácil dibujar charts que muestren el historial de fusión, que es algo que le gustaría ver frecuentemente mientras trabaja en un proyecto complejo con varios desarrolladores.

Git está arreglado con treees de versión como objects de primer order en principio. Es decir, se trata de un gráfico de objects de compromiso, cada uno de los cuales tiene una relación de uno a uno con un tree que es el estado en esa revisión.

Tenga en count que la forma en que se almacenan realmente puede ser muy diferente. Git comenzó simplemente comprimiendo cada file y tree / cometiendo el object individualmente. Tal como lo entiendo, agregar objects en un solo file y almacenar solo deltas para algunos objects se agregó mucho más tarde.

De hecho, aunque los parches parecen ser omnipresentes en las interfaces de usuario de git, de hecho no guardan relación con la forma en que se almacenan los datos: los deltas almacenados en los files del package son deltas de nivel binary, no diferencias de estilo de text. . Git aplicará deltas para get objects y luego los difuminará nuevamente para producir el parche a pedido. Esto está en contraste con, por ejemplo, CVS que henetworkingó un sistema de almacenamiento de RCS de última versión más delta inverso.

Según lo que citó, parece que Git y SVN son en realidad más similares que cualquiera de los CVS, por ejemplo.

Respuesta tardía y parcial. No creo que se haya aclarado anteriormente lo siguiente:

Términos importantes:

CVCS = Sistema de control de versiones centralizado
DVCS = D Sistema de control de versiones (usado por Git)

REPOSITORY = Árbol de files de un proyecto, es decir, un directory con uno o más subdirectorys, con todos los muchos files para un solo proyecto. Por ejemplo:

./Project1/README ./Project1/myprogram.c ./Project1/Makefile ./Project1/images/1.gif ./Project1/images/2.gif 

Centralizado:

Un repository (centralizado) compartido por todos.

Uso:

  • Un usuario verifica un file que quiere editar, (es decir, obtiene una copy de ese file del repository remoto),
  • Editan el file localmente en su propia computadora, y luego
  • Vuelven a verificar el file en el repository central (es decir, lo copyn de nuevo en el repository central que registra los cambios y hace que los cambios estén ahora disponibles para otros usuarios).

El permiso para realizar cambios se otorga a todos los usuarios.

Repartido:

Un Repositorio de solo lectura compartido por todos, luego , como mínimo, una copy completa de ese Repositorio en cada location de usuario.

En otras palabras, cada usuario hace una copy del tree completo del proyecto en su máquina local, o copy todo el tree de files desde el repository principal.

Uso:

  • Después de que un usuario hace una edición local
  • Luego, pueden enviar la edición nuevamente al Repositorio central para que posiblemente se incluya y, por lo tanto, se comparta con otros.

El permiso para realizar cambios está controlado por el propietario del proyecto que controla el repository principal. (En git tenemos una "request de extracción", o una request al propietario del proyecto que controla el Repositorio central, para get los nuevos cambios).

He simplificado esto en exceso, para centrarme en las principales diferencias entre centralizado y distribuido. (Ahora admito que todavía estoy aprendiendo cómo se registraron realmente los cambios que me has preguntado, y espero actualizar esto una vez que entiendo esto por completo).

Ref .: Este es un buen artículo más completo.