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

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

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

И наконец...

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

Ответы на вопрос(2)

Ваш ответ на вопрос