Как перебазировать слияние, но сохранить фиксацию слияния

Я и моя команда разрабатываем функцию, используя удаленную ветку (origin/our_feature_branch) вне основного пути (origin/dev). Геррит используется для обзора и т. д.

Поднятие удаленной ветки выполняется с помощью git merge origin/dev, за которым следует исправление конфликтов, фиксация и git push origin HEAD:refs/for/our_feature_branch.

Геррит применяет правило, согласно которому за один раз может быть отправлена ​​только одна фиксация. Я ничего не могу с этим поделать.

Скажем, я начинаю работать над поднятием вверх:

git fetch
git checkout -b uplift origin/our_feature_branch
git merge origin/dev

Но здесь я застреваю, исправляя некоторые конфликты, и регрессионные тесты занимают некоторое время, и какой-то член команды отправляет еще один коммит в ветку функций в Gerrit. Этот коммит теперь находится поверх базового коммита для моего «текущего» повышения.

Что мне теперь делать?

Если я перебазирую свою фиксацию слияния в ветке функций, я удаляю слияние и добавляю все коммиты, объединенные из origin/dev, поверх него - не вариант. Если я сливаюсь с веткой функций, я получаю слияние на слиянии, и в конечном итоге мне придется отправить два коммита в Gerrit — это тоже не разрешено.

Есть ли решение этой проблемы или мне нужно заново выполнить слияние и постараться не забыть сообщить всем, что у нас есть остановка доставки в следующий раз, когда я начну работать над поднятием?


person Martin G    schedule 13.11.2015    source источник
comment
Вы пытались перебазировать фиксацию слияния на новую фиксацию, используя git rebase -p?   -  person user4815162342    schedule 13.11.2015
comment
Читая документацию, -p выглядит многообещающе. Я попробую, когда вернусь в офис в понедельник, спасибо!   -  person Martin G    schedule 14.11.2015
comment
Предупреждение: начиная с Git 2.18 (второй квартал 2018 года, 5 лет спустя) git --rebase-merges в конечном итоге заменит старый git --preserve-merges. См. Что именно делает Git «rebase --preserve-merges» (и почему?)   -  person VonC    schedule 27.05.2018


Ответы (1)


Как было предложено в комментариях, git rebase -p решает проблему

Начните создавать коммит uplift:

git fetch
git checkout -b uplift origin/our_feature_branch
git merge origin/dev
git commit

Что-то отправлено origin/our_feature_branch в Gerrit.

Выполните следующие действия, чтобы перебазировать фиксацию слияния и сохранить слияние:

git fetch
git rebase -p origin/our_feature_branch

Теперь фиксация слияния может быть передана Герриту, и она будет основана на последней версии origin/our_feature_branch и той же origin/dev, что и до git rebase -p.

person Martin G    schedule 16.11.2015