Dans Subversion (et CVS), le référentiel est avant tout. Dans git et mercurial, il n'y a pas vraiment le concept de dépôt de la même manière; ici les changements sont le thème central.
+1
Le tracas dans CVS / SVN vient du fait que ces systèmes ne se
souviennent pas de la parentalité des changements. Dans Git et Mercurial, non seulement un commit peut avoir plusieurs enfants, mais il peut aussi avoir plusieurs parents!
Cela peut facilement être observé en utilisant l'un des outils graphiques, gitk
ou hg
view
. Dans l'exemple suivant, la branche # 2 a été dérivée de # 1 à la validation A, et a depuis été fusionnée une fois (à M, fusionnée avec la validation B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Notez comment A et B ont deux enfants, tandis que M a deux parents . Ces relations sont enregistrées dans le référentiel. Disons que le responsable de la branche # 2 souhaite maintenant fusionner les dernières modifications de la branche # 1, il peut émettre une commande telle que:
$ git merge branch-1
et l'outil saura automatiquement que la base est B - car elle a été enregistrée dans commit M, un ancêtre de la pointe de # 2 - et qu'il doit fusionner tout ce qui s'est passé entre B et C. CVS n'enregistre pas cette information , ni SVN avant la version 1.5. Dans ces systèmes, le graphique ressemblerait à:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
où M est juste un gigantesque commit "écrasé" de tout ce qui s'est passé entre A et B, appliqué au-dessus de M. Notez qu'après que l'acte est fait, il n'y a plus de trace (sauf potentiellement dans les commentaires lisibles par l'homme) d'où M provenait de, ni du nombre de commits qui ont été regroupés - rendant l'histoire beaucoup plus impénétrable.
Pire encore, la réalisation d' une seconde fusion devient un cauchemar: on doit comprendre ce que la base de fusion était au moment de la première fusion (et on a à savoir
qu'il ya eu une fusion en premier lieu!), Alors présent que informations à l'outil afin qu'il n'essaie pas de rejouer A..B au-dessus de M. Tout cela est déjà assez difficile lorsque l'on travaille en étroite collaboration, mais est tout simplement impossible dans un environnement distribué.
Un problème (lié) est qu'il n'y a aucun moyen de répondre à la question: "X contient-il B?" où B est une correction de bogue potentiellement importante. Alors, pourquoi ne pas simplement enregistrer ces informations dans le commit, car elles sont connues au moment de la fusion!
P.-S. - Je n'ai aucune expérience avec les capacités d'enregistrement de fusion SVN 1.5+, mais le flux de travail semble être beaucoup plus artificiel que dans les systèmes distribués. Si tel est effectivement le cas, c'est probablement parce que - comme mentionné dans le commentaire ci-dessus - l'accent est mis sur l'organisation du référentiel plutôt que sur les changements eux-mêmes.