Как избежать коммитов git rebase killing merge? - PullRequest
32 голосов
/ 03 июня 2011

Учитывая следующую 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, поэтому история слияния была потеряна. Есть ли какой-то способ сохранить это слияние, все еще получая ребаз? Для ясности, мой предполагаемый результат:

A-B-C-I-F-G-H  master
 \       /
  D-----E      branch-b

Ответы [ 2 ]

47 голосов
/ 03 июня 2011

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

2 голосов
/ 03 июня 2011

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

Переместите F на origin / master в качестве новой ветки master:

git checkout F
git checkout -b new_master
git rebase origin/master

Merge branch-b в вашу новую ветку:

git merge branch-b

Вишня, выберите оставшийся коммит H для вашей новой главной ветви:

git cherry-pick master

Удалите свою старую главную ветку:

git branch -D master

К сожалению, вам также придется снова выполнить слияние (надеюсь, оно не требует ручного слияния).

На самом деле я не пробовал это сделать, поэтому сначала я сделаю резервную копию репозитория,но я уверен, что ты получишь то, что хочешь.Я также предлагаю открывать gitk --all и обновлять дерево с помощью «F5» после каждой команды, чтобы вы могли видеть, что меняется.

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

...