Hi Johannes,

On 05/03/2018 18:29, Johannes Schindelin wrote:
> > By the way, is there documentation for `git merge-recursive` 
> > anywhere, besides the code itself...? :$
> I am not aware of any. The commit message adding the command is not very
> illuminating (https://github.com/git-for-windows/git/commit/720d150c4):
>     Add a new merge strategy by Fredrik Kuivinen.
>     I really wanted to try this out, instead of asking for an adjustment
>     to the 'git merge' driver and waiting.  For now the new strategy is
>     called 'fredrik' and not in the list of default strategies to be tried.
>     The script wants Python 2.4 so this commit also adjusts Debian and RPM
>     build procecure files.
> Digging through https://public-inbox.org/git/ during that time frame comes
> up with this hit, though:
> https://public-inbox.org/git/20050907164734.ga20...@c165.ib.student.liu.se/
> which is still not a good documentation of the algorithm. You can probably
> dig further yourself, but I think I can describe it very quickly here:
> To merge two commits recursively, you first have to find their "merge
> bases". If there was an obvious branch point, then that is the merge base.
> But when you start a branch off of master, then work a bit, then merge
> master, you already have two merge bases.
> The trick about the recursive merge is to reduce the number of merge bases
> iteratively to one. It does that by taking two merge bases, and performing
> a recursive merge on them, which generates a "virtual" commit, the
> condensed merge base. That one is then merged recursively with the next
> merge base, until there is only one left.
> A recursive merge of two commits with exactly one merge base is simply a
> three-way merge.
> I vaguely remember that there was something funny about the order in which
> order you want to process the merge bases: if you did it in one
> (chronological) direction, it worked beautifully, in the other direction
> it would generate tons of merge conflicts or something like that.

Thanks, this is very informative (together with the linked discussion).

Not remembering seeing this before, I wasn`t really sure if this was 
some undocumented core Git (plumbing?) utility (used withing Git 
itself, too), or just a leftover (yet still useful) sample tool.

Regards, Buga

Reply via email to