Последствия использования graft в Mercurial

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

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

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

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

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

предоставив нам:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • В1: Что здесь только что произошло? Я могу понять, что 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: Каковы потенциальные проблемы с таким потоком?

98
задан Community 23 May 2017 в 11:45
поделиться