web-dev-qa-db-fra.com

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

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

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

139
Johannes Bittner

Dites 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 dossier et vous devez fusionner ses modifications dans votre copie.

Si vous effectuez une fusion dans les deux sens (en d'autres termes, un diff), l'outil peut comparer les deux fichiers et vérifier que les première et dernière lignes sont différentes. Mais comment pourrait-il savoir quoi faire avec les différences? La version fusionnée doit-elle inclure la première ligne? Devrait-il inclure la dernière ligne?

Avec une fusion à trois voies, il peut comparer les deux fichiers, mais il peut également comparer chacun d'eux à la copie d'origine (avant que vous ne l'ayez modifiée). Ainsi, vous pouvez 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.

223
JW.

Cette diapositive d'une présentation forcée est intéressant:

slide image

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

  • Comparer les fichiers de base, source et cible
  • Identifiez les "morceaux" dans les fichiers source et cible:
    • Morceaux qui ne correspondent pas à la base
    • Morceaux qui correspondent à la base
  • Ensuite, créez 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 se correspondent (c'est-à-dire qu'ils ont été modifiés de la même manière dans la source et dans la cible)
    • Des espaces réservés pour les morceaux en conflit, à résoudre par l'utilisateur.

Notez que les "morceaux" dans cette illustration sont purement symboliques. Chacun peut représenter des lignes dans un fichier ou des nœuds dans une hiérarchie, voire des fichiers dans un répertoire. Tout dépend de la capacité d'un outil de fusion particulier.

Vous vous demandez peut-être quel avantage une fusion à 3 voies offre par rapport à une fusion à 2 voies. En réalité, il n’existe pas de fusion bidirectionnelle, mais uniquement des outils qui différencient deux fichiers et vous permettent de "fusionner" en sélectionnant des morceaux d’un fichier ou de l’autre.
Seule une fusion à trois voies vous permet de savoir si un morceau est ou non un changement de l'origine et si les changements sont en conflit ou non.

68
VonC

J'ai écrit un post très détaillé à ce sujet . Fondamentalement, vous ne pouvez pas suivre les suppressions/ajouts avec un processus bidirectionnel, très, très improductif.

20
pablo

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

Par exemple, le fait de modifier deux fois une ligne au même endroit peut être interprété comme deux ajouts et non comme un changement de ligne.

Par exemple

le fichier a a été modifié par deux personnes, l’un en ajoutant l’orignal, l’autre en ajoutant la souris.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Maintenant, si nous fusionnons les changesets en les appliquant, nous obtiendrons (fusion à trois)

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

Mais si nous appliquons b, alors regardons le changement de b en c, il semblera que nous ne faisons que changer un 'u' en un 'o' (fusion bidirectionnelle)

    #diff b, c
    dog
--- mouse
+++ moose
    cat
15
Theo Belaire