Я считаю, что проблема похожа на проблему в в этом вопросе : слияние не работает так, как вы думаете, оно работает. Слияние - это только вопрос сравнения состояний файлов, это , а не вопрос применения изменений из одной ветви в другую.
Ваша отправная точка - такая история:
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, который включает файл конфигурации с управлением версиями. При необходимости вы переопределяете настройки в этом неверсионном файле конфигурации.