Недавно появилось несколько вопросов о пропуске изменений при сохранении ветвей выпуска в 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
и объединить его в мою ветвь 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: Каковы потенциальные проблемы с потоком, подобным этому?