2010-11-08 49 views
98

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?¿Por qué una combinación de 3 vías es ventajosa en una combinación de 2 vías?

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

+0

¿Enlace a la página de wikipedia (o mejor aún, sección) en cuestión? – dmckee

Respuesta

154

Diga usted y su amigo tanto protegido un archivo, y hecho algunos cambios a la misma. 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 realizaba 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 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.

+0

al sincronizar con repo remoto en eclipse, obtuve un montón de líneas en el código remoto que se compara con una sola línea en blanco en el código local y, por lo tanto, en conflicto. Pero esas líneas también estaban presentes en mi código local. No sé por qué el plugin eclipse lo comparaba con una línea en blanco. De hecho, hubo muchas instancias similares en muchos archivos. Volví a comparar en dos direcciones y todo comienza a parecer correcto. Antes nunca intenté comparar de dos maneras. Estoy adivinando si debo mantener activado el modo de comparación bidireccional de manera predeterminada, porque de todos modos a través del código mientras resuelvo el conflicto y realizo la fusión ... – Mahesha999

11

Combinación de tres vías donde 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

un archivo ha sido modificado por dos personas, una adición de alces, un ratón adición.

#File a 
    dog 
    cat 

#diff b, a 
    dog 
+++ mouse 
    cat 

#diff c, a 
    dog 
+++ moose 
    cat 

Ahora, si nos fusionamos los conjuntos de cambios como los aplicamos, obtendremos (combinación de 3 vías)

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

Pero si aplicamos b, y luego mirar el cambio de bac que se verá como sólo estamos cambiando una 'U' a una 'o' (combinación de 2 vías)

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

This slide de una presentación forzosamente es interesante:

alt text

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

  • Comparar la base, la fuente y los archivos de destino
  • Identifique los "fragmentos" en el archivo de archivos de origen y de destino:
    • trozos que no coinciden con la base
    • trozos que hacen coincidir la base
  • Entonces, armar un resultado combinado formado por:
    • Los trozos que coinciden entre sí en todo 3 archivos
    • Los trozos que no coinciden con la base ni en el origen ni en el objetivo, pero no en ambos
    • Los trozos que no coinciden con la base pero que coinciden con cada ot ella (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, que deben ser resueltos por el usuario.

Tenga en cuenta que los "trozos" en esta ilustración son puramente simbólica. 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 de 2 vías. 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 desde el origen y si los cambios entran en conflicto o no.

+0

"si hay o no un conflicto". - does not merge fusion (diff) también muestra un conflicto (aunque la información se pierde a partir del origen del conflicto)/ – Vlad

+1

Sin embargo, es común en Git tener una fusión de 4 vías donde la base no es en realidad lo mismo. Aún así, una combinación de 3 vías es mejor y bidireccional. – Wernight

+0

@Wernight, ¿hay una fusión de 5 vías? – Pacerier

14

Escribí very detailed post about it. Básicamente, no puedes rastrear eliminaciones/agregar con doble sentido, muy, muy improductivo.

+0

@pablo, si agrego una función antes de X y agrega otra función después de X y realizamos una combinación de tres vías, la herramienta ** aplicará ** automáticamente ambos cambios. Pero, ¿qué sucede cuando mi cambio en realidad 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 debe saber que una fusión "aburridamente fácil" ** puede provocar un conflicto **? – Pacerier

+1

Simplemente lea su tutorial y es realmente útil para mí. Me siento de la misma manera que los desarrolladores que describes. Siempre he temido la fusión de tres vías. – racl101

+0

Le sugiero que copie y pegue partes de su artículo. Creo que esto te ayudará a ganar upvotes y estará más alineado con la filosofía de stackoverflow. – Samuel

Cuestiones relacionadas