J'ai lu à Joel sur les logiciels :
Avec le contrôle de version distribué, le partie distribuée n'est en fait pas la la partie la plus intéressante.
La partie intéressante est que ces systèmes pensent en termes de changements, et non en termes de versions.
et à HgInit :
Lorsque nous devons fusionner, Subversion essaie de regarder les deux révisions - mon code modifié, et votre code modifié et il essaie de deviner comment les écraser ensemble dans un grand et impie désordre. Il échoue généralement, produisant des pages et des pages de "conflits de fusion" qui ne sont pas vraiment des conflits, simplement des endroits où Subversion n'a pas réussi à comprendre ce que nous avons fait.
En revanche, pendant que nous travaillions séparément dans Mercurial, Mercurial était occupé à garder une série de changesets. Et donc, quand nous voulons fusionner notre code ensemble, Mercurial a en fait beaucoup plus d'informations : il sait ce que chacun de nous a changé et peut réappliquer ces changements, plutôt que simplement regarder le produit final et en essayant de deviner comment l'assembler ensemble.
En regardant le dossier de dépôt de SVN, j'ai l'impression que Subversion maintient chaque révision en tant que changeset . Et d'après ce que je sais, Hg utilise à la fois changeset y instantané alors que Git utilise uniquement instantané pour stocker les données.
Si mon hypothèse est correcte, alors il doit y avoir d'autres moyens de faciliter la fusion dans le DVCS. Quelles sont-elles ?
* Mise à jour :
- Je suis plus intéressé par la perspective technique, mais les réponses d'un point de vue non technique sont acceptables.
- Corrections :
- Git's conceptuel est purement basé sur des instantanés. Les instantanés peuvent être stockés comme des différences d'autres instantanés, mais les différences sont purement destinées à optimiser le stockage. - Rafa Dowgird 's commentaire
- D'un point de vue non technique :
- C'est simplement culturel : un DVCS ne fonctionnerait pas du tout si la fusion était difficile, donc les développeurs de DVCS investissent beaucoup de temps et d'efforts pour rendre la fusion facile. En revanche, les utilisateurs de CVCS sont habitués à une fusion médiocre, ce qui n'incite pas les développeurs à la faire fonctionner. (Pourquoi faire quelque chose de bien quand vos utilisateurs vous paient aussi bien pour quelque chose de merdique ?)
...
Pour résumer, l'intérêt d'un DVCS est de disposer de nombreux dépôts décentralisés et de fusionner constamment les modifications dans les deux sens. Sans une bonne fusion, un DVCS est tout simplement inutile. Un CVCS peut cependant survivre avec une fusion médiocre, surtout si le fournisseur peut conditionner ses utilisateurs à éviter les branchements. - Jörg W Mittag 's réponse
- C'est simplement culturel : un DVCS ne fonctionnerait pas du tout si la fusion était difficile, donc les développeurs de DVCS investissent beaucoup de temps et d'efforts pour rendre la fusion facile. En revanche, les utilisateurs de CVCS sont habitués à une fusion médiocre, ce qui n'incite pas les développeurs à la faire fonctionner. (Pourquoi faire quelque chose de bien quand vos utilisateurs vous paient aussi bien pour quelque chose de merdique ?)
- D'un point de vue technique :
- L'enregistrement d'un véritable DAG de l'historique est utile ! Je pense que la principale différence est que CVCS n'a pas toujours enregistré une fusion comme un changeset avec plusieurs parents, perdant ainsi certaines informations. - tonfa 's commentaire
- à cause de suivi des fusions et le fait plus fondamental que chaque révision connaît ses parents . ... Lorsque chaque révision (chaque commit), y compris les merge commits, connaît ses parents (pour les merge commits cela signifie avoir/se souvenir de plus d'un parent, c'est-à-dire le suivi des fusions), vous pouvez reconstruire le diagramme (DAG = Direct Acyclic Graph) de l'historique des révisions. Si vous connaissez le graphe des révisions, vous pouvez trouver l'ancêtre commun des commits que vous voulez fusionner. Et quand votre DVCS sait lui-même comment trouver un ancêtre commun vous n'avez pas besoin de le fournir comme argument, comme par exemple dans CVS.
.
Notez qu'il peut y avoir plus d'un ancêtre commun à deux (ou plusieurs) commits. Git utilise une stratégie de fusion dite "récursive", qui fusionne les bases de fusion (ancêtre commun), jusqu'à ce qu'il ne reste plus qu'un seul ancêtre commun virtuel/effectif (dans une certaine simplification), et peut faire une simple fusion à 3 voies. - Jakub Narbski 's réponse
Vérifiez également Comment et/ou pourquoi la fusion dans Git est-elle meilleure que dans SVN ?