Git – diff3 Conflict Style – Rama de fusión temporal

Estoy haciendo una fusión con merge.conflictStyle establecido en diff3 . Normalmente, esto inserta tres (3) secciones separadas por cuatro (4) sets de caracteres.

La Documentación de Git for Merge explica claramente lo que significan estos símbolos para un caso simple (como se describe a continuación).

Dif3 regular:

 Here are lines that are either unchanged from the common ancestor, or cleanly resolved because only one side changed. <<<<<<< yours:sample.txt Conflict resolution is hard; let's go shopping. ||||||| Conflict resolution is hard. ======= Git makes conflict resolution easy. >>>>>>> theirs:sample.txt And here is another line that is cleanly resolved or unmodified. 

Sin embargo, estoy obteniendo un resultado más complicado con numerosas líneas adicionales (ver más abajo). Tengo la sensación de que tiene algo que ver con el hecho de que hice numerosas fusiones en los antepasados ​​de los compromisos que actualmente estoy fusionando, pero no puedo entender lo que significan las líneas adicionales. Tampoco puedo encontrar documentation para este comportamiento.

Aquí está lo que obtuve (editado, por supuesto, para proteger la identidad del código).

(No hay marcadores de conflicto en el código de ninguno de los commit que bash fusionar, por lo que esa no es la respuesta).

 <<<<<<< ours ||||||| base <<<<<<< Temporary merge branch 1 ||||||| merged common ancestors if (sendRedirect(result)) return new Result("networkingirect"); ======= if ( result.getId() != null ) { object = new SomeObject(searchResult.getId()) ; } if (sendRedirect(result)){ return new Result("networkingirect"); } >>>>>>> Temporary merge branch 2 ======= if ( result.getId() != null ) { object = new SomeObject(searchResult.getId()) ; } >>>>>>> theirs 

Creo que esta pregunta es lo mismo, pero la respuesta no explica nada que tenga algo que ver con diff3, que el interlocutor ya indicó en el Título como algo con lo que está familiarizado. Traté de editar esa pregunta dos veces, pero me rechazaron, así que lo vuelvo a preguntar.

Lo que tienes aquí (con la Temporary merge branch 1 y lo mismo con 2) se debe al método de "combinación recursiva" de git:

  o->branch1 = "Temporary merge branch 1"; o->branch2 = "Temporary merge branch 2"; merge_recursive(o, merged_common_ancestors, iter->item, NULL, &merged_common_ancestors); 

( merge-recursive.c , alnetworkingedor de la línea 1940). Git realizará una fusión recursiva cuando el gráfico de confirmación tenga varios candidatos para la base de combinación (consulte esta publicación en el blog para get más información). Para (¿más?) Simplificar un poco, git ha realizado una fusión recursiva interna que produjo un conflicto de fusión, luego hizo la fusión externa y golpeó otro conflicto de fusión. Lo que ves es el conflicto de fusión externo (el ours contra el de theirs ) con el conflicto interno que se muestra como la versión "base".

Puede encontrar que obtiene mejores resultados eligiendo alguna otra estrategia de fusión o usando un algorithm de diferencia alternativo (la patience , el minimal y los algorithms de histogram frente a los myers pnetworkingeterminados). O bien, es posible que desee deshabilitar el estilo diff3 por un bit, para que simplemente no vea la fusión interna.