Git-Diff3 Conflict Style-временная ветвь слияния

Я делаю слияние с merge.conflictStyle значение diff3. Обычно это вставляет три (3) раздела, разделенных четырьмя (4) наборами символов.

на Git документация для слияния ясно объясняет, что эти символы означают для простого случая (как описано ниже).

регулярные diff3:

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.

однако я получаю более сложный результат с многочисленными дополнительными строками (см. ниже). У меня такое чувство, что это как-то связано. с тем, что я сделал многочисленные слияния в предках коммитов, которые я сейчас сливаю, но я не могу понять, что означают дополнительные строки. Я также не могу найти никакой документации для этого поведения.

вот что я получил (отредактировано, конечно, для защиты идентичности кода).

(в коде любого из коммитов, которые я пытаюсь объединить, нет маркеров конфликтов, так что это не ответ.)

<<<<<<< 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

Я считаю, что этот вопрос спрашивает то же самое, но ответ не объясняет ничего другого, что он имеет какое-то отношение к diff3, который спрашивающий уже указал в названии как нечто, с чем он знаком. Я дважды пытался отредактировать этот вопрос, но получил отказ, поэтому я задаю его снова.

1 ответов


что у вас тут (с Temporary merge branch 1 и то же самое с 2) связано с методом "рекурсивного слияния" 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, по линии 1940). Git будет выполнять рекурсивное слияние, когда граф фиксации имеет несколько кандидатов для базы слияния (см. этот блог для более). На (конец?) упростите немного, git сделал внутреннее рекурсивное слияние, которое вызвало конфликт слияния, затем сделал внешнее слияние и нажал другой конфликт слияния. То, что ты видишь-внешнее. конфликт слияния (ours vs theirs) с внутренним конфликтом, показанным как "базовая" версия.

вы можете обнаружить, что получаете лучшие результаты, выбирая другую стратегию слияния или используя альтернативный алгоритм diff (patience, minimal и histogram алгоритмы против по умолчанию myers). Или вы можете отключить diff3 стиль немного, так что вы просто не посмотреть внутреннее слияние.