Последствия использования трансплантата в Mercurial - PullRequest
98 голосов
/ 07 марта 2012

В последнее время возникло несколько вопросов о пропуске изменений при поддержке веток релиза в 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: Это слияние - обычное трехстороннее слияние с использованием D, J' и M1?
  • Q3: Mercurial сохранил / использовал дополнительную информацию об операции пересадки, чтобы помочь ей с слиянием?

И наконец ...

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

Ответы [ 2 ]

119 голосов
/ 07 марта 2012

Когда вы обновляете до 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 градусов по часовой стрелке, и вышеупомянутое трехстороннее слияние выглядит следующим образом:

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

То есть мы притворяемся, что начали с E и применили противоположное -e, чтобы добраться до1017 *.Я думаю, что это обратный патч +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: Имеет ли Mercurial сохраненную / использованную дополнительную информацию об операции пересадки, чтобы помочь ей в слиянии?

    A3:

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

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

6 голосов
/ 07 марта 2012

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

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

Q3: Нет.

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

...