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
| |
Другие вопросы по тегам