Подтвердить что ты не робот

Как избежать git rebase kill merge commits?

Учитывая следующую историю 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
4b9b3361

Ответ 1

Добавьте --preserve-merges в свою команду rebase. Если в вашем слиянии есть разрешения конфликтов, добавьте "рекурсивную их" стратегию в качестве параметра.

Ответ 2

Это не будет очень красиво, но я думаю, вы можете это сделать.

Переставьте 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" после каждой команды, чтобы вы могли видеть, что меняется.

Кто-то еще должен опубликовать, если они знают более элегантный способ сделать это.