Dans Subversion (et CVS), le référentiel est d'abord et avant tout. Dans git
et mercurial, il n'est pas vraiment la notion de référentiel dans l'
même façon; c'est ici que les changements sont le thème central.
+1
Les tracas de CVS/SVN vient du fait que ces systèmes ne soient pas
rappelez-vous le lien de parenté de changements. Dans Git et Mercurial,
peut non seulement s'engager avez plusieurs enfants, il peut aussi avoir plusieurs
les parents!
Qui peut facilement observée en utilisant l'un des outils graphiques, gitk
ou hg
view
. Dans l'exemple suivant, la direction de la #2 a été forké #1 au
commettre Un, et a depuis été fusionnés une fois (M, a fusionné 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
les relations sont enregistrées dans le référentiel. Disons que le responsable de
direction #2 maintenant veut fusionner les modifications les plus récentes à partir de la branche n ° 1, ils peuvent
question d'une commande telle que:
$ git merge branch-1
et l'outil va automatiquement sais que la base est B-parce qu'il
a été enregistré en commettre M, un ancêtre de la pointe du n ° 2--et
qu'il a de fusionner ce qui s'est passé
entre B et C. CVS ne pas enregistrer cette information, ni n'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 "écrasé" s'engager de tout ce qui s'est passé entre A et B,
appliqué sur le dessus de M. Remarque qu'après l'acte est fait, il n'y a pas de trace
gauche (sauf éventuellement dans des commentaires plus lisibles) d'où M n'
proviennent ni de la façon dont beaucoup s'engage étaient réduites--
l'histoire beaucoup plus impénétrable.
Pire encore, la réalisation d'une deuxième fusion devient un cauchemar: on doit comprendre
ce que la fusion de la base était à l'époque de la première fusion (et on a à savoir
qu'il y a eu une fusion, en premier lieu!), alors
présent que les informations de l'outil, de sorte qu'il n'essaie pas de rejouer A..B sur
haut de M. Tout cela est assez difficile lorsque l'on travaille en étroite collaboration, mais c'est
tout simplement impossible dans un environnement distribué.
Une (relative) problème est qu'il n'y a aucun moyen de répondre à la question: "est-X
contiennent des B?", où B est un
potentiellement important de correction de bugs. Alors, pourquoi ne pas simplement enregistrer cette information dans le commit, depuis
il est connu lors de la fusion de temps!
P.-S. -- je n'ai aucune expérience avec SVN 1.5+ de fusion capacités d'enregistrement, mais le flux de travail semble être beaucoup plus
artificiel que dans les systèmes distribués. Si c'est effectivement le cas, c'est probablement parce que--comme mentionné
dans le commentaire ci-dessus--l'accent est mis sur l'organisation du dépôt plutôt que sur les changements eux-mêmes.