# Question about "git log --cherry"

7 messages from 2013-09-26 to 2013-09-27. Participants: Francis Moreau, John Keeping.
Thread: https://gitlist.dev/t/35028

## Francis Moreau, 2013-09-26 16:35

Subject: Question about "git log --cherry"
Message-ID: <CAC9WiBjLqdqSKgLv_M6FPx3a2J-+ZKAQnk9OGn3h5SfqSpiT3g@mail.gmail.com>
URL: https://gitlist.dev/e/CAC9WiBjLqdqSKgLv_M6FPx3a2J-%2BZKAQnk9OGn3h5SfqSpiT3g%40mail.gmail.com

```
Hello,

I'm trying to use "git log --cherry ..." in order to display new, kept
and removed commits between two branches A and B.

So commits which are only in B are considered new and should be marked
with '+'. Commits which are in both branches are marked with '=' but
only commit in branch B are shown. Eventually commits which are in A
but not in B anymore should be marked with '-'.

So far I found this solution:

  $ git log --cherry-mark --right-only A...B
  $ git log --cherry-pick  --left-only   A...B

but I have to call twice git-log. This can be annoying since depending
on A and B, calling git-log can take time.

Is there another option that I'm missing which would do the job but
with only one call to git-log ?

Thanks
-- 
Francis

```

## John Keeping, 2013-09-26 20:21

Subject: Re: Question about "git log --cherry"
Message-ID: <20130926202153.GC27238@serenity.lan>
URL: https://gitlist.dev/e/20130926202153.GC27238%40serenity.lan
In-Reply-To: <CAC9WiBjLqdqSKgLv_M6FPx3a2J-+ZKAQnk9OGn3h5SfqSpiT3g@mail.gmail.com>

```
On Thu, Sep 26, 2013 at 06:35:57PM +0200, Francis Moreau wrote:
> I'm trying to use "git log --cherry ..." in order to display new, kept
> and removed commits between two branches A and B.
> 
> So commits which are only in B are considered new and should be marked
> with '+'. Commits which are in both branches are marked with '=' but
> only commit in branch B are shown. Eventually commits which are in A
> but not in B anymore should be marked with '-'.
> 
> So far I found this solution:
> 
>   $ git log --cherry-mark --right-only A...B
>   $ git log --cherry-pick  --left-only   A...B
> 
> but I have to call twice git-log. This can be annoying since depending
> on A and B, calling git-log can take time.
> 
> Is there another option that I'm missing which would do the job but
> with only one call to git-log ?

Does this do what you want?

    git log --cherry-mark --left-right A...B |
    sed -e '/^commit / {
        y/<>/-+/
    }'

```

## Francis Moreau, 2013-09-27 05:09

Subject: Re: Question about "git log --cherry"
Message-ID: <CAC9WiBjykt5qj2sRtTK=VHp0B5x===7oqVP7VRC6BOdCMTn9yg@mail.gmail.com>
URL: https://gitlist.dev/e/CAC9WiBjykt5qj2sRtTK%3DVHp0B5x%3D%3D%3D7oqVP7VRC6BOdCMTn9yg%40mail.gmail.com
In-Reply-To: <20130926202153.GC27238@serenity.lan>

```
Hi,

On Thu, Sep 26, 2013 at 10:21 PM, John Keeping <john@keeping.me.uk> wrote:
> On Thu, Sep 26, 2013 at 06:35:57PM +0200, Francis Moreau wrote:
>> I'm trying to use "git log --cherry ..." in order to display new, kept
>> and removed commits between two branches A and B.
>>
>> So commits which are only in B are considered new and should be marked
>> with '+'. Commits which are in both branches are marked with '=' but
>> only commit in branch B are shown. Eventually commits which are in A
>> but not in B anymore should be marked with '-'.
>>
>> So far I found this solution:
>>
>>   $ git log --cherry-mark --right-only A...B
>>   $ git log --cherry-pick  --left-only   A...B
>>
>> but I have to call twice git-log. This can be annoying since depending
>> on A and B, calling git-log can take time.
>>
>> Is there another option that I'm missing which would do the job but
>> with only one call to git-log ?
>
> Does this do what you want?
>
>     git log --cherry-mark --left-right A...B |
>     sed -e '/^commit / {
>         y/<>/-+/
>     }'

Nope because --left-right shows common commits (with '=' mark) that
belong to A *and* B, and I'd like to have only the ones in B.

Thanks
-- 
Francis

```

## John Keeping, 2013-09-27 08:11

Subject: Re: Question about "git log --cherry"
Message-ID: <20130927081113.GE27238@serenity.lan>
URL: https://gitlist.dev/e/20130927081113.GE27238%40serenity.lan
In-Reply-To: <CAC9WiBjykt5qj2sRtTK=VHp0B5x===7oqVP7VRC6BOdCMTn9yg@mail.gmail.com>

