From: Junio C Hamano <gitster@pobox.com>
To: Jonathan Watt <jwatt@jwatt.org>
Cc: Johan Herland <johan@herland.net>,
git@vger.kernel.org,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Elijah Newren <newren@gmail.com>
Subject: Re: Working copy revision and push pain
Date: Sun, 23 Mar 2008 11:21:39 -0700 [thread overview]
Message-ID: <7vd4pl713g.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <47E6923E.1050904@jwatt.org> (Jonathan Watt's message of "Sun, 23 Mar 2008 18:24:14 +0100")
Jonathan Watt <jwatt@jwatt.org> writes:
> Johan Herland wrote:
>> I'm starting to think it's worth changing the default behaviour of push as follows:
>>
>> Upon receiving a push into a non-bare repository, if the working copy is on the same branch as is being pushed, then refuse the push with a helpful message describing why the push was refused, and how to resolve this issue (i.e. referring to the tutorials you mention).
>>
>> This would:
>> - Not clobber the working copy
>> - Tell newbies what happened and why
>> - Hopefully make this issue pop up less frequently
>> - Not affect you if you only push into bare repos
>> - Not affect you if you take care to never push into a checked-out branch
>
> The detach-HEAD idea does all these things, but rather:
>
> - There's no need to tell newbies anything
> - It don't just reduce the frequency of the problem, it eliminates it
>
> :-) Also,
>
> - You eliminate the problem of git thinking the working copy came from a
> revision it didn't come from, and thus eliminate the "any commit will
> now overwrite the push" problem
> - You can still write hooks to update the working copy if you like
> - It's completely intuitive to anyone coming from Mercurial (and it's these
> people who are going to be doing the pushing into non-bare repositories,
> because that's the workflow they're familiar with)
I am obviously sympathetic to people who are in the detox program from
Mercurial poisoning ;-), but seriously, I have to wonder if the detached
HEAD is the other way around from what merc does?
My understanding is if you push into a non-bare tree in merc, they make
the branch head into "unmerged" state, and as far as the work tree is
concerned you are still on the previous commit, and you merge "the other
commit" that was pushed into from sideways to update the branch tip with
pushed-into commit.
In git, if you detach HEAD when you push into a checked-out 'master', your
work tree won't be associated with 'master' anymore, and to merge the
pushed-into state into the history of 'master', you would need:
# push into 'master' from elsewhere, which by your magic detaches
# the HEAD in the pushed-into repository.
elsewhere$ git push $non_bare_repo master
# merge pushed-into change into old 'master' where your work tree
# started from by merging master into detached HEAD. Somehow you
# need to know you were on master to be able to do this. Also
# because you magically detached HEAD, anything else you do after
# such a push from sideways in this repository are not protected
# by reflog for 'master' but only by reflog for 'HEAD'.
here$ git merge master
# update the master with the result of the merge
here$ git push . HEAD:master
# check out master again to get back to your original state.
here$ git checkout master
The second point bothers me quite a lot, as you are assuming that the
user at the repository that was pushed into does _not_ know what is going
on, and may keep working on a detached HEAD _without knowing_ what is
going on.
There is an alternative, though.
Git does not use merc style "a single branch can have unmerged multiple
heads" paradigm, but it can be implemented more explicitly (look for
"mothership satellite" in the FAQ you were referred to earlier).
People in the Mercurial detox program may want to use the pattern of
pushing into acceptance branch and then merging from it when it is
convenient, like this:
# push from sideways go to 'remotes/origin/master', and never to
# 'master'. Your 'master' that was checked out is not molested
# by this push.
elsewhere$ git push $non_bare_repo master:refs/remotes/origin/master
# you can keep working on what you were doing without getting
# molested by the above push.
here$ hack, hack, commit, commit, all still on 'master'
# when you are done with the work you were doing in the pushed-into
# tree, and notice somebody pushed into your acceptance branch,
# you can _choose to_ merge it in.
here$ git merge remotes/origin/master
next prev parent reply other threads:[~2008-03-23 18:22 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-23 12:39 Working copy revision and push pain Jonathan Watt
2008-03-23 13:02 ` Johannes Schindelin
2008-03-23 13:19 ` Jonathan Watt
2008-03-23 13:45 ` Elijah Newren
2008-03-23 13:54 ` Jonathan Watt
2008-03-23 14:06 ` Elijah Newren
2008-03-23 14:22 ` Johannes Schindelin
2008-03-23 14:48 ` Jonathan Watt
2008-03-23 14:56 ` Johannes Schindelin
2008-03-23 15:25 ` Jonathan Watt
2008-03-23 16:00 ` Johannes Schindelin
2008-03-25 19:25 ` Auto detaching head options (Re: Working copy revision and push pain) Jan Hudec
2008-03-25 19:58 ` Johannes Schindelin
2008-03-25 23:24 ` Jeff King
2008-03-26 18:49 ` Junio C Hamano
2008-03-29 8:27 ` Auto detaching head options (update) " Jan Hudec
2008-03-29 8:47 ` Jeff King
2008-03-31 1:53 ` Junio C Hamano
2008-03-31 1:59 ` Jeff King
2008-03-31 2:09 ` Jeff King
2008-03-23 19:48 ` Working copy revision and push pain Elijah Newren
2008-03-23 14:27 ` Jonathan Watt
2008-03-23 14:34 ` Johannes Schindelin
2008-03-23 16:20 ` Johan Herland
2008-03-23 17:24 ` Jonathan Watt
2008-03-23 18:21 ` Junio C Hamano [this message]
2008-03-23 19:42 ` Junio C Hamano
2008-03-23 18:23 ` Johannes Schindelin
2008-03-24 15:22 ` Johannes Schindelin
2008-03-24 18:00 ` Johan Herland
2008-03-23 14:11 ` Johannes Schindelin
2008-03-23 14:35 ` Jonathan Watt
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=7vd4pl713g.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=johan@herland.net \
--cc=jwatt@jwatt.org \
--cc=newren@gmail.com \
/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).