Rebasing multiple branches
Hi,
I need to rebase a rather complicated formation of branches.
My situation is like this (I hope ASCII graphics survive the sending):
B--o--o--o--o--o--o <--branch A
/ \
o--o--A--o--E <--master C--o--o--o--D <--branch C
\ /
C--o--o--o--o--o--o <--branch BI would like to rebase all three branches A, B and C onto commit E, and it's very important to keep the information about merges. For instance, if I take commit C and rebase it onto D, it serializes all the intermediate commits. The only solution I managed to come up with is as follows:
- Take branch A and rebase it onto D (branch A').
- Same with branch B.
- Open a new branch C' from commit E.
- Merge A' and B' into C'.
- Manually cherry-pick all commits from commit C to commit D into branch C'.
The last step is way too ugly to be the only possible solution :)
Am 12/21/2010 14:40, schrieb Leonid Podolny:
Quoted 7 lines
B--o--o--o--o--o--o <--branch A / \ o--o--A--o--E <--master C--o--o--o--D <--branch C \ / C--o--o--o--o--o--o <--branch BI would like to rebase all three branches A, B and C onto commit E,...
git rebase master A
git rebase master B
git merge A
git rebase -i HEAD C
The last rebase I propose as interactive so that you can remove those commits before D~3 that you have already rebased, because they are likely to conflict unnecessarily, and you would --skip them anyway.
(Note: "C" is the branch C, not the commit C. Please make labels unambiguous next time.)
-- Hannes
Quoted 9 lines · Johannes Sixt
Am 12/21/2010 14:40, schrieb Leonid Podolny:
Quoted 7 lines
B--o--o--o--o--o--o <--branch A / \ o--o--A--o--E <--master C--o--o--o--D <--branch C \ / C--o--o--o--o--o--o <--branch BI would like to rebase all three branches A, B and C onto commit E,...
Quoted 8 lines
git rebase master A
git rebase master B
git merge A
git rebase -i HEAD CThe last rebase I propose as interactive so that you can remove those commits before D~3 that you have already rebased, because they are likely to conflict unnecessarily, and you would --skip them anyway.
Why not this way ?
git checkout D
git rebase -p -i D~3 --onto C'
(C' is the merged branch of A' and B').
So:
git checkout branch_A -b rebasing_A
git rebase master # rebase old A to master
git checkout branch_B -b rebasing_B
git rebase master # rebase old B to master
git checkout -b rebased_merge
git merge rebasing_A # we're on B', merge in A'
git checkout branch_C
git rebase -p -i C --onto rebased_merge # set D~3..D ontop of it
cu
Signature · 8 lines
---------------------------------------------------------------------- Enrico Weigelt, metux IT service -- http://www.metux.de/ phone: +49 36207 519931 email: [email protected] mobile: +49 151 27565287 icq: 210169427 skype: nekrad666 ---------------------------------------------------------------------- Embedded-Linux / Portierung / Opensource-QM / Verteilte Systeme ----------------------------------------------------------------------
Quoted 20 lines · Enrico Weigelt
Why not this way ?
git checkout D
git rebase -p -i D~3 --onto C'(C' is the merged branch of A' and B').
So:
git checkout
branch_A-brebasing_A
git rebase master # rebase old A to master
git checkoutbranch_B-brebasing_B
git rebase master # rebase old B to master
git checkout -brebased_merge
git mergerebasing_A# we're on B', merge in A'
git checkoutbranch_C
git rebase -p -i C --ontorebased_merge# set D~3..D ontop of it
Quoted 1 line
cu
Ah, nice. I didn't notice the -p option. However, the man page advises against using -p and -i together.
Quoted 2 lines · Leonid Podolny
Ah, nice. I didn't notice the -p option. However, the man page advises against using -p and -i together.
Last time I checked, -i required -p ...
cu
Signature · 8 lines
---------------------------------------------------------------------- Enrico Weigelt, metux IT service -- http://www.metux.de/ phone: +49 36207 519931 email: [email protected] mobile: +49 151 27565287 icq: 210169427 skype: nekrad666 ---------------------------------------------------------------------- Embedded-Linux / Portierung / Opensource-QM / Verteilte Systeme ----------------------------------------------------------------------
Please don't cull the Cc lists. Unless he's subscribed, Leonid never got your reply!
Quoted 6 lines · Enrico Weigelt
Quoted 2 lines · Leonid Podolny
Ah, nice. I didn't notice the -p option. However, the man page advises against using -p and -i together.
Last time I checked, -i required -p ...
-p internally implies -i, but the user doesn't have to know that ;-)
The problem is that the todo file language is not expressive enough for what -p needs to do. Running a rebase -p without changing the todo file should behave reasonably. On the other hand, if you rearrange or extend the todo file in many cases that gives unexpected results.
Hence the recommendation to not use it with -i.
Signature · 2 lines
Thomas Rast
trast@{inf,student}.ethz.ch