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
немного стиля, так что вы просто не видите внутреннего слияния.