Последствия использования трансплантата в 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: Каковы потенциальные проблемы с таким потоком?