# Automatically identifying the "split" point of a merged branch.

3 messages from 2011-07-31 to 2011-07-31. Participants: Conrad Irwin, Jeff King.
Thread: https://gitlist.dev/t/27967

## Conrad Irwin, 2011-07-31 00:54

Subject: Automatically identifying the "split" point of a merged branch.
Message-ID: <CAOTq_ptov+6ixvyVvK3iuDp4L-=9PtKES14O93kL9n6hUz0JHA@mail.gmail.com>
URL: https://gitlist.dev/e/CAOTq_ptov%2B6ixvyVvK3iuDp4L-%3D9PtKES14O93kL9n6hUz0JHA%40mail.gmail.com

```
Hello Gitters,

I wonder if I might pick your brains on the best way to handle a
situation I found myself in recently:

We have an integration branch, and a master branch, and a topic branch
that was based on the integration branch. Graphically:

A-o-o-o-o-o-o-o-o-o-E-(master)
 \
  o-o-B-o-o-o-o-M-o-o(integration)
       \       /
        C-o-o-D (topic)

I wanted to introduce this branch onto master to end up with:

A-o-o-o-o-o-o-o-o-o-E-----------N (master)
 \                   \         /
  \                   C'-o-o-D' (topic-rebased)
   \
    o-o-B-o-o-o-o-M-o-o(integration)
         \       /
          C-o-o-D (topic)

(ASCII art reproduced at http://dpaste.org/GUmM/ lest it be munged)

While it's easy to create comit N once I have commit D' (with git
merge --no-ff), I found that it's not at all easy to work out where
commit B is in order to do do a rebase --onto master B.

My usual approach would be to try and use git merge-base, but because
the topic branch is already merged into the integration branch, that
doesn't give useful output.

Is there a good way around this?

Conrad

```

## Jeff King, 2011-07-31 05:53

Subject: Re: Automatically identifying the "split" point of a merged branch.
Message-ID: <20110731055310.GA14384@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20110731055310.GA14384%40sigill.intra.peff.net
In-Reply-To: <CAOTq_ptov+6ixvyVvK3iuDp4L-=9PtKES14O93kL9n6hUz0JHA@mail.gmail.com>

```
On Sat, Jul 30, 2011 at 05:54:59PM -0700, Conrad Irwin wrote:

> I wanted to introduce this branch onto master to end up with:
> 
> A-o-o-o-o-o-o-o-o-o-E-----------N (master)
>  \                   \         /
>   \                   C'-o-o-D' (topic-rebased)
>    \
>     o-o-B-o-o-o-o-M-o-o(integration)
>          \       /
>           C-o-o-D (topic)
> 
> (ASCII art reproduced at http://dpaste.org/GUmM/ lest it be munged)
> 
> While it's easy to create comit N once I have commit D' (with git
> merge --no-ff), I found that it's not at all easy to work out where
> commit B is in order to do do a rebase --onto master B.

If you know M, then B is the merge-base of M^1 and M^2 (i.e., the
parents of M). If you don't know M, but do know D, you can find it by
walking backwards from "integration" until you find a merge commit with
D as its second parent (e.g., by grepping "rev-list --parents").

Make sense?

-Peff

```

## Conrad Irwin, 2011-07-31 06:08

Subject: Re: Automatically identifying the "split" point of a merged branch.
Message-ID: <CAOTq_psXsjipBxcG+86bQvPwQj866iAf_c9nQJ=KvjCjYHtySg@mail.gmail.com>
URL: https://gitlist.dev/e/CAOTq_psXsjipBxcG%2B86bQvPwQj866iAf_c9nQJ%3DKvjCjYHtySg%40mail.gmail.com
In-Reply-To: <20110731055310.GA14384@sigill.intra.peff.net>

```
On Sat, Jul 30, 2011 at 10:53 PM, Jeff King <peff@peff.net> wrote:
> On Sat, Jul 30, 2011 at 05:54:59PM -0700, Conrad Irwin wrote:
>
> If you know M, then B is the merge-base of M^1 and M^2 (i.e., the
> parents of M). If you don't know M, but do know D, you can find it by
> walking backwards from "integration" until you find a merge commit with
> D as its second parent (e.g., by grepping "rev-list --parents").
>
> Make sense?

Yup. git rev-list was definitely the tool I was missing, thank you :).

Conrad

merge=$(git rev-list --parents integration |\
                 grep " $(git rev-parse topic)" | cut -d' ' -f 1)
split=$(git merge-base $merge^ $merge^2)
git rebase --onto master $split
git checkout master
git merge --no-ff topic

```
