¿Por qué es una fusión de 3 vías ventajosa en una combinación de 2 vías?

Wikipedia dice que una fusión de 3 vías es less propensa a errores que una fusión de 2 vías, y muchas veces no necesita la intervención del usuario. ¿Por qué es este el caso?

Un ejemplo donde una fusión de 3 vías tiene éxito y una fusión de 2 vías falla sería útil.

Supongamos que usted y su amigo han comprobado un file y han realizado algunos cambios. Eliminaste una línea al principio y tu amigo agregó una línea al final. Luego cometió su file, y necesita fusionar sus cambios en su copy.

Si estuvieras haciendo una fusión bidireccional (en otras palabras, una diferencia), la herramienta podría comparar los dos files y ver que la primera y la última línea son diferentes. ¿Pero cómo sabría qué hacer con las diferencias? ¿Debería la versión fusionada include la primera línea? ¿Debería include la última línea?

Con una combinación de tres vías, puede comparar los dos files, pero también puede comparar cada uno de ellos con la copy original (antes de que cualquiera de los dos lo haya modificado). Por lo tanto, puede ver que eliminó la primera línea y que su amigo agregó la última línea. Y puede usar esa información para producir la versión fusionada.

Esta diapositiva de una presentación forzada es interesante:

texto alternativo

La lógica esencial de una herramienta de combinación de tres vías es simple:

  • Comparar files base, fuente y destino
  • Identifique los "fragments" en el file de files de origen y destino:
    • Trozos que no coinciden con la base
    • Trozos que hacen juego con la base
  • Luego, junte un resultado combinado que conste de:
    • Los fragments que coinciden entre sí en los 3 files
    • Los trozos que no coinciden con la base ni en la fuente ni en el objective, pero no en ambos
    • Los fragments que no coinciden con la base pero que coinciden entre sí (es decir, se han cambiado de la misma manera tanto en el origen como en el objective)
    • Los marcadores de position de los fragments que entran en conflicto deben ser resueltos por el usuario.

Tenga en count que los "fragments" en esta ilustración son puramente simbólicos. Cada uno podría representar líneas en un file, o nodos en una jerarquía, o incluso files en un directory. Todo depende de lo que una herramienta de fusión particular sea capaz de hacer.

Es posible que se pregunte qué ventaja ofrece una combinación de 3 vías en una fusión bidireccional. En realidad, no existe una fusión bidireccional, solo herramientas que difieren dos files y le permiten "fusionar" eligiendo fragments de un file u otro.
Solo una combinación de 3 vías le da la capacidad de saber si un trozo es un cambio del origen y si los cambios entran en conflicto o no.

Escribí una publicación muy detallada al respecto . Básicamente, no puedes rastrear eliminaciones / agregar con doble sentido, muy, muy improductivo.

Una combinación de tres vías en la que dos sets de cambios a un file base se fusionan a medida que se aplican, en lugar de aplicar uno, y luego fusionar el resultado con el otro.

Por ejemplo, tener dos cambios donde se agrega una línea en el mismo lugar podría interpretarse como dos adiciones, no como un cambio de una línea.

Por ejemplo

el file a ha sido modificado por dos personas, una que agrega alce y otra que agrega el mouse.

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

Ahora, si fusionamos los sets de cambios a medida que los aplicamos, obtendremos (combinación de 3 vías)

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

Pero si aplicamos b, entonces observe el cambio de b a c, se verá como si simplemente estuviéramos cambiando una 'u' a una 'o' (combinación de dos vías)

  #diff b, c dog --- mouse +++ moose cat