From: "Björn Steinbrink" <B.Steinbrink@gmx.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jeff King <peff@peff.net>, Nicolas Pitre <nico@fluxnic.net>,
James Pickens <jepicken@gmail.com>,
Daniel Barkalow <barkalow@iabervon.org>,
Jay Soffian <jaysoffian@gmail.com>,
git@vger.kernel.org
Subject: Re: [PATCH] Proof-of-concept patch to remember what the detached HEAD was
Date: Fri, 16 Oct 2009 06:29:55 +0200 [thread overview]
Message-ID: <20091016042955.GA9233@atjola.homenet> (raw)
In-Reply-To: <7v1vl42uid.fsf@alter.siamese.dyndns.org>
On 2009.10.15 14:54:18 -0700, Junio C Hamano wrote:
> If it is very important to support:
>
> $ git checkout --look-but-not-touch origin/next^
>
> then James's approach would not be very useful, as we do have to detach
> HEAD and implement the "do not touch" logic for detached HEAD state
> anyway, so we might just use the same logic we would use for origin/next^
> when checking out origin/next itself.
I don't have any numbers backing this up, but my gut feeling says that
most cases of "Where have my commits gone?" that I have seen on #git
were due to "git checkout HEAD~2"-like actions. Either because the user
assumed SVN-like behaviour (you can't commit until you do "svn up", like
"git reset --merge HEAD@{1}") or thought that "git checkout
<committish>" would act like "git reset --hard <committish>".
For the latter I fail to envision any solution except for
education (and I have no idea why the user expected checkout to work
like reset).
The former can be solved by the proposed extra information in HEAD,
forbidding changes to HEAD that make it reference a commit that's not
reachable through the head stored in the extra information[*1*] and providing
some command that acts like "svn up".
This seems quite different from the plain "forbid committing" or "detach
and know how you get there", but more like "detach and know where you're
coming from".
[*1*] If certain updates to HEAD aren't forbidden, a "checkout deadbeef"
(or a reset or update-ref) would possibly invalidate the extra
information in HEAD, which would require implicit detaching, making the
concept useless. For example:
A---B---C---D---E (master)
\ /
F---G---H---I (foo)
git checkout master
git checkout master~2 # Put refs/heads/master into the extra info
git reset --hard HEAD^ # Allow?
git reset --hard foo~2 # Allow? Change extra info? It's also in master
git checkout master
git checkout foo~2
Is that checkout allowed? "foo~2" is also reachable through master. Does
"checkout" do some smart parsing and puts refs/heads/foo into the extra
info? Or should refs/heads/master end up there?
git checkout master
git checkout foo~1
Basically, same deal as above, but foo~1 is not reachable through
master.
And finally the pure commit id cases:
git checkout master
git checkout $(git rev-parse master^)
Is that to be allowed? We can't derive the extra info from the argument
given to checkout, but could check that it's reachable from master
(currently referenced HEAD at the time of the command being run)
And:
git checkout master
git checkout $(git rev-parse foo^)
Neither can we guess what the extra info should be from the argument
given to checkout, nor is the given commit reachable through master. So
this should be forbidden and should require ^0?
This whole thing is indeed a whole lot less complex with a SVN-like
model, where you basically work with the linearly growing reflog only.
Björn
next prev parent reply other threads:[~2009-10-16 4:32 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-14 4:44 [PATCH] Proof-of-concept patch to remember what the detached HEAD was Daniel Barkalow
2009-10-14 5:07 ` Junio C Hamano
2009-10-14 5:08 ` Jeff King
2009-10-14 10:33 ` Johannes Schindelin
2009-10-14 15:39 ` Jeff King
2009-10-14 18:34 ` Junio C Hamano
2009-10-14 18:40 ` Jeff King
2009-10-14 15:56 ` Daniel Barkalow
2009-10-14 18:56 ` Jay Soffian
2009-10-14 19:15 ` Daniel Barkalow
2009-10-14 20:18 ` Nicolas Pitre
2009-10-14 20:37 ` Daniel Barkalow
2009-10-14 20:42 ` Junio C Hamano
2009-10-14 20:48 ` Nicolas Pitre
2009-10-14 22:34 ` Junio C Hamano
2009-10-14 23:09 ` Jeff King
2009-10-14 23:34 ` Nicolas Pitre
2009-10-15 0:56 ` Junio C Hamano
2009-10-15 1:47 ` Jeff King
2009-10-15 3:08 ` Nicolas Pitre
2009-10-15 4:21 ` Jeff King
2009-10-16 1:04 ` Johannes Schindelin
2009-10-16 1:36 ` Nicolas Pitre
2009-10-16 2:07 ` Johannes Schindelin
2009-10-16 2:45 ` Nicolas Pitre
2009-10-16 2:56 ` Junio C Hamano
2009-10-17 7:24 ` Sean Estabrooks
2009-10-26 22:22 ` Johannes Schindelin
2009-10-27 3:41 ` Nanako Shiraishi
2009-10-27 10:33 ` Making Git easy to use -- without RTFM, was " Johannes Schindelin
2009-10-27 17:58 ` Avery Pennarun
2009-10-16 0:53 ` Johannes Schindelin
2009-10-16 3:00 ` Junio C Hamano
2009-10-15 7:36 ` James Pickens
2009-10-15 12:54 ` Jakub Narebski
2009-10-15 14:11 ` Björn Steinbrink
2009-10-15 19:03 ` Nicolas Pitre
2009-10-15 15:36 ` Daniel Barkalow
2009-10-15 16:29 ` Michael J Gruber
2009-10-15 19:07 ` Nicolas Pitre
2009-10-15 19:22 ` Daniel Barkalow
2009-10-15 22:56 ` Thomas Rast
2009-10-15 18:51 ` Nicolas Pitre
2009-10-15 19:52 ` Junio C Hamano
2009-10-15 21:26 ` Jeff King
2009-10-15 21:54 ` Junio C Hamano
2009-10-15 22:08 ` Junio C Hamano
2009-10-15 23:16 ` Nicolas Pitre
2009-10-15 23:47 ` James Pickens
2009-10-16 0:34 ` Nicolas Pitre
2009-10-16 0:43 ` Johannes Schindelin
2009-10-16 5:03 ` Björn Steinbrink
2009-10-15 22:16 ` Jeff King
2009-10-15 22:17 ` Jeff King
2009-10-16 4:29 ` Björn Steinbrink [this message]
2009-10-16 6:02 ` Daniel Barkalow
2009-10-16 8:27 ` Björn Steinbrink
2009-10-16 15:44 ` Nicolas Pitre
2009-10-15 19:31 ` Daniel Barkalow
2009-10-15 20:34 ` Junio C Hamano
2009-10-15 21:35 ` Daniel Barkalow
2009-10-15 21:48 ` Nicolas Pitre
2009-10-16 12:15 ` Julian Phillips
2009-10-16 14:30 ` Björn Steinbrink
2009-10-16 17:31 ` Julian Phillips
2009-10-16 18:29 ` Daniel Barkalow
2009-10-16 19:05 ` Junio C Hamano
2009-10-16 19:48 ` Julian Phillips
2009-10-16 20:19 ` Nicolas Pitre
2009-10-17 15:15 ` Julian Phillips
2009-10-17 17:04 ` Björn Steinbrink
2009-10-17 17:35 ` Julian Phillips
2009-10-17 17:48 ` Björn Steinbrink
2009-10-17 22:28 ` Julian Phillips
2009-10-16 20:19 ` Junio C Hamano
2009-10-17 15:32 ` Julian Phillips
2009-10-17 17:43 ` Junio C Hamano
2009-10-17 22:19 ` Julian Phillips
2009-10-17 7:55 ` Björn Steinbrink
2009-10-17 8:11 ` Junio C Hamano
2009-10-17 8:40 ` Björn Steinbrink
2009-10-17 9:04 ` Junio C Hamano
2009-10-17 17:07 ` James Pickens
2009-10-17 19:41 ` Björn Steinbrink
2009-10-18 22:47 ` Junio C Hamano
2009-10-19 8:44 ` Björn Steinbrink
2009-10-17 15:02 ` Julian Phillips
2009-10-14 23:52 ` Eric Raible
2009-10-16 22:36 ` Christoph Bartoschek
2009-10-17 7:43 ` Junio C Hamano
2009-10-17 8:19 ` Björn Steinbrink
2009-10-17 17:42 ` Junio C Hamano
2009-10-17 20:35 ` Daniel Barkalow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091016042955.GA9233@atjola.homenet \
--to=b.steinbrink@gmx.de \
--cc=barkalow@iabervon.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jaysoffian@gmail.com \
--cc=jepicken@gmail.com \
--cc=nico@fluxnic.net \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).