Git Merge стратегия для интеграции ветки 'patch' в 'minor', 'minor' в ветку 'major'
У нас есть репозиторий, содержащий несколько проектов Java (около 20 или около того), созданных Maven.
У нас есть 3 филиала в нашем хранилище, patch
, minor
, а также major
,
За ProjectA
, pom.xml
а также MANIFEST.MF
на patch
ветви установлены в 1.3.7
в то время как на minor
они настроены на 1.4.0
и на major
они настроены на 2.0.0
,
Вот болевая точка: при выполнении освобождения от patch
ветвь, затем мы хотим объединить этот новый тег (projecta-1.3.7
) вперед в minor
а также major
ветви.
Проблема в том, что даже если мы изменили только один .java
файл в ветке патча (скажем, это было критическое исправление), каждый раз, когда мы должны проходить и разрешать конфликты для каждого из pom.xml
а также MANIFEST.MF
файлы. Итак, это:
git checkout minor
git merge projecta-1.3.7
Результаты в minor
получить исправление (ууууууу!), но также требует от нас пройти и сравнить конфликт между всеми projecta-1.3.7
проекты, использующие версии исправлений, и minor
проекты с использованием минорных версий.
Есть ли способ сказать Git, как часть команды слияния, что мы хотим использовать "нашу" стратегию для обоих pom.xml, MANIFEST.MF
, но что любые другие конфликты должны быть разрешены с использованием стратегии по умолчанию?
1 ответ
Я обычно справляюсь с этим, фиксируя изменения кода для исправления ошибки как отдельный коммит (ы) от коммита для увеличения версии # (что, как я полагаю, является изменением файлов pom.xml и MANIFEST). Затем я могу слить коммиты изменения кода в другие ветки в обычном режиме, а затем, наконец, "подделать" слияние изменения "version # bump" отдельно с merge --strategy=ours
,
Оп спрашивает:
Наш процесс: (1) выпуск проекта 1.3.7 (2) слияние тега в будущие ветки ("второстепенные") (3) обновление POM/MANIFEST до 1.3.8, (4) ... работа... (5) затем через пару недель снова начните с (1).
Хорошо, мой поток был немного другим, но, следуя вашему потоку, если шаг 3 сгенерировал коммит #1234ABCD, то я бы дополнительно сделал шаг 3a:
$ git checkout MAINLINE
$ git merge --strategy=ours 1234ABCD
Это гарантирует, что когда вы вернетесь назад и нажмете на шаге 2 в будущем, версия # bump будет считаться объединенной и будет проигнорирована.
В качестве альтернативы, не делайте 3а, пока не позже. Когда вы достигнете шага № 2 в будущем, выполните фиктивное слияние # 1234ABCD и затем объедините все коммиты в ветви после #1234ABCD. При повторном поднятии версии # в ветке - "поддельное слияние" (сразу или позже).
Основная идея состоит в том, чтобы просто изолировать коммиты и выпуклые версии # и "поддельные" объединить их по отдельности - когда вы делаете это, зависит от вас. Даже если версия # bump находится в середине коммитов на ветке, которую вы хотите объединить, затем объедините все остальные коммиты перед первым, затем подделайте тот, который поднимает версию #, а затем объедините все коммиты. после этого.
Вот грубое изображение слияния, которое я сделал на прошлой неделе. Коммиты вниз по левому краю - это разработка MAINLINE, а не по левому краю, которые сделаны в RELEASEBRANCH (ветке обслуживания). Порядок фиксации не соответствует вашему потоку, но это не имеет значения.
* bc26f91 Oct 31 Fake merge from IT17p2 to ignore inapplicable commit: All web-apps: blah blah blah (MAINLINE)
|\
| * 3cd69ad Oct 31 All web-apps: bump release # for new release (RELEASEBRANCH)
* | 8eae339 Oct 31 Merge fix from IT17p2: All web-apps: blah blah blah
|\ \
| |/
| * 3612072 Oct 31 All web-apps: blah blah blah
| |