Pourquoi une fusion à 3 voies est-elle avantageuse par rapport à une fusion à 2 voies?

165

Wikipédia dit qu'une fusion à 3 voies est moins sujette aux erreurs qu'une fusion à 2 voies, et souvent ne nécessite pas d'intervention de l'utilisateur. pourquoi est-ce le cas?

Un exemple où une fusion à trois voies réussit et une fusion à deux voies échoue serait utile.

Johannes Bittner
la source

Réponses:

259

Supposons que vous et votre ami avez tous les deux extrait un fichier et y avez apporté des modifications. Vous avez supprimé une ligne au début et votre ami en a ajouté une à la fin. Ensuite, il a validé son fichier et vous devez fusionner ses modifications dans votre copie.

Si vous faisiez une fusion bidirectionnelle (en d'autres termes, un diff), l'outil pourrait comparer les deux fichiers et voir que la première et la dernière lignes sont différentes. Mais comment saurait-il que faire des différences? La version fusionnée doit-elle inclure la première ligne? Doit-il inclure la dernière ligne?

Avec une fusion à trois, il peut comparer les deux fichiers, mais il peut également comparer chacun d'eux avec la copie d'origine (avant que l'un de vous ne la modifie). Ainsi, il peut voir que vous avez supprimé la première ligne et que votre ami a ajouté la dernière ligne. Et il peut utiliser ces informations pour produire la version fusionnée.

JW.
la source
"Mais comment pourrait-il savoir quoi faire avec les différences?" Je n'ai pas compris. S'il peut déjà voir les différences entre les deux fichiers (sans référence à l'original), pourquoi ne peut-il pas appliquer les deux changements en série dans l'ordre croissant des horodatages des fichiers? C'est-à-dire: cela commence par la copie validée de mon ami en le prenant pour être le (nouveau) original (avec l'ajout de ligne en haut), puis, en plus, applique mes modifications locales (suppression de ligne en bas).
Harry le
7
@Harry Say l'original avait trois lignes (ABC). Cela commence par la copie de mon ami (ABCD) et la compare à la mienne (BC). Sans voir l'original, il pourrait penser que j'ai supprimé à la fois A et D, et que le résultat final devrait être BC.
JW.
80

Cette diapositive d'une présentation perforce est intéressante:

image de la diapositive

La logique essentielle d'un outil de fusion à trois voies est simple:

  • Comparez les fichiers de base, source et cible
  • Identifiez les "morceaux" dans le fichier des fichiers source et cible:
    • Des morceaux qui ne correspondent pas à la base
    • Des morceaux qui correspondent à la base
  • Ensuite, rassemblez un résultat fusionné composé de:
    • Les morceaux qui correspondent les uns aux autres dans les 3 fichiers
    • Les morceaux qui ne correspondent pas à la base dans la source ou dans la cible mais pas dans les deux
    • Les morceaux qui ne correspondent pas à la base mais qui correspondent les uns aux autres (c'est-à-dire qu'ils ont été modifiés de la même manière dans la source et la cible)
    • Espaces réservés pour les blocs en conflit, à résoudre par l'utilisateur.

Notez que les «morceaux» de cette illustration sont purement symboliques. Chacun peut représenter des lignes dans un fichier, ou des nœuds dans une hiérarchie, ou même des fichiers dans un répertoire. Tout dépend de ce dont un outil de fusion particulier est capable.

Vous demandez peut-être quel avantage une fusion à trois voies offre par rapport à une fusion à deux voies. En fait, il n'y a pas de fusion bidirectionnelle, seulement des outils qui diffèrent deux fichiers et vous permettent de "fusionner" en choisissant des morceaux dans un fichier ou dans l'autre.
Seule une fusion à trois voies vous donne la possibilité de savoir si un morceau est un changement par rapport à l'origine et si les changements sont en conflit ou non.

VonC
la source
"si oui ou non change le conflit." - la fusion bidirectionnelle (diff) ne montre pas également un conflit (bien que les informations soient perdues à partir de la source du conflit) /
Vlad
1
Il est cependant courant dans Git d'avoir une fusion à 4 voies où la base n'est en fait pas la même. Encore une fusion à 3 voies est meilleure et à 2 voies.
Wernight
@Wernight, y a-t-il une fusion à 5 voies?
Pacerier
@Pacerier Pas que je sache, mais c'est ce qui se passe réellement lors d'un git cherry-pick, ou rebase.
Wernight
Explication très détaillée et utile
Kaneg
20

J'ai écrit un article très détaillé à ce sujet . Fondamentalement, vous ne pouvez pas suivre les suppressions / ajouts bidirectionnels, très, très improductifs.

Pablo
la source
@pablo, si j'ajoute une fonction avant X et que vous ajoutez une autre fonction après X et que nous faisons une fusion à trois voies, l'outil appliquerait automatiquement les deux modifications. Mais que se passe-t-il lorsque mon changement entre en conflit avec votre changement (par exemple, chacun de nous crée une nouvelle fonction avec le même nom de fonction)? Comment la fusion automatique est-elle censée savoir que certaines de nos fusions "ennuyeusement faciles" peuvent en fait provoquer un conflit ?
Pacerier
1
Lisez simplement votre tutoriel et il m'est vraiment utile. Je ressens la même chose que les développeurs que vous avez décrits. J'ai toujours craint la fusion à trois.
racl101
3
Je vous suggère de copier et coller des parties de votre article. Je pense que cela vous aidera à gagner des votes positifs et sera plus aligné avec la philosophie du stackoverflow.
Samuel
Bon article. J'aimais utiliser des correctifs pour rebaser au fur et à mesure que vous voyiez plus de contexte et que vous pouviez utiliser votre éditeur et votre environnement pour vérifier les choses, il y a cependant beaucoup trop de mélange manuel de choses faciles de cette façon. C'est dommage qu'il n'y ait pas une belle façon de combiner les bonnes parties des deux
JonnyRaa
20

Une fusion à trois voies dans laquelle deux ensembles de modifications d'un fichier de base sont fusionnés au fur et à mesure de leur application, par opposition à l'application de l'un, puis à la fusion du résultat avec l'autre.

Par exemple, avoir deux changements où une ligne est ajoutée au même endroit pourrait être interprété comme deux ajouts, et non comme un changement d'une ligne.

Par exemple

le fichier a a été modifié par deux personnes, l'une ajoutant l'orignal, l'autre ajoutant la souris.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Maintenant, si nous fusionnons les ensembles de modifications au fur et à mesure que nous les appliquons, nous obtiendrons (fusion à 3 voies)

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

Mais si nous appliquons b, alors regardez le changement de b à c, il semblera que nous changeons simplement un `` u '' en un `` o '' (fusion à 2 voies)

    #diff b, c
    dog
--- mouse
+++ moose
    cat
Théo Bélaire
la source