29 votes

Qu'est-ce qui rend certains systèmes de contrôle de version meilleurs lors de la fusion?

J'ai entendu dire que de nombreux VCS distribués (git, mercurial, etc.) sont meilleurs à fusionner que les traditionnels comme Subversion. Qu'est-ce que ça veut dire? Que font-ils pour améliorer la fusion? Ces choses pourraient-elles être faites dans un VCS traditionnel?

Question bonus: le suivi des fusions de SVN 1.5 égalise-t-il les règles du jeu?

26voto

orip Points 28225

SVN de la fonctionnalité de fusion sont décents, et la simple fusion des scénarios beau travail - par exemple, la libération de la branche et du tronc, où tronc pistes les commits sur le RB.

Des scénarios plus complexes se compliquent rapidement. Par exemple permet de commencer avec une branche stable (stable) et trunk.

Vous souhaitez faire la démonstration d'une nouvelle fonctionnalité, et préfèrent se baser sur l' stable que c'est bien, plus stable que trunk, mais vous voulez que tous vos s'engage à être propagées à l' trunk , tandis que le reste des développeurs sont encore à fixer les choses en stable et de développer des choses sur trunk.

Ainsi, vous créez un demo de la branche, et la fusion graphique ressemble:

  • stable -> demo -> trunk (vous)
  • stable -> trunk (d'autres développeurs)

Mais qu'advient-il lorsque vous fusionnez des modifications de stable en demo, puis de fusionner demo de trunk, tandis que tout le temps les autres développeurs sont également fusionner stable en trunk? SVN se confond avec les fusions d' stable fusionnés à deux reprises trunk.

Il y a des façons de contourner cela, mais avec git/Bazar/Mercurial cela ne veut tout simplement pas se produire - ils se rendent compte que les commits ont déjà été regroupées car elles ID à chaque commit à travers la fusion des chemins qu'il prend.

19voto

Jakub Narębski Points 87537

La plupart des réponses semble parler de la Subversion, alors là, vous avez un sujet de Git (et d'autres DVCS).

Dans la version distribuée du système de contrôle lors de la fusion d'une branche à une autre, vous créez un nouveau commit de fusion, qui se souvient de la façon dont vous avez résolu une fusion, et se souvient de tous les parents d'une fusion. Cette information a été tout simplement défaut dans la Subversion avant la version 1.5; vous avez eu à utiliser d'autres outils tels que la SVK ou svnmerge pour cela. Cette information est très importante lors de fusions répétées.

Grâce à cette information distribués, systèmes de contrôle de version (DVCS) peut automatiquement trouver ancêtre commun (ou des ancêtres communs), aussi connu comme la fusion de la base, pour toutes les deux branches. Jetez un oeil à l'ASCII-art diagramme de révisions ci-dessous (j'espère qu'il n'a pas eu trop horriblement mutilés),

---O---*---*----M---*---*---1
 \ /
\---*---A/--*----2

Si nous voulons fusionner la branche '2' en direction de la '1', l'ancêtre commun que nous voulons utiliser pour générer de fusion serait la version (commit) marquée "Un". Cependant, si le système de contrôle de version n'enregistre pas d'informations sur la fusion des parents ("M" est précédent la fusion de la même agence), il ne serait pas en mesure de trouver qui est s'engager 'A', et il trouvera de commettre un " O " comme ancêtre commun (fusion de la base) à la place... ce qui voudrait répéter déjà inclus les changements et le résultat dans le grand conflit de fusion.

Distribué système de contrôle de version eu à le faire à droite, c'est à dire qu'ils avaient à faire fusionner très facile (sans avoir besoin de marquer les fusionner les parents, et de l'offre de fusion de l'information par la main dès le début, parce que la façon de chercher quelqu'un d'autre pour obtenir le code du projet a été de ne pas lui en donner l'autorisation d'accès en écriture, mais de tirer de son référentiel: obtenir des commits de l'autre référentiel et d'effectuer une fusion.

Vous pouvez trouver des informations au sujet de la fusion dans la Subversion 1.5. dans Subversion 1.5 Release Notes. Les questions de note: vous avez besoin de différents (!) les options de fusion de la branche dans le tronc de fusion tronc de la direction générale, aka. pas toutes les branches sont égales (dans le contrôle de version distribué des systèmes, ils sont [généralement] techniquement équivalent).

4voto

Spence Points 15057

Le suivi de fusion dans la version 1.5 est mieux que pas de suivi de fusion, mais il est encore un processus manuel. J'aime la façon dont il les dossiers qui rev sont et ne sont pas fusionnés, mais son pas loin d'être parfait.

De fusion a une belle boîte de dialogue dans la 1.5. Vous pouvez choisir les révisions que vous souhaitez fusionner individuellement, ou de l'ensemble de la direction. Vous alors déclencher la fusion qui se produit localement (et prend une ÉTERNITÉ) lorsque vous donne un tas de fichiers à lire. Vous devez vérifier logiquement chaque fichier du bon comportement (de préférence en cours d'exécution à travers des tests unitaires sur les fichiers) et si vous avez des conflits que vous avez à résoudre. Une fois que votre heureux vous faire un commit de votre changement et à ce moment la branche est considérée comme fusionné.

Si vous le faites au coup par coup, SVN vous rappeler ce que vous avez dit précédemment que vous avez fusionné, vous permettant de fusionner. J'ai trouvé le processus et le résultat de certains des fusions d'être pour le moins étrange mais...

3voto

Peter Burns Points 17420

Ces systèmes de contrôle de version peuvent faire mieux car ils ont plus d'informations.

SVN pré-1.5, ainsi que la plupart des VCS avant la dernière génération, ne se souvient pas que vous ayez fusionné deux commits n'importe où. Il se souvient que les deux branches partagent un ancêtre commun lors de leur première ramification, mais il ne connaît aucune fusion plus récente qui pourrait être utilisée comme terrain d'entente.

Je ne sais rien de SVN après 1.5, alors peut-être qu'ils ont amélioré cela.

2voto

BCS Points 18500

Désinvolte réponse: Pourquoi certains langages de programmation mieux au texte/math que d'autres?

La vraie réponse: parce qu'ils doivent être. distribué Vcs faire beaucoup de il y la fusion au point où l'une ni l'autre des auteurs de l'contradictoires code pouvez modifier les fusionner manuellement, car la fusion est effectué par un tiers. En conséquence, l'outil de fusion a pour l'obtenir droite la plupart du temps.

Dans le contrat avec SVN, vous faites quelque chose de funky (et le mal?) si jamais vous finissez la fusion de quelque chose où vous n'avez pas à écrire un côté ou de l'autre.

IIRC la plupart des Vcs peuvent débourser la fusion de tout ce que vous demandez à utiliser, il est donc (théoriquement), rien n'empêche de l'utilisation de SVN GIT/mercurial fusion des moteurs. YMMV

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X