В последнее время возникло несколько вопросов о пропуске изменений при поддержке веток выпуска в Mercurial. Например:
- 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'
- 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
? - В3: Сохраняла ли Mercurial / использовала дополнительную информацию об операции трансплантата, чтобы помочь ей при слиянии?
И наконец...
- Q4: Каковы потенциальные проблемы с таким потоком?
Q1: Это помогает, когда есть конфликты. Тогда вы можете использовать свой обычный инструмент слияния (для меня это встроенные маркеры конфликтов, которые я редактирую в smerge-режиме Emacs).
Q2: Это нормальное слияние.
Q3: Нет.
Q4: Я считаю некрасивым иметь две почти одинаковые ветки.
источник