2015-07-13 2 views
14

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

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

Regular 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 

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

+1

В верхней части моей головы я бы сказал, что похоже, что кто-то в какой-то момент в прошлом совершил файл, в котором все еще были отмечены конфликты слияния. Таким образом, эти маркеры слияния теперь считаются частью фактического файла в одном родителе или другом в текущем слиянии ... – twalberg

+0

@twalberg Я указал в вопросе, что это не так. –

+1

Извините, я взял буквальную интерпретацию «В коде каких-либо коммитов, которые я пытаюсь объединить, конфликтов нет», что не исключает, что в ветке могут быть некоторые из них, которые вы пытаетесь объединить * в * ... – twalberg

ответ

11

То, что вы здесь (с 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 будет выполнять рекурсивное слияние, когда граф фиксации имеет несколько кандидатов для базы слияния (подробнее см. this blog post). Чтобы (более?) Упростить бит, git выполнил внутреннее рекурсивное слияние, вызвавшее конфликт слиянием, затем выполнив внешнее слияние и ударил другой конфликт слиянием. То, что вы видите, это конфликт внешнего слияния (ours против theirs) с внутренним конфликтом, обозначенным как «базовая» версия.

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

+0

Итак, вы должны в основном читать его, как будто некоторые из них вложены? Я предполагаю, что это поможет выделить некоторые символы для визуализации. Кроме того, есть ли где-нибудь прочитать об этом? –

+0

Да (к вложенной части); как для чтения на нем, см. эту запись в блоге (это было лучшее, что я мог найти в быстром поиске - это специально для ClearCase, но идея такая же). – torek

+0

Благодарим вас за руководство. Но когда я пытаюсь использовать стратегию «терпения», я получаю сообщение: «Доступные стратегии: octopus ours рекурсивное решение поддерева». Это разные имена для стратегий, которые вы указали? Интересно, нужно ли мне что-то устанавливать? – Sean

Смежные вопросы