theirs strategy origin examples example git merge git-merge diff3

strategy - Git-diff3 Conflict Style-Rama de fusión temporal



git merge--no-ff (1)

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

La Documentación Git para Fusionar explica claramente qué significan estos símbolos para un caso simple (como se describe a continuación).

Diff3 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 muchas combinaciones en los ancestros de los compromisos que actualmente estoy fusionando, pero no puedo entender qué significan las líneas adicionales. Parece que tampoco puedo encontrar ninguna documentación 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 ninguna de las confirmaciones que estoy intentando fusionar, por lo que no es la respuesta).

<<<<<<< ours ||||||| base <<<<<<< Temporary merge branch 1 ||||||| merged common ancestors if (sendRedirect(result)) return new Result("redirect"); ======= if ( result.getId() != null ) { object = new SomeObject(searchResult.getId()) ; } if (sendRedirect(result)){ return new Result("redirect"); } >>>>>>> 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 más que tenga algo que ver con diff3, que el interrogador ya indicó en el Título como algo con lo que está familiarizado. Intenté editar esa pregunta dos veces, pero me rechazaron, así que la pregunto nuevamente.


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 , alrededor de la línea 1940). Git realizará una combinación recursiva cuando el gráfico de confirmación tenga varios candidatos para la base de fusión (consulte esta publicación del blog para obtener más información). Para (¿sobrepasar?) Simplificar un poco, git ha hecho una combinación interna y recursiva que produjo un conflicto de combinación, luego realizó la combinación externa y golpeó otro conflicto de combinación. Lo que ves es el conflicto de fusión externo ( ours contra el de theirs ) con el conflicto interno que se muestra como la versión "base".

Puede encontrar mejores resultados al elegir alguna otra estrategia de fusión o al usar un algoritmo alternativo de diferencias (los algoritmos de patience , minimal e histogram frente a los de myers predeterminados). O bien, es posible que desee deshabilitar el estilo de diff3 por un momento, para que simplemente no vea la combinación interna.