Последствия использования трансплантата в 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 и объединить его в мою ветвь release.

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

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

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

И наконец...

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

Ответ 1

Когда вы обновляетесь до D и graft F::J, Mercurial запускает несколько слияний. Он начнется с этого слияния:

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

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

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

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

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

То есть мы делаем вид, что мы начали с 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: Нет.

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

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

Ответ 2

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

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

Q3: Нет.

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