git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Voltage Spike <voltspike@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: Merge-Recursive Improvements
Date: Tue, 12 Feb 2008 15:11:19 -0800	[thread overview]
Message-ID: <7vodal22js.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <A21B3CA8-6240-434F-87A9-C6F76DA15265@gmail.com> (Voltage Spike's message of "Tue, 12 Feb 2008 15:16:33 -0700")

Voltage Spike <voltspike@gmail.com> writes:

> I would like to make a series of significant improvements to the
> merge-recursive mechanism in git, but I was hoping to solicit some early
> feedback before submitting patches.
>
> First, git is overly zealous at merging differences and two functions
> added
> at the same point in a file become intertwined during the merge. A
> trivial
> example of this behavior:
>
>   <<<<<<< HEAD:file.txt
>   void newfunc1()
>   =======
>   void newfunc2()
>   >>>>>>> merge:file.txt
>   {
>     int err;
>   <<<<<<< HEAD:file.txt
>     err = doSomething();
>   =======
>     err = doSomethingElse();
>   >>>>>>> merge:file.txt

This lacks illustration of what you change that example to, which
makes the proposal harder to judge.

I suspect you are saying that you would want to coalesce
adjacent hunks that have too small number of lines between '>>>'
of the previous hunk and '<<<' of the current hunk by duplicate
the common hunks, like this:

   <<<<<<< HEAD:file.txt
   void newfunc1()
   {
     int err;
     err = doSomething();
   =======
   void newfunc2()
   {
     int err;
     err = doSomethingElse();
   >>>>>>> merge:file.txt

(here, two lines that are "{" and "int err;" are taken as "too small").

I think it makes sense.

> Second, git doesn't tell me the original code inside the conflict
>
>   >>>>>>> merge-base:file.txt
>   Original code.
>   ======= HEAD:file.txt
>   Head code.
>   ======= merge:file.txt
>   Merged code.
>   <<<<<<<

This is a much harder sell, as external tool like git-mergetool
that inspect the result depend on the current output.

And it is not as useful as an alternative.

In case you did not know, you can get a much better picture by:

    $ git log --left-right -p --merge

because you would then see not just the merge base version but
the changes _and the reasons for the changes_ in between.

> Third, git doesn't appear to have any sense of context when performing a
> merge. Another contrived example which wouldn't be flagged as a merge
> conflict:
>
>   ptr = malloc(len); // Added in HEAD.
>   init();            // Included in merge-base.
>   ptr = malloc(len); // Added in "merge".

Are you saying it a problem to report or not to report?  In
either case, I decline to comment on this one, as I do not have
a strong opinion either way.

> Fourth, git doesn't provide a mechanism for merges to ignore whitespace
> changes.

That would be a good change.

I can immediately say that 1 and 4 are worthwhile things to do,
as long as they are contained to xdl_merge().  It would help
other users of the merge logic.

I've started working on rewriting revert to directly use
xdl_merge(), bypassing major parts of merge-recursive, and I
imagine such a change you propose would be useful without
affecting the callers.

  parent reply	other threads:[~2008-02-12 23:12 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-12 22:16 Merge-Recursive Improvements Voltage Spike
2008-02-12 23:03 ` Stefan Monnier
2008-02-12 23:11 ` Junio C Hamano [this message]
2008-02-12 23:48 ` Linus Torvalds
2008-02-13  0:05   ` Johannes Schindelin
2008-02-13  1:10     ` [PATCH] xdl_merge(): introduce XDL_MERGE_ZEALOUS_ALNUM Johannes Schindelin
2008-02-13  1:34       ` Junio C Hamano
2008-02-13 11:16         ` Johannes Schindelin
2008-02-15 17:32           ` Junio C Hamano
2008-02-15 18:17             ` Linus Torvalds
2008-02-15 18:23               ` Johannes Schindelin
2008-02-17 19:06               ` Johannes Schindelin
2008-02-17 19:07                 ` [PATCH 1/2] xdl_merge(): make XDL_MERGE_ZEALOUS output simpler Johannes Schindelin
2008-02-17 19:07                   ` [PATCH(RFC) 2/2] xdl_merge(): introduce XDL_MERGE_ZEALOUS_ALNUM Johannes Schindelin
2008-02-18  8:35                   ` [PATCH 1/2] xdl_merge(): make XDL_MERGE_ZEALOUS output simpler Junio C Hamano
2008-02-18 11:33                     ` Johannes Schindelin
2008-02-13  2:06       ` [PATCH] xdl_merge(): introduce XDL_MERGE_ZEALOUS_ALNUM Linus Torvalds
2008-02-13 11:22         ` Johannes Schindelin
2008-02-13  7:39 ` Merge-Recursive Improvements Johannes Sixt
2008-02-13  8:17   ` Steffen Prohaska
2008-02-13  8:21   ` Voltage Spike
2008-02-13  8:46     ` Johannes Sixt
2008-02-15 19:21   ` 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=7vodal22js.fsf@gitster.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=voltspike@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).