Mercurial: специфичные для ветки изменения продолжают возвращаться после фиктивного слияния
У меня есть ртутный репозиторий с двумя постоянными ветками, по умолчанию и UAT. Время от времени мы внедряем (продвигаем) новую версию нашего приложения в среду UAT, и мы делаем это путем объединения стабильной фиксации по умолчанию с веткой UAT. Время от времени все исправляется в ветке UAT, и эти исправления возвращаются по умолчанию.
В ветке UAT мне нужно изменить несколько вещей для целей развертывания - строки подключения и различные параметры среды. Я попытался сделать эти изменения в ветке UAT и зафиксировать их (все как один коммит) сразу после слияния default в UAT. Затем я фиктивно слил этот коммит обратно по умолчанию - думая, что, поскольку по умолчанию теперь этот коммит входит в его наследство, будущие исправления слияния из UAT в дефолт не будут пытаться повторить эти специфичные для UAT изменения.
Однако все пошло не так гладко, как я надеялся. Начиная с фиктивной фиксации по умолчанию, я пробовал оба следующих сценария:
1) Make a few more commits to default and then "promote" to UAT (merge default onto UAT)
2) Make a bugfix on UAT and "backport" it to default (merge UAT onto default)
В промежутке между запуском # 1 и # 2 я удалил все, чтобы оба сценария начинались с одной и той же точки.
Что я вижу, так это то, что в зависимости от последнего объединенного направления мне все еще нужно проверять измененные файлы после выполнения одного или другого слияния и возврата - иногда слияние пытается поместить конфигурации по умолчанию в UAT, а иногда конфигурации UAT в объединение.
Если я возвращаю изменения конфигурации и фиксирую слияние, то будущие слияния в том же направлении ведут себя правильно, но как только я ухожу в другом направлении, слияние снова помещает неправильные конфигурации в файлы.
Что мне не хватает?
1 ответ
Я считаю, что проблема похожа на проблему в этом вопросе: слияние не работает так, как вы думаете, оно работает. Слияние - это только вопрос сравнения состояний файлов, а не применение изменений из одной ветви в другую.
Ваша отправная точка - история, подобная этой:
UAT: ... x --- y --- z
\
default: ..... a --- b --- c
где x
а также y
содержать настройки конфигурации для UAT и b
это фиктивное слияние без настроек конфигурации. Так что файлы в b
похоже, что они сделали в a
- они были фиктивно слиты.
Если вы сейчас внесете новое изменение в default
что вы хотите продвигать в UAT, вы будете работать с:
UAT: ... x --- y
\
default: ..... a --- b --- c
Слияние между y
а также c
, Это вырожденное слияние, где общий предок y
сам. Это означает, что все изменения между b
а также c
"победит" в тройном слиянии. Таблица того, как объединяются фрагменты в трехстороннем объединении:
ancestor local other -> merge
old old old old (nobody changed the hunk)
old old new new (they changed the hunk)
old new old new (you changed the hunk)
old new new new (hunk was cherry picked onto both branches)
old foo bar <!> (conflict, both changed hunk but differently)
Обратите внимание, что результат слияния не зависит от "направления" слияния: таблица симметрична относительно local
а также other
колонны. Здесь оба ancestor
а также local
является y
, а также other
является c
, Таким образом, таблица становится:
ancestor local other -> merge
old old new new (they changed the hunk)
Вы можете видеть, что результат слияния всегда содержит new
изменение, которое было сделано в c
,
Не важно, чтобы слияние было вырожденным. Предполагая, что у вас есть новый коммит в UAT и что этот коммит не касается строк конфигурации, вы получите то же поведение при слиянии (в любом направлении слияния симметричны).
Нормальным решением этой проблемы является экстернализация строк конфигурации. Разместите их где-нибудь за пределами контроля версий - переменные среды, неверсионный файл конфигурации и т. Д. Если вы можете, то поместите файл конфигурации под контроль версий в качестве шаблона. Затем вы создаете неверсионный файл конфигурации для ветви UAT, который включает файл конфигурации с управлением версиями. При необходимости вы переопределяете настройки в этом неверсионном файле конфигурации.