Reputation: 6367
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.)
After a 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
.
Upvotes: 20
Views: 9019
Reputation: 1329972
Update: As I presented in "What exactly does Git's "rebase --preserve-merges
" do (and why?)", since Git 2.18 (Q2 2018), you would prefer the new option --rebase-merges
to the legacy one --preserve-merge
Since then:
--preserve-merge
, andSo:
git rebase --interactive --rebase-merges origin/master
# or
git config pull.rebase merges
git rebase --interactive origin/master (would use rebase-merges)
Original answer 2013:
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 "preserve
".
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):
If a user is working on master, and has merged in their feature branch, but now has to "
git pull
" because master moved, withpull.rebase
their 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.Add a
--rebase=preserve
option, which will pass along--preserve-merges
to rebase.Also add '
preserve
' to the allowed values for thepull.rebase
config setting.
Upvotes: 37
Reputation: 9464
Since git v2.22.0, --preserve-merges
option has been deprecated in favor of --rebase-merges
(to be used in combination with --interactive
option) to reapply commits on top of another base tip with git-rebase
:
git fetch origin master
git rebase --interactive --rebase-merges origin/master
Upvotes: 0
Reputation: 47297
you can split your pull
in a fetch
and a rebase
git fetch origin master
git rebase origin master --preserve-merges
Upvotes: 18
Reputation: 2172
Simply:
git pull --rebase=preserve
From the docs:
When set to preserve, rebase with the
--preserve-merges
option passed togit rebase
so that locally created merge commits will not be flattened.
Upvotes: 9