We have a sequence of events like this:
Is it possible to turn the merge in step 3 into a rebase? If nothing else, it would make the impending merge simpler as there would be less history to look at.
We haven't had rerere enabled.
Consider the following Git graph:
A...C...D...F
^ ^ ^ master
\ \
G...H...I...J
^ feature
The ... means "lots of commits".
Suppose we want to essentially rebase, i.e. take the commits in feature's history but not in master's history and reform them as a linear sequence of commits in master. This confounded by the fact that we merged master into feature at commit I
. If we try to rebase, Git screws up because it tries to apply e.g. C
on top of master and finds conflicts.
We can solve this problem by grabbing the actual changes from feature
and packing them into a new commit.
Here's a way to do this using only very basic Git commands:
(1) git checkout feature
(2) git merge master
(3) git reset A
(4) git add -A # This stages all working copy changes
(5) git commit -m "Every change between A and J"
In step (2), the feature
branch has all changes in both master
and J
.
After step (3), HEAD points at A
, but our working copy has all the changes from master
and J
, and steps (4) and (5) stage and commit those changes.
At this point our graph looks like this
A...C...D...F
^ ^ master
\
J'
^ feature
Note that J'
contains everything in A...F
. Now we do
git rebase master
Git happily applies the changes in J'
as a new commit J''
, but the only changes to add are those in G...J
because the other changes are already in master. So now we have
A...F<--J''
master^ ^feature
with all of the changes in our feature
branch squashed into commit J''
.
At this point, you can reset to F
and re-apply changes in J''
in a more granular fashion (even using git add --patch
) if you want.
Another way to do essentially the same thing is with read-tree
as explained in this other answer
git checkout master
git read-tree -u -m feature
Yet another way to do the same thing, stolen from this answer, is
git diff master > feature.patch
git checkout master
patch -p1 < feature.patch
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With