```
On Fri, Sep 27, 2013 at 07:09:03AM +0200, Francis Moreau wrote:
> Hi,
> 
> On Thu, Sep 26, 2013 at 10:21 PM, John Keeping <john@keeping.me.uk> wrote:
> > On Thu, Sep 26, 2013 at 06:35:57PM +0200, Francis Moreau wrote:
> >> I'm trying to use "git log --cherry ..." in order to display new, kept
> >> and removed commits between two branches A and B.
> >>
> >> So commits which are only in B are considered new and should be marked
> >> with '+'. Commits which are in both branches are marked with '=' but
> >> only commit in branch B are shown. Eventually commits which are in A
> >> but not in B anymore should be marked with '-'.
> >>
> >> So far I found this solution:
> >>
> >>   $ git log --cherry-mark --right-only A...B
> >>   $ git log --cherry-pick  --left-only   A...B
> >>
> >> but I have to call twice git-log. This can be annoying since depending
> >> on A and B, calling git-log can take time.
> >>
> >> Is there another option that I'm missing which would do the job but
> >> with only one call to git-log ?
> >
> > Does this do what you want?
> >
> >     git log --cherry-mark --left-right A...B |
> >     sed -e '/^commit / {
> >         y/<>/-+/
> >     }'
> 
> Nope because --left-right shows common commits (with '=' mark) that
> belong to A *and* B, and I'd like to have only the ones in B.

I think the only way you can address this is to post-process the result,
I don't know any way to remove a left side commit only if it is
patch-identical to a right side commit.

It should be relatively easy to filter out any '=' commits that are in
the output of "git rev-list --left-only A...B".

```

## Francis Moreau, 2013-09-27 08:28

Subject: Re: Question about "git log --cherry"
Message-ID: <CAC9WiBgzWXhoEuD1adwD+SwFScSwH+JFBLRq=26G5k8JxFysEg@mail.gmail.com>
URL: https://gitlist.dev/e/CAC9WiBgzWXhoEuD1adwD%2BSwFScSwH%2BJFBLRq%3D26G5k8JxFysEg%40mail.gmail.com
In-Reply-To: <20130927081113.GE27238@serenity.lan>

```
On Fri, Sep 27, 2013 at 10:11 AM, John Keeping <john@keeping.me.uk> wrote:
> On Fri, Sep 27, 2013 at 07:09:03AM +0200, Francis Moreau wrote:
>> Hi,
>>
>> On Thu, Sep 26, 2013 at 10:21 PM, John Keeping <john@keeping.me.uk> wrote:
>> > On Thu, Sep 26, 2013 at 06:35:57PM +0200, Francis Moreau wrote:
>> >> I'm trying to use "git log --cherry ..." in order to display new, kept
>> >> and removed commits between two branches A and B.
>> >>
>> >> So commits which are only in B are considered new and should be marked
>> >> with '+'. Commits which are in both branches are marked with '=' but
>> >> only commit in branch B are shown. Eventually commits which are in A
>> >> but not in B anymore should be marked with '-'.
>> >>
>> >> So far I found this solution:
>> >>
>> >>   $ git log --cherry-mark --right-only A...B
>> >>   $ git log --cherry-pick  --left-only   A...B
>> >>
>> >> but I have to call twice git-log. This can be annoying since depending
>> >> on A and B, calling git-log can take time.
>> >>
>> >> Is there another option that I'm missing which would do the job but
>> >> with only one call to git-log ?
>> >
>> > Does this do what you want?
>> >
>> >     git log --cherry-mark --left-right A...B |
>> >     sed -e '/^commit / {
>> >         y/<>/-+/
>> >     }'
>>
>> Nope because --left-right shows common commits (with '=' mark) that
>> belong to A *and* B, and I'd like to have only the ones in B.
>
> I think the only way you can address this is to post-process the result,
> I don't know any way to remove a left side commit only if it is
> patch-identical to a right side commit.
>
> It should be relatively easy to filter out any '=' commits that are in
> the output of "git rev-list --left-only A...B".

yes that's what I'm doing but I was wondering if that's possible to do
that with only one run of git-log/git-rev-list.

Thanks
-- 
Francis

```

## John Keeping, 2013-09-27 09:14

Subject: Re: Question about "git log --cherry"
Message-ID: <20130927091402.GF27238@serenity.lan>
URL: https://gitlist.dev/e/20130927091402.GF27238%40serenity.lan
In-Reply-To: <CAC9WiBgzWXhoEuD1adwD+SwFScSwH+JFBLRq=26G5k8JxFysEg@mail.gmail.com>

