Git - diff3 Conflict Style - Временная ветка слияния

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

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

Обычный 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 против theirs) с внутренним конфликтом, показанным как "базовая" версия.

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

Другие вопросы по тегам