Как правильно слить ветку в git?

У меня есть ветки main и stage. От ветки main я сделал новую ветку fix-1. Чтобы проверить все правки, я слил fix-1 в ветку main, потом сделал ветку fix-2 от main. Её тоже слил в ветку main. Теперь нужно в начале слить ветку fix-2 в ветку stage, чтобы изменения fix-1 не попали в stage. Как правильно это сделать?

Смотрел в сторону cherry-pick. Но мне это кажется не очень правильным, потому как бывают ситуации, когда веток и комитов в ветках куда больше.


Ответы (1 шт):

Автор решения: Qwertiy

Очень похоже на какую-то работу с релизами и поддержку старых версий.

Т. е. в stage старая поддерживаемая версия, в main - текущая разработка, fix-1 надо внести только в новую версию, а fix-2 - в обе.

В таком случае правильно было создавать ветку fix-2 от stage, а потом сам stage мёрджить в main. Если есть пропускаемые коммиты, то мёрджить их отдельно с -s ours.


Если уже есть описанная история коммитов и не планируется в дальнейшем мёрджить stage в main, то можно сделать так:

  1. Мёрджим fix-1 из main в stage c -s ours - при этом в stage нет никаких изменений, но git считает, что merge выполнен
  2. Мёрджим main в stage - теперь туда попадает только fix-2.

Я писал по памяти и не проверял, так что на всякий случай осторожнее, но по идее должно сработать.

И ещё, если воспользоваться этой схемой, то всё, что было в main до этого мёрджа, с помощью стандартных мёрджей уже не сможет попасть в stage. Я не уверен, но мне кажется, что при мёрдже из stage в main оно будет удалено из main (по крайней мере, если не используется -s ours).

→ Ссылка