Make git pull –rebase preserve merge commits
git pull --rebase removes unpushed merge commits. Is there a way to make it preserve them?
Say my history looks like—
A | \ B H | | C G | | D F | / E
A being the merge commit.)
git pull --rebase it becomes—
H | G | F | X | B | C | D | E
X being the new commits
git pull --rebase inserted into my history.)—
A is removed.
I know you can use
git rebase --preserve-merges to preserve them with
git rebase, but I don’t see a way to preserve them with
git pull --rebase.
3 Solutions collect form web for “Make git pull –rebase preserve merge commits”
you can split your
pull in a
fetch and a
git fetch origin master git rebase origin master --preserve-merges
Or (for the upcoming git 1.8.5 Q4 2013, now delivered in git 1.8.5, 2013-11-27):
git pull --rebase” always chose to do the bog-standard flattening rebase.
You can tell it to run “
rebase --preserve-merges” by setting “
pull.rebase” configuration to “
So a simple config will be enough to make sure your
pull --rebase does preserve merge:
git config pull.rebase preserve
See commit 66713ef3 for more (thanks to Stephen Haberman):
pull: allow pull to preserve merges when rebasing
If a user is working on master, and has merged in their feature branch, but now has to “
git pull” because master moved, with
pull.rebasetheir feature branch will be flattened into master.
This is because “
git pull” currently does not know about rebase’s preserve merges flag, which would avoid this behavior, as it would instead replay just the merge commit of the feature branch onto the new master, and not replay each individual commit in the feature branch.
--rebase=preserveoption, which will pass along
Also add ‘
preserve‘ to the allowed values for the
git pull --rebase=preserve
From the docs:
When set to preserve, rebase with the
--preserve-mergesoption passed to
git rebaseso that locally created merge commits will not be flattened.