From: Shawn Pearce <spearce@spearce.org>
To: Catalin Marinas <catalin.marinas@gmail.com>
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Junio C Hamano <junkio@cox.net>,
git@vger.kernel.org
Subject: Re: [PATCH] merge-recursive: add/add really is modify/modify with an empty base
Date: Thu, 14 Dec 2006 07:00:28 -0500 [thread overview]
Message-ID: <20061214120028.GK1747@spearce.org> (raw)
In-Reply-To: <b0943d9e0612140331q4c3a32e2l361fd04375f091d7@mail.gmail.com>
Catalin Marinas <catalin.marinas@gmail.com> wrote:
> What it the relation between git-merge-recursive and "git-read-tree
> -m" (if any)? I currently still use "git-read-tree -m" for some merges
> because of the speed gain due to the --agressive option (really
> noticeable when picking a patch from an older branch). Probably
> git-merge-recursive cannot implement this since it needs to track
> deletion/additions for rename detection.
There is a difference; always has been, probably will be for a
long time.
read-tree -m performs some trivial merges in the index. Its manual
page explains it in gory detail, but its the really trivial, basic
three way merge rules: Given two trees X and Y and some so-called
base B:
* If X == Y == B for that file, take any of the three.
* If X == Y, but not B, take X or Y.
* If X changes a file, but Y == B for that file, take X.
* If Y changes a file, but X == B for that file, take Y.
I believe that the --agressive option has added some additional
rules about trivial file deletes. However notice the all important
rule is not handled by read-tree -m:
* If X changes a file, Y also changes file, merge them to create Z.
This is where read-tree -m punts and hands things off to
merge-recursive, which needs to invoke diff3 (or now the internal
xdl_merge). read-tree -m also currently does not handle file
additions, mode changes, or renames/copies. All of which are a
lot more expensive to compute and are slightly less common.
So Git gets decent performance by going through the rather cheap
read-tree -m, then falling back into the slower merge-recursive
when read-tree -m punted. Given that I see about 50% of my merges
succeed with just read-tree -m and the other half punt over to
merge-recursive it just about balances out over several merges.
> Are there any other things to be aware if I completely replace the
> "git-read-tree + diff3" with git-merge-recursive?
From what I understand git-merge-recursive will do everything that
git-read-tree -m will do, except its going to be slower doing the
really common, stupid cases that git-read-tree -m can handle on
its own.
--
next prev parent reply other threads:[~2006-12-14 12:00 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-07 10:17 [PATCH 1/1] Make sure the empty tree exists when needed in merge-recursive Shawn O. Pearce
2006-12-09 23:55 ` [PATCH 1/3] diff_tree_sha1(): avoid rereading trees if possible Johannes Schindelin
2006-12-10 1:47 ` Junio C Hamano
2006-12-10 22:49 ` Johannes Schindelin
2006-12-09 23:56 ` [PATCH 2/3] merge-recursive: make empty tree a known object Johannes Schindelin
2006-12-10 18:37 ` Linus Torvalds
2006-12-10 21:21 ` Junio C Hamano
2006-12-10 21:31 ` Linus Torvalds
2006-12-10 22:33 ` Junio C Hamano
2006-12-10 22:54 ` Linus Torvalds
2006-12-10 22:28 ` Junio C Hamano
2006-12-10 23:16 ` Johannes Schindelin
2006-12-09 23:56 ` [PATCH 3/3] add test case for recursive merge Johannes Schindelin
2006-12-10 0:18 ` Johannes Schindelin
2006-12-10 3:10 ` Junio C Hamano
2006-12-10 22:51 ` Johannes Schindelin
2006-12-12 22:49 ` [PATCH] t6024: fix timing problem Johannes Schindelin
2006-12-12 23:23 ` Junio C Hamano
2006-12-12 23:59 ` Johannes Schindelin
2006-12-13 3:05 ` [PATCH] merge-recursive: add/add really is modify/modify with an empty base Johannes Schindelin
2006-12-13 6:33 ` Junio C Hamano
2006-12-13 11:46 ` StGit repo & gitweb, was " Johannes Schindelin
2006-12-13 11:56 ` Jakub Narebski
2006-12-13 22:09 ` Catalin Marinas
2006-12-13 23:06 ` Robin Rosenberg
2006-12-13 23:50 ` Johannes Schindelin
2006-12-13 23:57 ` Jakub Narebski
2006-12-19 18:50 ` Petr Baudis
2006-12-19 19:39 ` Jakub Narebski
2006-12-13 22:01 ` Catalin Marinas
2006-12-13 22:26 ` Junio C Hamano
2006-12-13 23:48 ` Johannes Schindelin
2006-12-14 11:31 ` Catalin Marinas
2006-12-14 11:41 ` Shawn Pearce
2006-12-14 12:00 ` Shawn Pearce [this message]
2006-12-14 13:44 ` Johannes Schindelin
2006-12-14 14:15 ` Catalin Marinas
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=20061214120028.GK1747@spearce.org \
--to=spearce@spearce.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=catalin.marinas@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.