threads / discuss / 32959

"git branch --contains x y" creates a branch instead of checking containment

Subject: "git branch --contains x y" creates a branch instead of checking containment

## tl;dr

4 messages between Feb 21, 2013 and Feb 21, 2013.

replies: 3people: 3as markdown or json

Per Cederqvist· Feb 21, 2013, 13:00 UTC · lore

The "git branch --list --contains x y" command lists all branches that contains commit x and matches the pattern y. Reading the git-branch(1) manual page gives the impression that "--list" is redundant, and that you can instead write

    git branch --contains x y

That command does something completely different, though. The "--contains x" part is silently ignored, so it creates a branch named "y" pointing at HEAD.

Tested in git 1.8.1.1 and 1.8.1.4.
In my opinion, there are two ways to fix this:
  - change the "git branch" implementation so
    that --contains implies --list.
  - change the manual page synopsis so that
    it is clear that --contains can only be
    used if --list is also used.  Also add an
    error check to the "git branch" implementation
    so that using --contains without specifying
    --list produces a fatal error message.
Personally I would prefer the first solution.
Repeat by running these commands:

# Set up a repo with two commits. # Branch a points to the oldest one, and # b and master to the newest one. mkdir contains || exit 1 cd contains git init touch a; git add a; git commit -m"Added a". git branch a touch b; git add b; git commit -m"Added b". git branch b

git branch --list --contains a # Prints "a", "b" and "master, as expected.

git branch --contains a # Prints "a", "b" and "master, as expected. # In this case, the --list option can be removed.

git branch --list --contains a b # Prints "b", as expected. "b" is a <pattern>.

git branch --list --contains a c # Prints nothing, as expected, as the "c" pattern doesn't match any of # the existing branches.

git for-each-ref # Prints three lines: refs/heads/a, refs/heads/b and # refs/heads/master, as expected.

git branch --contains a c # Prints nothing, as expected, but...

git for-each-ref # Prints four lines! Apparently, the command above created # refs/heads/c.

     /ceder

P.S. What I really wanted to do was "git merge-base --is-ancestor a b", but I keep forgetting its name.

Jeff King· Feb 21, 2013, 15:58 UTC · re: Per Cederqvist · lore

Re: "git branch --contains x y" creates a branch instead of checking containment

On Thu, Feb 21, 2013 at 02:00:27PM +0100, Per Cederqvist wrote:
Show 10 quoted lines
> That command does something completely different,
> though. The "--contains x" part is silently ignored,
> so it creates a branch named "y" pointing at HEAD.
> 
> Tested in git 1.8.1.1 and 1.8.1.4.
> 
> In my opinion, there are two ways to fix this:
> 
>  - change the "git branch" implementation so
>    that --contains implies --list.
I think that is the best option, too. In fact, I even wrote a patch. :)

It's d040350 (branch: let branch filters imply --list, 2013-01-31), and it's already in v1.8.2-rc0.

-Peff
Per Cederqvist· Feb 21, 2013, 16:05 UTC · re: Jeff King · lore

Re: "git branch --contains x y" creates a branch instead of checking containment

On 02/21/13 16:58, Jeff King wrote:
Show 19 quoted lines
> On Thu, Feb 21, 2013 at 02:00:27PM +0100, Per Cederqvist wrote:
>
>> That command does something completely different,
>> though. The "--contains x" part is silently ignored,
>> so it creates a branch named "y" pointing at HEAD.
>>
>> Tested in git 1.8.1.1 and 1.8.1.4.
>>
>> In my opinion, there are two ways to fix this:
>>
>>   - change the "git branch" implementation so
>>     that --contains implies --list.
>
> I think that is the best option, too. In fact, I even wrote a patch. :)
>
> It's d040350 (branch: let branch filters imply --list, 2013-01-31), and
> it's already in v1.8.2-rc0.
>
> -Peff

Great! Thanks for the quick fix of my bug report. Negative response time... not bad. Not bad at all. :-)

     /ceder
Junio C Hamano· Feb 21, 2013, 17:48 UTC · re: Per Cederqvist · lore

Re: "git branch --contains x y" creates a branch instead of checking containment

Per Cederqvist <cederp@opera.com> writes:
Show 23 quoted lines
> On 02/21/13 16:58, Jeff King wrote:
>> On Thu, Feb 21, 2013 at 02:00:27PM +0100, Per Cederqvist wrote:
>>
>>> That command does something completely different,
>>> though. The "--contains x" part is silently ignored,
>>> so it creates a branch named "y" pointing at HEAD.
>>>
>>> Tested in git 1.8.1.1 and 1.8.1.4.
>>>
>>> In my opinion, there are two ways to fix this:
>>>
>>>   - change the "git branch" implementation so
>>>     that --contains implies --list.
>>
>> I think that is the best option, too. In fact, I even wrote a patch. :)
>>
>> It's d040350 (branch: let branch filters imply --list, 2013-01-31), and
>> it's already in v1.8.2-rc0.
>>
>> -Peff
>
> Great! Thanks for the quick fix of my bug report. Negative response
> time... not bad. Not bad at all. :-)
Yeah, Jeff has a time machine ;-)

← back to recent threads