threads / discuss / 27836

Getting a list of commits between 2 points without upstream changes

Subject: Getting a list of commits between 2 points without upstream changes

## tl;dr

4 messages between Jul 17, 2011 and Jul 18, 2011.

replies: 3people: 2as markdown or json

Chris Packham· Jul 17, 2011, 23:49 UTC · lore
Hi List,

I'm trying to send round an incremental changelog for my project which contains just my changes without changes that have been made upstream. The history look something like this.

---o--o--o--o--o--o--o--o-- upstream
    \          \        \
     \-m--A--m--B--m--C--D-- topic

What I want is a changelog with just B, C and D in it (i.e. no merge commits and no commits already in upstream). I know if I wanted A,B,C and D I could just do 'git log --no-merges upstream..topic'. If I do 'git log --no-merges B..topic' I get the merged commits from upstream. In set-speak what I think want is the union of upstream..topic and B..topic.

Is there any existing way to achieve this? I'm happy to hack something up using git rev-list if necessary.

Thanks, Chris

Jeff King· Jul 18, 2011, 00:17 UTC · re: Chris Packham · lore

Re: Getting a list of commits between 2 points without upstream changes

On Mon, Jul 18, 2011 at 11:49:57AM +1200, Chris Packham wrote:
Show 14 quoted lines
> I'm trying to send round an incremental changelog for my project which
> contains just my changes without changes that have been made upstream.
> The history look something like this.
> 
> ---o--o--o--o--o--o--o--o-- upstream
>     \          \        \
>      \-m--A--m--B--m--C--D-- topic
> 
> What I want is a changelog with just B, C and D in it (i.e. no merge
> commits and no commits already in upstream). I know if I wanted A,B,C
> and D I could just do 'git log --no-merges upstream..topic'. If I do
> 'git log --no-merges B..topic' I get the merged commits from upstream.
> In set-speak what I think want is the union of upstream..topic and
> B..topic.

I'm not clear on what makes "B" more special than "A" in the graph above. But assuming you know A, don't you just want:

  git log --no-merges topic ^upstream ^A

? That is, "everything in topic, but not in upstream, nor in the parent of A". Or if you know A and not B, you can use "^B^!" (which means "do not include commits that are in any parent of B").

-Peff
Chris Packham· Jul 18, 2011, 00:33 UTC · re: Jeff King · lore

Re: Getting a list of commits between 2 points without upstream changes

On Mon, Jul 18, 2011 at 12:17 PM, Jeff King <peff@peff.net> wrote:
Show 19 quoted lines
> On Mon, Jul 18, 2011 at 11:49:57AM +1200, Chris Packham wrote:
>
>> I'm trying to send round an incremental changelog for my project which
>> contains just my changes without changes that have been made upstream.
>> The history look something like this.
>>
>> ---o--o--o--o--o--o--o--o-- upstream
>>     \          \        \
>>      \-m--A--m--B--m--C--D-- topic
>>
>> What I want is a changelog with just B, C and D in it (i.e. no merge
>> commits and no commits already in upstream). I know if I wanted A,B,C
>> and D I could just do 'git log --no-merges upstream..topic'. If I do
>> 'git log --no-merges B..topic' I get the merged commits from upstream.
>> In set-speak what I think want is the union of upstream..topic and
>> B..topic.
>
> I'm not clear on what makes "B" more special than "A" in the graph
> above. But assuming you know A, don't you just want:

What makes A special in this case is that commits up to and including A have been reviewed, regression tested etc. My use-case is really about telling people what has been worked on since the last time the code was reviewed.

Show 6 quoted lines
>
>  git log --no-merges topic ^upstream ^A
>
> ? That is, "everything in topic, but not in upstream, nor in the parent
> of A". Or if you know A and not B, you can use "^B^!" (which means "do
> not include commits that are in any parent of B").
Brilliant, that's exactly what I wanted. Thanks.
>
> -Peff
>
Jeff King· Jul 18, 2011, 01:28 UTC · re: Chris Packham · lore

Re: Getting a list of commits between 2 points without upstream changes

On Mon, Jul 18, 2011 at 12:33:27PM +1200, Chris Packham wrote:
Show 7 quoted lines
> > I'm not clear on what makes "B" more special than "A" in the graph
> > above. But assuming you know A, don't you just want:
> 
> What makes A special in this case is that commits up to and including
> A have been reviewed, regression tested etc. My use-case is really
> about telling people what has been worked on since the last time the
> code was reviewed.
OK, that makes sense.
Show 7 quoted lines
> >  git log --no-merges topic ^upstream ^A
> >
> > ? That is, "everything in topic, but not in upstream, nor in the parent
> > of A". Or if you know A and not B, you can use "^B^!" (which means "do
> > not include commits that are in any parent of B").
> 
> Brilliant, that's exactly what I wanted. Thanks.

Oops, I mis-stated it above. It would be "everything in topic, but not in upstream, nor in A". Which I think is what you actually want (I had originally written it as "^B^!", but forgot to change the text when I switched it to the more-readable "^A").

-Peff

← back to recent threads