2012-03-07 7 views
97

В последнее время было несколько вопросов о пропуске изменений при сохранении ветвей выпуска в Mercurial. Например:Последствия использования трансплантата в Mercurial

Поскольку она была введена в 2.0, я задавался вопросом об использовании graft, чтобы избежать этой проблемы. Учитывая ревизионную дерево, как это:

A---B---C---D---E---F---G---H---I---J 

Предположим, что нам нужно создать релиз ветвь, которая пропускает Зла изменения E.

hg update -r D 
hg graft "F::J" 

дает нам:

A---B---C---D---E---F---G---H---I---J 
      \ 
       --F'--G'--H'--I'--J' 
  • Q1: Что только что произошло здесь? Я могу понять, что transplant сгенерировал патчи из F::J, а затем применил их на D, но graft, как говорят, использует трехстороннее слияние, а не патчи. Итак ... как это работает? Почему это лучше?

Скажем, теперь я исправлю E и объединить это в свою ветвь освобождения.

    --E2----------------- 
       /     \ 
A---B---C---D---E---F---G---H---I---J---M1 
      \       \ 
       --F'--G'--H'--I'--J'---------M2-- 

M1 - прямое слияние; ничего особенного нет. M2 объединяет ветви, которые имеют «тот же» (или, по крайней мере, эквивалент) изменения.

  • Q2: Является ли это слияние просто обычный 3-полосная слияния с использованием D, J' и M1?
  • Q3: Меркурий хранит/использует дополнительную информацию о операции трансплантата, чтобы помочь ему слиянием?

И наконец ...

  • Q4: Каковы потенциальные проблемы, связанные с потоком, как это?

ответ

118

При обновлении до D и трансплантации F::J, Mercurial запускает ряд слияний.Она начнется с этим слиянием:

M = three_way_merge(local=D, other=F, base=E) 

Если мы пишем +d для дельты между состояниями C и D, то мы начинаем с:

 +d  +e  +f 
---- C ---- D ---- E ---- F ---- 

Поверните график на 90 градусов по часовой стрелке и выше три -way слияние выглядит следующим образом:

-e 
    .---- D 
/
E 
\ 
    '---- F 
    +f 

То есть, мы делаем вид, что мы начали с E и прикладной тыс e напротив -e, чтобы добраться до D. Я думаю, что это обратный патч +e. Начиная с E мы также перешли в состояние F с нормальной дельта +f. Здесь нет ничего странного - у нас есть все состояния (D, E и F) в хранилище уже. Таким образом, видно, что мы можем объединить D и F.

Слияние - вопрос «завершения бриллианта». Таким образом, мы находим новое состояние M, что представляет собой смесь D и F и где разница от D к M похожа на +f и отличие от F к M похоже на -e. Это выглядит следующим образом:

-e  +f' 
    .---- D ----. 
/   \ 
E    M 
\   /
    '---- F ----' 
    +f  -e' 

+f дельта стала +f' и -e дельта стала -e'. Это просто нормальное трехстороннее слияние, но эффект интересен: мы применили F на D вместо E!

После слияния, то второй родитель M к F отбрасывается:

-e  +f' 
    .---- D ----. 
/   \ 
E    M 
\ 
    '---- F 
    +f 

Повторим: Мы скопировали «эффект» F на D, то есть, мы нашли дельту (+f'), которые применяются к D, дают тот же эффект, что и при +f был применен к E. Мы можем выпрямить график немного, чтобы получить:

 +f' 
--- D ---- M 
    \ 
     '---- E ---- F 
     +e  +f 

В результате F прививают на D с использованием полной трехходовой техники.

  • Q1: Что произошло здесь? Итак ... как это работает? Почему это лучше?

    A1: Использование слияний лучше, чем заплатки, поскольку слияние оборудования принимает такие вещи, как переименование.

  • Q2: Является ли это слиянием только обычное трехстороннее слияние с использованием D, J 'и M1?

    A2: Да, прививка не изменяет топологию графика.

  • Q3: Имеет ли ртуть хранимую/использованную дополнительную информацию о операции трансплантата, чтобы помочь ей слиянием?

    A3: No.

  • Q4: Каковы потенциальные проблемы, связанные с потоком, как это?

    A4: С точки зрения слияния он должен работать нормально. Он продублирует некоторую историю, которая может сбить с толку людей.

+4

Большой вопрос, отличный ответ :). +1 к обоим! –

+0

Спасибо Мартин. Это довольно забавное мышление того, кто придумал это. У меня есть идея, но мне нужно разобраться в общем случае. Я предполагаю, что это имеет значение независимо от пути между узлами, которые вы прививаете в/из? –

+3

@PaulS: Я думаю, все, что вам нужно знать, - это то, что трансплантат может копировать набор изменений более надежным способом, чем трансплантат. Надежность в том смысле, что переименования обрабатываются и что вы можете разрешать конфликты в средстве слияния. Детали находятся в странных слияниях, но это, надеюсь, не обязательно для повседневного использования трансплантата! :-) –

6

Q1: Это помогает при возникновении конфликтов. Тогда вы можете использовать свой обычный инструмент слияния (для меня это встроенные маркеры конфликтов, которые я редактирую с помощью Emers 'smerge-mode).

Q2: Это нормальное слияние.

Q3: Нет

Q4: Я думаю, что это некрасиво иметь две практически идентичные ветви.