En Subversion (y CVS), el repositorio es lo primero y más importante. En git y mercurial no existe realmente el concepto de repositorio de la misma manera; aquí los cambios son el tema central.
+1
La molestia en CVS / SVN proviene del hecho de que estos sistemas no
recuerdan la paternidad de los cambios. En Git y Mercurial, una confirmación no solo puede tener varios hijos, ¡también puede tener varios padres!
Eso se puede observar fácilmente usando una de las herramientas gráficas, gitk
o hg
view
. En el siguiente ejemplo, la rama n. ° 2 se bifurcó desde la n. ° 1 en la confirmación A y desde entonces se fusionó una vez (en M, se fusionó con la confirmación B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Observe cómo A y B tienen dos hijos, mientras que M tiene dos padres . Estas relaciones se registran en el repositorio. Digamos que el mantenedor de la rama # 2 ahora quiere fusionar los últimos cambios de la rama # 1, puede emitir un comando como:
$ git merge branch-1
y la herramienta sabrá automáticamente que la base es B - porque se registró en el compromiso M, un antepasado de la punta de # 2 - y que tiene que fusionar lo que sucedió entre B y C. CVS no registra esta información , ni SVN antes de la versión 1.5. En estos sistemas, el gráfico se vería así:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
donde M es solo un compromiso gigantesco "aplastado" de todo lo que sucedió entre A y B, aplicado sobre M. Tenga en cuenta que después de que se realiza la escritura, no queda rastro (excepto potencialmente en comentarios legibles por humanos) de donde M no se originó ni de cuántas confirmaciones se colapsaron juntas, lo que hace que la historia sea mucho más impenetrable.
Peor aún, realizar una segunda fusión se convierte en una pesadilla: uno tiene que averiguar cuál era la base de fusión en el momento de la primera fusión (¡y uno tiene que saber
que ha habido una fusión en primer lugar!), Luego presentar eso información a la herramienta para que no intente reproducir A..B encima de M. Todo esto es bastante difícil cuando se trabaja en estrecha colaboración, pero es simplemente imposible en un entorno distribuido.
Un problema (relacionado) es que no hay forma de responder a la pregunta: "¿X contiene B?" donde B es una corrección de errores potencialmente importante. Entonces, ¿por qué no registrar esa información en la confirmación, ya que se conoce en el momento de la fusión?
PD. - No tengo experiencia con las capacidades de grabación combinada de SVN 1.5+, pero el flujo de trabajo parece ser mucho más artificial que en los sistemas distribuidos. Si ese es el caso, probablemente se deba a que, como se mencionó en el comentario anterior, el enfoque se centra en la organización del repositorio en lugar de en los cambios en sí.