Ответ 1
Добавьте --preserve-merges
в свою команду rebase. Если в вашем слиянии есть разрешения конфликтов, добавьте "рекурсивную их" стратегию в качестве параметра.
Учитывая следующую историю git
:
C-I origin/master
/
A-B-F-G-H master
\ /
D-E branch-b
Я хочу переустановить мою локальную ветвь master
поверх origin/master
, но я хочу сохранить фиксацию слияния G
. Когда я попробовал просто сделать git rebase origin/master
, а в master
, он сжал D..E
как G
и зафиксировал это с сообщением фиксации E
, поэтому история, в которой произошла слияния, была потеряна. Есть ли способ сохранить это слияние, все еще получая rebase? Для ясности мой предполагаемый результат:
A-B-C-I-F-G-H master
\ /
D-----E branch-b
Добавьте --preserve-merges
в свою команду rebase. Если в вашем слиянии есть разрешения конфликтов, добавьте "рекурсивную их" стратегию в качестве параметра.
Это не будет очень красиво, но я думаю, вы можете это сделать.
Переставьте F в начало/мастер как новую ветвь главного устройства:
git checkout F
git checkout -b new_master
git rebase origin/master
Объединить ветвь-b в новую ветку:
git merge branch-b
Черри возьмите оставшуюся H-фиксацию на новую ветку мастера:
git cherry-pick master
Удаление старой ветки мастера:
git branch -D master
К сожалению, вам также придется снова выполнить слияние (надеюсь, что ручное слияние не требуется).
Я действительно не пробовал это, поэтому сначала создаю резервную копию хранилища, но я уверен, что вы получите то, что хотите. Я также предлагаю открыть gitk -all и обновить дерево с помощью "F5" после каждой команды, чтобы вы могли видеть, что меняется.
Кто-то еще должен опубликовать, если они знают более элегантный способ сделать это.