Subject: Re: Finding the name of the parent branch?

From: Michael J Gruber <[email-masked]>
Date: Fri, 30 Jan 2009 14:35:57 +0100

Pascal Obry venit, vidit, dixit 30.01.2009 13:56:
> Santi,
> 
> Thanks for you reply.
> 
>> I think your definition is not well defined. A, B and C are just
>> branches of you project, technically they are equivalent. Maybe you
> 
> Right. Yet I want to know from which branch a branch as been started.
> 
> You need this to get the proper merge-base for example:
> 
>    $ git merge-base C A
>       1
> 
>    $ git merge-base B C
>       2
> 
>    $ git merge-base B A
>       1
> 
> I always know on which topic branch I'm but, as shown above, depending on the
> parent branch passed to merge-base you do not get the same branch-point. This
> is fine.
> 
> So, when I'm in a topic branch I want to find the name of the parent
> branch. The one given
> when creating the branch:
> 
>    $ git branch B C
> 
> A "stupid" solution whould be to iterate over all branches. Looking
> for the merge-base and
> at the end output the branch having the youngest merge-base. I'm
> looking for something
> more efficient...
> 
>> are thinking that the common commits of, say A and B, really belongs
>> to A, but this is not the case they belong to both branches. In git a
>> branch is really just a pointer to a commit and by extension the
>> history, it is not a series of commits.
>>
>> Just a counterexample, just rearranging you graph:
>>
>>                        o---B
>>                        /
>>                   o---2---o---o---o---C
>>                  /
>>          ---o---1---o---o---o---A
>>
>> From you description: For B I would get C and for C I would get A.
> 
> Don't see this as a counter-example as it is exactly my example.
> 
> Did I missed something?

I think you still haven't *defined* what you mean by "parent branch".
Your example alone doesn't define it, and whenever you have merge
commits things are not clear:

     o---o---o---A
    /     \
---o       o---o---C
    \     /
     o---o---o---B

Now, which one is the "parent branch" of C? A+B? Similarly:

     o---A
    /
---o---C
    \
     o---B

Here it's clear which commit you want, but which branch does it belong
to? A or B?

I really think this is impossible to define unambiguously in git, due to
the nature of git branches, being movable tags, much different from say
hg's hardwired branches (embedded in the commit object).

What you see in gitk is which branch contains a certain commit ("git
branch --contains").

What you want may be the branch which differs from C by the least number
of commits.

Cheers,
Michael