# git tag --no-merged?

6 messages from 2015-02-04 to 2015-02-05. Participants: Peter Krefting, Junio C Hamano, Johannes Sixt, Kyle J. McKay.
Thread: https://gitlist.dev/t/38497

## Peter Krefting, 2015-02-04 15:19

Subject: git tag --no-merged?
Message-ID: <alpine.DEB.2.00.1502041615110.30476@ds9.cixit.se>
URL: https://gitlist.dev/e/alpine.DEB.2.00.1502041615110.30476%40ds9.cixit.se

```
Hi!

Using "git branch --no-merged" I can get a list of branches that I 
have that I haven't merged into my current branch. "git tag" doesn't 
have such an option, is there a way to achieve something similar 
listing tags that point to commits that aren't in my history?



Background: In my $DAYJOB we have a couple of products that are built 
from a common source tree. Each of the products have their own 
maintenance branches, and releases from these maintenance branches are 
tagged. I want to merge the changes from the maintenance branches to 
master (and possibly to other maintenance branches if there are 
changes relevant to other products), but I only want to do this for 
our tagged released.

Using "git branch --no-merged" I can see which of the maintenance 
branches have commits that haven't been merged yet, but I cannot tell 
whether any of those have been tagged.

-- 
\\// Peter - http://www.softwolves.pp.se/

```

## Junio C Hamano, 2015-02-04 18:43

Subject: Re: git tag --no-merged?
Message-ID: <xmqq61bho6ub.fsf@gitster.dls.corp.google.com>
URL: https://gitlist.dev/e/xmqq61bho6ub.fsf%40gitster.dls.corp.google.com
In-Reply-To: <alpine.DEB.2.00.1502041615110.30476@ds9.cixit.se>

```
Peter Krefting <peter@softwolves.pp.se> writes:

> Using "git branch --no-merged" I can get a list of branches that I
> have that I haven't merged into my current branch. "git tag" doesn't
> have such an option, is there a way to achieve something similar
> listing tags that point to commits that aren't in my history?

Using canned set of tools, I do not think there is anything less
complex than doing something like:

 $ git log --oneline --decorate --branches --not --tags

The longer term goal that has been floated a few times here is to
unify various logic that computes containment relationships in
"branch", "tags", etc. to one place and perhaps expose that unified
logic to "for-each-ref", but that hasn't happened yet.

```

## Johannes Sixt, 2015-02-04 18:57

Subject: Re: git tag --no-merged?
Message-ID: <54D26B7C.7020300@kdbg.org>
URL: https://gitlist.dev/e/54D26B7C.7020300%40kdbg.org
In-Reply-To: <alpine.DEB.2.00.1502041615110.30476@ds9.cixit.se>

```
Am 04.02.2015 um 16:19 schrieb Peter Krefting:
> Using "git branch --no-merged" I can get a list of branches that I have
> that I haven't merged into my current branch.

Assuming v2.0.0 is a tag, using "git branch --no-merged v2.0.0" you can
see which branches haven't been merged into v2.0.0.

-- Hannes

```

## Junio C Hamano, 2015-02-04 21:27

Subject: Re: git tag --no-merged?
Message-ID: <xmqq1tm5nz9l.fsf@gitster.dls.corp.google.com>
URL: https://gitlist.dev/e/xmqq1tm5nz9l.fsf%40gitster.dls.corp.google.com
In-Reply-To: <54D26B7C.7020300@kdbg.org>

```
Johannes Sixt <j6t@kdbg.org> writes:

> Am 04.02.2015 um 16:19 schrieb Peter Krefting:
>> Using "git branch --no-merged" I can get a list of branches that I have
>> that I haven't merged into my current branch.
>
> Assuming v2.0.0 is a tag, using "git branch --no-merged v2.0.0" you can
> see which branches haven't been merged into v2.0.0.

I think the request is a bit more involved than "Which one is not
yet in v2.0.0?"

The question, as I now understand it after reading it again, 

    I want to merge the changes from the maintenance branches to
    master (and possibly to other maintenance branches if there are
    changes relevant to other products), but I only want to do this for
    our tagged released.

is "which branches, whose tips are already tagged, are not yet in
'master'?"

The one I gave is not what was asked, either, as I misread the
question.  It was an answer to "which commits are not yet in any
tagged version, show them together with the names of branches from
which they are reached".

```

## Kyle J. McKay, 2015-02-05 00:22

Subject: Re: git tag --no-merged?
Message-ID: <6A0F0356-2AF1-487D-A20E-FB6051D9E689@gmail.com>
URL: https://gitlist.dev/e/6A0F0356-2AF1-487D-A20E-FB6051D9E689%40gmail.com
In-Reply-To: <alpine.DEB.2.00.1502041615110.30476@ds9.cixit.se>

```
On Feb 4, 2015, at 07:19, Peter Krefting wrote:
> Using "git branch --no-merged" I can get a list of branches that I  
> have that I haven't merged into my current branch. "git tag" doesn't  
> have such an option, is there a way to achieve something similar  
> listing tags that point to commits that aren't in my history?

I think something like this might do what you want:

git for-each-ref --format='%(refname)' refs/tags | \
while read t; do
   if ! git merge-base --is-ancestor $t HEAD; then
     echo ${t#refs/tags/}
   fi
done

If you run that on the Git repository (assuming you've checked out  
master), after a while (there are a lot of tags to check) it spits out  
v1.4.4.5 (along with some complaints about *-gpg-pub tags that refer  
to blobs).

And sure enough, `git log v1.4.4.5 ^master` shows 5 commits not  
contained in master so I think it does what you want.  You'll want to  
restrict the for-each-ref output further, if possible, to make it  
quicker.

-Kyle

```

## Peter Krefting, 2015-02-05 09:09

Subject: Re: git tag --no-merged?
Message-ID: <alpine.DEB.2.00.1502051001090.10655@ds9.cixit.se>
URL: https://gitlist.dev/e/alpine.DEB.2.00.1502051001090.10655%40ds9.cixit.se
In-Reply-To: <6A0F0356-2AF1-487D-A20E-FB6051D9E689@gmail.com>

```
Kyle J. McKay:

> I think something like this might do what you want:
>
> git for-each-ref --format='%(refname)' refs/tags | \
> while read t; do
> if ! git merge-base --is-ancestor $t HEAD; then
>   echo ${t#refs/tags/}
> fi
> done

That works like a charm, thank you!

-- 
\\// Peter - http://www.softwolves.pp.se/

```
