threads / discuss / 26113

Rebasing multiple branches

Subject: Rebasing multiple branches

## tl;dr

6 messages between Dec 21, 2010 and Dec 31, 2010.

replies: 5people: 4as markdown or json

Leonid Podolny· Dec 21, 2010, 13:40 UTC · lore

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 B
I 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 :)
Johannes Sixt· Dec 21, 2010, 14:06 UTC · re: Leonid Podolny · lore

Re: Rebasing multiple branches

Am 12/21/2010 14:40, schrieb Leonid Podolny:
Show 7 quoted 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 B
> 
> I 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
Enrico Weigelt· Dec 22, 2010, 14:36 UTC · re: Johannes Sixt · lore

Re: Rebasing multiple branches

* Johannes Sixt <j.sixt@viscovery.net> wrote:
Show 17 quoted lines
> Am 12/21/2010 14:40, schrieb Leonid Podolny:
> >         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 B
> > 
> > I 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.
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
-- 
----------------------------------------------------------------------
 Enrico Weigelt, metux IT service -- http://www.metux.de/

 phone:  +49 36207 519931  email: weigelt@metux.de
 mobile: +49 151 27565287  icq:   210169427         skype: nekrad666
----------------------------------------------------------------------
 Embedded-Linux / Portierung / Opensource-QM / Verteilte Systeme
----------------------------------------------------------------------
Leonid Podolny· Dec 22, 2010, 14:54 UTC · re: Enrico Weigelt · lore

Re: Rebasing multiple branches

On 12/22/2010 04:36 PM, Enrico Weigelt wrote:
Show 21 quoted lines
> 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

Ah, nice. I didn't notice the -p option. However, the man page advises against using -p and -i together.

Enrico Weigelt· Dec 30, 2010, 05:35 UTC · re: Leonid Podolny · lore

Re: Rebasing multiple branches

* Leonid Podolny <leonidp.lists@gmail.com> wrote:
> 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
-- 
----------------------------------------------------------------------
 Enrico Weigelt, metux IT service -- http://www.metux.de/

 phone:  +49 36207 519931  email: weigelt@metux.de
 mobile: +49 151 27565287  icq:   210169427         skype: nekrad666
----------------------------------------------------------------------
 Embedded-Linux / Portierung / Opensource-QM / Verteilte Systeme
----------------------------------------------------------------------
Thomas Rast· Dec 31, 2010, 14:55 UTC · re: Enrico Weigelt · lore

Re: Rebasing multiple branches

Please don't cull the Cc lists. Unless he's subscribed, Leonid never got your reply!

Enrico Weigelt wrote:
Show 6 quoted lines
> * Leonid Podolny <leonidp.lists@gmail.com> wrote:
> 
> > 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.
-- 
Thomas Rast
trast@{inf,student}.ethz.ch

← back to recent threads