Задать вопрос

Повторное слияние rebased ветки — как обычно делается?

Часто стала возникать интересная ситуация с гитом и несколькими девелоперами. Предположим, есть ветки master и 2 ветки разработчика, devel1 и devel2.


Но при этом мы решили от первого не брать коммит C10, поэтому сделали rebased ветку без него и, соответственно с измененным C11'
73fa7c997a4b703ffde1aa37b22737f8.png


Далее сделали мердж devel2 и rebased в мастер
9e15ed93c412acf0bec9bf522fc33343.png


Однако в этом время разработчики в ветке devel1 продолжают делать новые коммиты:
295e12a46b308179595d8f263dd8d91e.png


Со временем мы захотели снова замерджить их новую работу в master, и тут возникают проблемы:

1. Если мы сделали

> git checkout master

> git merge devel1


Получим в логе мастера 2 версии C11: C11 и C11' и наш невзятый С10 (а мы его не хотим брать по-прежнему)


2. Если мы сделали

> git checkout master

> git cherry-pick C14

То вроде вышло то что нам нужно, однако гит не знает, что мы таким образом организовали слияние, и впоследствии при изменении около этих мест и новом слиянии получим конфликт. Ну и помимо того, нам необходимо вручную выбирать коммиты, которые необходимо «добавить».


3. Если после создания rebased сделать

> git checkout devel1

> git reset --hard rebased

То разработчики не смогут сделать push из-за конфликтов, да и C10 потеряется (возможно он потом таки понадобится после правок), что также плохо.


В общем, мне почему-то кажется, что по-правильному должен быть какой-то механизм сделать реверт коммита, так чтобы ни он, ни ревертнутый в истории не отображался, но при этом гит его не пытался заново применить, и мерджи проходили гладко, без необходимости помнить что «мне нужно пока что этот коммит не pick'ать», а также без дублирования коммитов.


Ситуация достаточно распространенная, предполагаю, что я просто что-то упустил!
  • Вопрос задан
  • 4091 просмотр
Подписаться 3 Оценить Комментировать
Решения вопроса 1
mejedi
@mejedi
Предлагаю такой вариант. Вместо порождения rebased, вы мерджите devel1 в master с ключем --no-commit (и --no-ff).
Это симуляция workflow с конфликтом слияния — перед тем как окончательно сформировать merge commit, git даст вам возможность внести произвольные изменения.

Далее вы откатываете изменения из коммита C10, и комититесь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
0lympian
@0lympian Автор вопроса
mejedi, и что это даст? В таком случае кода из C10 не будет, и при последующем слиянии ветки он снова «воскреснет» сам. А нужно как раз наоборот, чтобы он был, но по умолчанию не «воскресал» (и желательно не висел в истории этой ветки). Неужели нету подобного механизма?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы