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

165

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

Sería útil un ejemplo en el que una fusión de 3 vías tiene éxito y una fusión de 2 vías falla.

Johannes Bittner
fuente

Respuestas:

259

Digamos que usted y su amigo revisaron un archivo y le hicieron algunos cambios. Eliminaste una línea al principio y tu amigo agregó una línea al final. Luego confirmó su archivo, y debe fusionar sus cambios en su copia.

Si estaba 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 ninguno de ustedes lo haya cambiado). 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.

JW
fuente
"¿Pero cómo sabría qué hacer con las diferencias?" No lo entendí. Si ya puede ver las diferencias entre los dos archivos (sin referencia al original), ¿por qué no puede aplicar ambos cambios en serie en orden creciente de las marcas de tiempo de los archivos? Es decir: comienza con la copia comprometida de mi amigo que lo toma como el original (nuevo) (con la adición de la línea en la parte superior) y luego, además, aplica mis cambios locales (eliminación de la línea en la parte inferior).
Harry
77
@Harry Digamos que el original tenía tres líneas (ABC). Comienza con la copia de mi amigo (ABCD) y la compara con la mía (BC). Sin ver el original, podría pensar que eliminé tanto A como D, y que el resultado final debería ser BC.
JW.
80

Esta diapositiva de una presentación forzada es interesante:

imagen de diapositiva

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

  • Compara archivos base, fuente y destino
  • Identifique los "fragmentos" en el archivo de origen y de destino:
    • Trozos que no coinciden con la base
    • Trozos que coinciden con la base
  • Luego, cree un resultado combinado que consista en:
    • Los fragmentos que coinciden entre sí en los 3 archivos
    • Los fragmentos que no coinciden con la base en la fuente o 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 destino)
    • Marcadores de posición para los fragmentos que entran en conflicto, a resolver 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 sea capaz de hacer una herramienta de fusión en particular.

Tal vez se pregunte qué ventaja ofrece una combinación de 3 vías sobre una combinación de 2 vías. En realidad, no existe una fusión bidireccional, solo herramientas que difieren dos archivos y le permiten "fusionar" seleccionando fragmentos de un archivo u otro.
Solo una combinación de 3 vías le permite saber si un fragmento es o no un cambio desde el origen y si el conflicto cambia o no.

VonC
fuente
"si el conflicto cambia o no". - la fusión bidireccional (diff) también muestra un conflicto (aunque la información se pierde a partir de la fuente del conflicto) /
Vlad
1
Sin embargo, es común en Git tener una fusión de 4 vías donde la base en realidad no es la misma. Aún así, una combinación de 3 vías es mejor y de 2 vías.
Wernight
@Wernight, ¿hay una combinación de 5 vías?
Pacerier
@Pacerier No que yo sepa, pero eso es lo que realmente está sucediendo durante un git cherry-pick o rebase.
Wernight
Explicación muy detallada y útil
Kaneg
20

Escribí una publicación muy detallada al respecto . Básicamente no puede rastrear eliminaciones / agregar con dos vías, muy, muy improductivo.

pablo
fuente
@pablo, si agrego una función antes de X y agrega otra función después de X y hacemos una combinación de tres, la herramienta aplicará automáticamente ambos cambios. Pero, ¿qué sucede cuando mi cambio realmente entra en conflicto con su cambio (por ejemplo, cada uno de nosotros crea una nueva función con el mismo nombre de función)? ¿Cómo se supone que la fusión automática sepa que algunas de nuestras fusiones "aburridas y fáciles" en realidad pueden causar un conflicto ?
Pacerier
1
Simplemente lea su tutorial, y es realmente útil para mí. Siento lo mismo que los desarrolladores que describiste. Siempre he temido la fusión a tres bandas.
racl101
3
Le sugiero que copie y pegue partes de su artículo. Creo que esto te ayudará a ganar votos positivos y estará más alineado con la filosofía del stackoverflow.
Samuel
Buen artículo. Me gustaba usar parches para volver a crear bases a medida que ves más contexto y puedes usar tu editor y entorno para verificar cosas, aunque hay demasiada combinación manual de cosas fáciles de esa manera. Es una pena que no haya una buena manera de combinar las partes buenas de ambos
JonnyRaa
20

Una combinación de tres vías donde se fusionan dos conjuntos de cambios en un archivo base 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 agregando alces y otra agregando un 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 (fusió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, parecerá que solo estamos cambiando una 'u' a una 'o' (fusión de 2 vías)

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