From: "J. Bruce Fields" <bfields@fieldses.org>
To: Steffen Prohaska <prohaska@zib.de>
Cc: Junio C Hamano <gitster@pobox.com>,
Benoit Sigoure <tsuna@lrde.epita.fr>,
Andreas Ericsson <ae@op5.se>,
Johannes Sixt <j.sixt@viscovery.net>,
git@vger.kernel.org
Subject: Re: [PATCH v4] user-manual: Add section "Why bisecting merge commits can be harder ..."
Date: Sat, 17 Nov 2007 22:59:34 -0500 [thread overview]
Message-ID: <20071118035934.GA29374@fieldses.org> (raw)
In-Reply-To: <1194702594213-git-send-email-prohaska@zib.de>
On Sat, Nov 10, 2007 at 02:49:54PM +0100, Steffen Prohaska wrote:
> +[[bisect-merges]]
> +Why bisecting merge commits can be harder than bisecting linear history
> +-----------------------------------------------------------------------
> +
> +This section discusses how gitlink:git-bisect[1] plays
> +with differently shaped histories. The text is based upon
> +an email by Junio C. Hamano to the git mailing list
> +(link:http://marc.info/?l=git&m=119403257315527&w=2[link:http://marc.info/?l=git&m=119403257315527&w=2]).
> +It was adapted for the user manual.
This is not the only text that's been taken from someplace else, but if
we attributed them all in the text it would get a little cumbersome....
I think the place for that kind of thing is in the commit message, but
if we really think we need to include it in the main text, we could add
a separate "'acknowledgements" section.
> +
> +Using gitlink:git-bisect[1] on a history with merges can be
> +challenging. Bisecting through merges is not a technical
> +problem. The real problem is what to do when the culprit turns
> +out to be a merge commit. How to spot what really is wrong, and
> +figure out how to fix it. The problem is not for the tool but
> +for the human, and it is real.
I think we can pare that down a little.
> +
> +Imagine this history:
> +
> +................................................
> + ---Z---o---X---...---o---A---C---D
> + \ /
> + o---o---Y---...---o---B
> +................................................
> +
> +Suppose that on the upper development line, the meaning of one
> +of the functions that existed at Z was changed at commit X. The
> +commits from Z leading to A change both the function's
> +implementation and all calling sites that existed at Z, as well
> +as new calling sites they add, to be consistent. There is no
> +bug at A.
> +
> +Suppose that in the meantime the lower development line somebody
> +added a new calling site for that function at commit Y. The
> +commits from Z leading to B all assume the old semantics of that
> +function and the callers and the callee are consistent with each
> +other. There is no bug at B, either.
> +
> +Suppose further that the two development lines were merged at C
> +and there was no textual conflict with this three way merge.
> +The result merged cleanly.
> +
> +Now, during bisect you find that the merge C is broken. You
> +started to bisect, because you found D is bad and you know Z was
> +good. The breakage is understandable, as at C, the new calling
> +site of the function added by the lower branch is not converted
> +to the new semantics, while all the other calling sites that
> +already existed at Z would have been converted by the merge. The
> +new calling site has semantic adjustment needed, but you do not
> +know that yet.
> +
> +You need to find out what is the cause of the breakage by looking
> +at the merge commit C and the history leading to it. How would
> +you do that?
> +
> +Both "git diff A C" and "git diff B C" would be an enormous patch.
> +Each of them essentially shows the whole change on each branch
> +since they diverged. The developers may have well behaved to
> +create good commits that follow the "commit small, commit often,
> +commit well contained units" mantra, and each individual commit
> +leading from Z to A and from Z to B may be easy to review and
> +understand, but looking at these small and easily reviewable
> +steps alone would not let you spot the breakage. You need to
> +have a global picture of what the upper branch did (and
> +among many, one of them is to change the semantics of that
> +particular function) and look first at the huge "diff A C"
> +(which shows the change the lower branch introduces), and see if
> +that huge change is consistent with what have been done between
> +Z and A.
> +
> +On the other hand, if you did not merge at C but rebased the
> +history between Z to B on top of A, you would have get this
> +linear history:
> +
> +................................................................
> + ---Z---o---X--...---o---A---o---o---Y*--...---o---B*--D*
> +................................................................
> +
> +Bisecting between Z and D* would hit a single culprit commit Y*
> +instead. This tends to be easier to understand why it is broken.
> +
> +For this reason, many experienced git users, even when they are
> +working on an otherwise merge-heavy project, keep the histories
> +linear by rebasing their work on top of public upstreams before
> +publishing.
I'd say "partly for this reason", as I don't think this is the only
reason people do that.
I've done the above revisions and a few others and pushed them to
git://linux-nfs.org/~bfields/git.git maint
I'll take another look in the morning.
--b.
next prev parent reply other threads:[~2007-11-18 4:00 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-04 9:16 [PATCH] user-manual: add advanced topic "bisecting merges" Steffen Prohaska
2007-11-04 11:23 ` Ralf Wildenhues
2007-11-07 21:50 ` [PATCH v2] " Steffen Prohaska
2007-11-07 22:16 ` Benoit Sigoure
2007-11-07 22:26 ` J. Bruce Fields
2007-11-08 6:40 ` Steffen Prohaska
2007-11-08 7:19 ` Johannes Sixt
2007-11-08 8:59 ` Steffen Prohaska
2007-11-08 9:11 ` Johannes Sixt
2007-11-08 9:33 ` Andreas Ericsson
2007-11-08 9:53 ` Johannes Sixt
2007-11-08 12:54 ` Steffen Prohaska
2007-11-08 13:22 ` Johannes Sixt
2007-11-08 14:55 ` Steffen Prohaska
2007-11-10 9:48 ` [PATCH v3] " Steffen Prohaska
2007-11-10 10:36 ` Junio C Hamano
2007-11-10 11:16 ` Steffen Prohaska
2007-11-10 13:49 ` [PATCH v4] user-manual: Add section "Why bisecting merge commits can be harder ..." Steffen Prohaska
2007-11-10 19:10 ` Linus Torvalds
2007-11-10 20:25 ` Junio C Hamano
2007-11-10 22:41 ` Steffen Prohaska
2007-11-18 3:59 ` J. Bruce Fields [this message]
2007-11-18 9:47 ` Steffen Prohaska
2007-11-18 23:18 ` J. Bruce Fields
2007-11-08 13:38 ` [PATCH v2] user-manual: add advanced topic "bisecting merges" Andreas Ericsson
2007-11-08 14:51 ` Benoit Sigoure
2007-11-08 15:07 ` Steffen Prohaska
2007-11-08 15:23 ` Johannes Schindelin
2007-11-08 18:38 ` Brian Gernhardt
2007-11-04 13:50 ` [PATCH] " Benoit SIGOURE
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=20071118035934.GA29374@fieldses.org \
--to=bfields@fieldses.org \
--cc=ae@op5.se \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j.sixt@viscovery.net \
--cc=prohaska@zib.de \
--cc=tsuna@lrde.epita.fr \
/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).