Re: master^ is not a local branch -- huh?!?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In article <alpine.LFD.2.00.1001292013150.1681@xxxxxxxxxxx>,
 Nicolas Pitre <nico@xxxxxxxxxxx> wrote:

> On Fri, 29 Jan 2010, Mark Lodato wrote:
> 
> > Still, I find it slightly confusing and unfriendly.  How about the 
> > following?
> 
> It is slightly inaccurate.
> 
> > Checking out commit 'master^0'.
> > 
> > Since this is not a local branch head, any commits you make will be lost
> > when you check out another branch or commit.  (In git terminology, HEAD
> > is detached.)  If you just wish to look at files without committing,
> > this is fine.  If you wish to make commits and retain them, you may
> > create a new branch by running:
> > 
> >   git checkout -b <new_branch_name>
> 
> This gives the impression that any commit you make on a detached HEAD 
> are going to be lost, unless you create a new branch first.
> 
> And again, it is a good thing to have "detached HEAD" in there so to 
> relate to existing documentation easily.
> 
> > I think the above wording is fine for both commits (e.g. master^0) and
> > remote branches (e.g. origin/pu).  With other wording, we may wish to
> > have two slightly different messages depending on what the user typed.
> 
> You could have tags too.  So instead of trying to be too smart, it is 
> best to simply display the provided name without qualifier.
> 
> > Also, I am not a big fan of "local branch head".  How about "not the
> > name of a local branch"?  I'm not sure...
> 
> The confusion that started this thread was about "master^" which might 
> be interpreted as the name of a local branch except for the fact that we 
> want one commit back.  So using "local commit head" is more precise.

Since it is my confusion that started this thread (and I suppose is in 
part responsible for continuing it) I should be clear that master^ was 
just an example.  My first attempt to roll back to an earlier version 
was actually "git checkout HEAD^".  That produced the same result, since 
HEAD was pointing to master at the time.  But one of the things I 
realized was that HEAD was a variable, and so I chose to frame my 
example in terms of master instead of HEAD in order to eliminate 
ambiguity.

FWIW, here are some observations based on my current understanding:

1.  The term "detached HEAD" is inherently misleading.  A detached HEAD 
isn't detached from anything, it's just pointing to the middle of a 
branch, which is to say, to a commit that happens to already have 
descendants.  For that matter, the name HEAD is itself misleading, since 
HEAD need not be the head of a branch (though normally it is).  A better 
name for HEAD would have been CURRENT or ACTIVE.  I recognize it's 
probably too late to change it now.

2.  There are a lot of things in the documentation that turn out, now 
that I understand what is going on, to be subtly misleading.  For 
example, "A single git repository can track development on multiple 
branches. It does this by keeping a list of heads which reference the 
latest commit on each branch."  That last part is only true if the heads 
are not "detached".

I do not yet understand enough about git to know if this is a reasonable 
suggestion, but one possibility is to separate the notion of a head from 
the notion of a pointer to a commit.  A head would be a pointer to a 
commit that can only point to a commit with no descendants, whereas a 
pointer could point anywhere.  What is now called HEAD would be a 
pointer, not a head under this ontology.

Another example: "The HEAD then refers to the SHA-1 of the commit 
instead of to a branch, and git branch shows that you are no longer on a 
branch:"  But you *are* on a branch, you just aren't at the head of the 
branch.  In fact, by the definition of branch the whole concept of "not 
being on a branch" is non-sensical.  (Isn't that part of the whole point 
of git?  That everything is a branch?)

3.  These observations suggest ways in which the situation could be 
improved.

First, I think Michael Witten is on the right track with his proposal 
for a redesign of git-checkout and the new git-update command (though I 
have not yet had time to think deeply about the details).  There are 
only a small number of things that are actually going on under the hood, 
and the closer the map between the command set and those primitive 
operations can be made the better.

Second, the real problem underlying the original warning that started 
all this is that if you do a commit from a "detached head" then you have 
effectively created a branch whether you meant to or not.  This suggests 
a very straightforward warning:

"WARNING: Your HEAD is now pointing to a commit that has descendants.
If you do a commit from here, you will be creating a branch.  If this
is not what you intend, read the documentation and achieve clarity before
proceeding.  If you just want to bail out of this situation without
doing your homework, do a 'git checkout master' or something like that."

Or something like that :-)

rg

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]