tool how content conflicts version-control merge conflict three-way-merge

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



how to merge git (4)

Wikipedia dice que una fusión de 3 vías es menos 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 archivo y han realizado algunos cambios. Eliminaste una línea al principio y tu amigo agregó una línea al final. Luego cometió su archivo, y necesita fusionar sus cambios en su copia.

Si estuvieras haciendo una fusión bidireccional (en otras palabras, una diferencia), la herramienta podría comparar los dos archivos 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 incluir la primera línea? ¿Debería incluir la última línea?

Con una combinación de tres vías, puede comparar los dos archivos, pero también puede comparar cada uno de ellos con la copia 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.


Una combinación de tres vías en la que dos conjuntos de cambios a un archivo 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 archivo 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 conjuntos 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


Esta diapositiva de una presentación forzada es interesante:

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

  • Comparar archivos base, fuente y destino
  • Identifique los "fragmentos" en el archivo de archivos 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 fragmentos que coinciden entre sí en los 3 archivos
    • Los trozos que no coinciden con la base ni en la fuente ni en el objetivo, pero no en ambos
    • Los fragmentos 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 objetivo)
    • Los marcadores de posición de los fragmentos que entran en conflicto deben ser resueltos por el usuario.

Tenga en cuenta que los "fragmentos" en esta ilustración son puramente simbólicos. Cada uno podría representar líneas en un archivo, o nodos en una jerarquía, o incluso archivos en un directorio. 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 archivos y le permiten "fusionarse" eligiendo fragmentos de un archivo 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.