```
On Fri, Sep 27, 2013 at 10:28:05AM +0200, Francis Moreau wrote:
> On Fri, Sep 27, 2013 at 10:11 AM, John Keeping <john@keeping.me.uk> wrote:
> > On Fri, Sep 27, 2013 at 07:09:03AM +0200, Francis Moreau wrote:
> >> Hi,
> >>
> >> On Thu, Sep 26, 2013 at 10:21 PM, John Keeping <john@keeping.me.uk> wrote:
> >> > On Thu, Sep 26, 2013 at 06:35:57PM +0200, Francis Moreau wrote:
> >> >> I'm trying to use "git log --cherry ..." in order to display new, kept
> >> >> and removed commits between two branches A and B.
> >> >>
> >> >> So commits which are only in B are considered new and should be marked
> >> >> with '+'. Commits which are in both branches are marked with '=' but
> >> >> only commit in branch B are shown. Eventually commits which are in A
> >> >> but not in B anymore should be marked with '-'.
> >> >>
> >> >> So far I found this solution:
> >> >>
> >> >>   $ git log --cherry-mark --right-only A...B
> >> >>   $ git log --cherry-pick  --left-only   A...B
> >> >>
> >> >> but I have to call twice git-log. This can be annoying since depending
> >> >> on A and B, calling git-log can take time.
> >> >>
> >> >> Is there another option that I'm missing which would do the job but
> >> >> with only one call to git-log ?
> >> >
> >> > Does this do what you want?
> >> >
> >> >     git log --cherry-mark --left-right A...B |
> >> >     sed -e '/^commit / {
> >> >         y/<>/-+/
> >> >     }'
> >>
> >> Nope because --left-right shows common commits (with '=' mark) that
> >> belong to A *and* B, and I'd like to have only the ones in B.
> >
> > I think the only way you can address this is to post-process the result,
> > I don't know any way to remove a left side commit only if it is
> > patch-identical to a right side commit.
> >
> > It should be relatively easy to filter out any '=' commits that are in
> > the output of "git rev-list --left-only A...B".
> 
> yes that's what I'm doing but I was wondering if that's possible to do
> that with only one run of git-log/git-rev-list.

I don't think it is.  But you only need to use the --cherry-mark option
with one of the runs, so the other one should be very quick - the added
work of calculating patch IDs slows down "git log" a lot.

```

## Francis Moreau, 2013-09-27 09:52

Subject: Re: Question about "git log --cherry"
Message-ID: <CAC9WiBjponU=gKZ26oG7pOhGJk5=XxxGzGm9A4Y6qbNEcUw=PQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAC9WiBjponU%3DgKZ26oG7pOhGJk5%3DXxxGzGm9A4Y6qbNEcUw%3DPQ%40mail.gmail.com
In-Reply-To: <20130927091402.GF27238@serenity.lan>

```
On Fri, Sep 27, 2013 at 11:14 AM, John Keeping <john@keeping.me.uk> wrote:
> On Fri, Sep 27, 2013 at 10:28:05AM +0200, Francis Moreau wrote:
>> On Fri, Sep 27, 2013 at 10:11 AM, John Keeping <john@keeping.me.uk> wrote:
>> > On Fri, Sep 27, 2013 at 07:09:03AM +0200, Francis Moreau wrote:
>> >> Hi,
>> >>
>> >> On Thu, Sep 26, 2013 at 10:21 PM, John Keeping <john@keeping.me.uk> wrote:
>> >> > On Thu, Sep 26, 2013 at 06:35:57PM +0200, Francis Moreau wrote:
>> >> >> I'm trying to use "git log --cherry ..." in order to display new, kept
>> >> >> and removed commits between two branches A and B.
>> >> >>
>> >> >> So commits which are only in B are considered new and should be marked
>> >> >> with '+'. Commits which are in both branches are marked with '=' but
>> >> >> only commit in branch B are shown. Eventually commits which are in A
>> >> >> but not in B anymore should be marked with '-'.
>> >> >>
>> >> >> So far I found this solution:
>> >> >>
>> >> >>   $ git log --cherry-mark --right-only A...B
>> >> >>   $ git log --cherry-pick  --left-only   A...B
>> >> >>
>> >> >> but I have to call twice git-log. This can be annoying since depending
>> >> >> on A and B, calling git-log can take time.
>> >> >>
>> >> >> Is there another option that I'm missing which would do the job but
>> >> >> with only one call to git-log ?
>> >> >
>> >> > Does this do what you want?
>> >> >
>> >> >     git log --cherry-mark --left-right A...B |
>> >> >     sed -e '/^commit / {
>> >> >         y/<>/-+/
>> >> >     }'
>> >>
>> >> Nope because --left-right shows common commits (with '=' mark) that
>> >> belong to A *and* B, and I'd like to have only the ones in B.
>> >
>> > I think the only way you can address this is to post-process the result,
>> > I don't know any way to remove a left side commit only if it is
>> > patch-identical to a right side commit.
>> >
>> > It should be relatively easy to filter out any '=' commits that are in
>> > the output of "git rev-list --left-only A...B".
>>
>> yes that's what I'm doing but I was wondering if that's possible to do
>> that with only one run of git-log/git-rev-list.
>
> I don't think it is.  But you only need to use the --cherry-mark option
> with one of the runs, so the other one should be very quick - the added
> work of calculating patch IDs slows down "git log" a lot.

That's true, rev-list should be way faster. I think I'll do that.

Thanks.
-- 
Francis

```
