From: Andy Parkins <andyparkins@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <junkio@cox.net>
Subject: Re: Why is it bad to rewind a branch that has already been pushed out?
Date: Sat, 3 Feb 2007 10:40:54 +0000 [thread overview]
Message-ID: <200702031041.13437.andyparkins@gmail.com> (raw)
In-Reply-To: <7v1wl7bv66.fsf@assigned-by-dhcp.cox.net>
On Saturday 2007, February 03 06:40, Junio C Hamano wrote:
> Also, don't use "git reset" on a publicly-visible branch that
> other developers pull from, as git will be confused by history
> that disappears in this way.
>
> I do not think this is a good explanation. For example, if we
> do this:
I agree it's not a good explanation, I think it is good policy though.
I love an oppourtunity to blather on and your post has given it to
me :-) I'm sure I'll be preaching to the converted though.
In the following I've assumed that both "h" and "a" commits are
independent work, neither of which works on "j" (which isn't quite what
you described). It's not really appropriate for the tutorial, so I
haven't really helped you.
-----------------
git's easy manipulation of branches encourages one to try to make
history really tell the story of development. It's more than just
recording snapshots, there is information in the history itself -
reasons for decisions can be recorded - separating and collecting
commits into appropriate branches instead of one giant linear block.
As you say git is perfectly okay with the rewound branch and will do the
Right Thing to preserve the changes. However, it won't get the spirit
of the changes right.
> (4) Alice pulls from me again:
>
> ---o---o---o---j---a---a---*
> \ /
> h---h---h---h
>
> Contrary to the description, git will happily have Alice merge
> between the two branches, and never gets confused.
The problem is not that the working tree is wrong, it is that the
history is wrong. This sequence of development isn't best represented
by a merge. When we look at the history later, we'll see it as two
branches, but that isn't true.
The graph shows that "j" was committed and then probably conflicted
in "*" and fixed. The problem is that you can't point to any non-merge
commit that reverted/corrected "j" and explains why that wasn't a good
idea - so the "story" that the history tells us is incomplete. The
correction was done just as a conflict resolution in "*".
Any of these would be correct:
1) "h" and "a" are parallel; "j" never happens
---o---o---o----a-----a----*
\ /
h---h---h---h
2) Alice corrects "j" with a "!j" revision - "!j" would then describe
why "j" was wrong and what the fix was. "h" would have to have nothing
to do with the "j" topic in this case.
---o---o---o---j---!j---a---a---*
\ /
h-----h-----h----h
Of course, both of these require information from the developer. (1)
can't be done after the push has been done (because "j" is already "out
there") and (2) requires that "h" know that Alice has fixed the problem
and the Alice knows that the "j" problem needs fixing (and probably
doesn't belong in Alice's branch anyway).
The only solution that keeps the history integrity, is the one that all
the git manuals reccommend.
3) Don't rebase at all, correct the problem and record the correction.
--o---o---o---j------a------a------*
\ /
!j---h---h---h---h
That is - once a mistaken commit has been pushed out, it's there
forever, accept that and don't rebase to before the last push.
Sometimes it makes the history less pretty, but it makes it more right.
Without "!j", no one would ever know what was wrong with "j".
In short - heed the warnings - you will get much better history if you
don't rebase branches that have already been pushed upstream.
-----------------------
How about that as the explanation for the tutorial? What do you mean I
haven't simplified anything and have replaced one paragraph with a page
worth of overly wordy ravings? HOW DARE YOU! :-)
Andy
--
Dr Andrew Parkins, M Eng (Hons), AMIEE
andyparkins@gmail.com
next prev parent reply other threads:[~2007-02-03 10:44 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-03 6:40 Why is it bad to rewind a branch that has already been pushed out? Junio C Hamano
2007-02-03 10:40 ` Andy Parkins [this message]
2007-02-03 19:42 ` Junio C Hamano
2007-02-04 18:01 ` Andy Parkins
2007-02-03 13:20 ` Theodore Tso
2007-02-04 16:16 ` Robin Rosenberg
2007-02-04 20:08 ` Junio C Hamano
[not found] ` <20070205132150.123659@dial-up-mi-449.lombardiacom.it>
2007-02-05 13:27 ` [PATCH] Documentation: add KMail in SubmittingPatches Michael
2007-02-06 3:07 ` Junio C Hamano
2007-02-06 13:45 ` Michael
2007-02-06 14:16 ` Jakub Narebski
2007-02-06 14:47 ` Andy Parkins
-- strict thread matches above, loose matches on Subject: below --
2007-02-03 8:42 Why is it bad to rewind a branch that has already been pushed out? linux
2007-02-03 9:04 ` Junio C Hamano
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=200702031041.13437.andyparkins@gmail.com \
--to=andyparkins@gmail.com \
--cc=git@vger.kernel.org \
--cc=junkio@cox.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).