How to avoid git rebase killing merge commits?
Given the following git
history:
C-I origin/master
/
A-B-F-G-H master
\ /
D-E branch-b
I want to rebase my local master
branch on top of origin/master
, but I want to preserve the merge commit G
. When I tried simply doing a 开发者_运维知识库git rebase origin/master
while at master
it squashed D..E
as G
and committed that with the commit message of E
, so the history that there was a merge was lost. Is there some way of preserving this merge while still getting the rebase? For clarity, my intended result is:
A-B-C-I-F-G-H master
\ /
D-----E branch-b
Add --preserve-merges
to your rebase command. In case there were conflict resolutions in your merge, add 'recursive theirs' strategy as a parameter as well.
EDIT: --preserve-merges
is now deprecated, use --rebase-merges
instead
This isn't going to be very pretty but I think you can do it.
Rebase F onto the origin/master as your new master branch:
git checkout F
git checkout -b new_master
git rebase origin/master
Merge branch-b into your new branch:
git merge branch-b
Cherry pick the remaining H commit onto your new master branch:
git cherry-pick master
Delete your old master branch:
git branch -D master
Unfortunately you will also have to do the merge again (hopefully it doesn't take any manual merging).
I didn't actually try this out, so I would make a backup of the repository first, but I am pretty confident that you will get what you want. I also suggest opening up gitk --all and refreshing the tree with "F5" after each command so you can see what is changing.
Someone else should still post if they know of a more elegant way to do it.
精彩评论