Code

Teach rebase -i about --preserve-merges
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Mon, 25 Jun 2007 17:59:43 +0000 (18:59 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 27 Jun 2007 01:58:59 +0000 (18:58 -0700)
commitf09c9b8c5ff9d8a15499b09ccd6c3e7b3c76af77
tree39662b301bd6abe55717934d567f72cd9b54dea7
parent68a163c9b483ae352fcfee8c4505d113213daa73
Teach rebase -i about --preserve-merges

The option "-p" (or long "--preserve-merges") makes it possible to
rebase side branches including merges, without straightening the
history.

Example:

           X
            \
         A---M---B
        /
---o---O---P---Q

When the current HEAD is "B", "git rebase -i -p --onto Q O" will yield

               X
                 \
---o---O---P---Q---A'---M'---B'

Note that this will

- _not_ touch X [*1*], it does

- _not_ work without the --interactive flag [*2*], it does

- _not_ guess the type of the merge, but blindly uses recursive or
  whatever strategy you provided with "-s <strategy>" for all merges it
  has to redo, and it does

- _not_ make use of the original merge commit via git-rerere.

*1*: only commits which reach a merge base between <upstream> and HEAD
     are reapplied. The others are kept as-are.

*2*: git-rebase without --interactive is inherently patch based (at
     least at the moment), and therefore merges cannot be preserved.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-rebase.txt
git-rebase--interactive.sh
t/t3404-rebase-interactive.sh