git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFH] Merge driver

From
Daniel Barkalow <barkalow@iabervon.org>
Date
Sep 9, 2005, 16:05 UTC
Message-ID
<Pine.LNX.4.63.0509091151520.23242@iabervon.org>
In-Reply-To
<7v3boen0rb.fsf_-_@assigned-by-dhcp.cox.net>
On Fri, 9 Sep 2005, Junio C Hamano wrote:
Show 32 quoted lines
> I have several requests to people who are interested in merges
> and read-tree changes.
> 
> I am pretty much set to use the recent read-tree updates Daniel
> has been working on.  The only reason it has not hit the
> "master" branch yet, except that it still has known leaks that
> have not been plugged, is because read-tree is so fundamental to
> everything we do, and I am trying to be extremely conservative
> here.  I've beaten it myself reasonably well and have not found
> any regressions (except removal of --emu23 which I believe
> nobody uses anyway), but I'd appreciate people to try it out and
> see if it performs well for your dataset.
> 
> If you are planning further surgery on read-tree code, please
> base your changes on Daniel's rewrite to avoid your effort being
> wasted.  This request goes both to Chuck (active_cache
> abstraction) and Fredrik (addition of 'ignore index and working
> tree matching rules' [*1*]).
> 
> A proposed merge driver 'git-merge' is in the proposed updates
> branch.  This is intended to be the top-level user interface to
> the merge machinery which drives multiple merge strategy
> scripts, and I am hoping that I can eventually (1) retire
> 'git-resolve' and 'git-octopus' (they simply become merge
> strategy scripts driven by 'git-merge') and (2) call 'git-merge'
> from 'git-pull'.  What I have in the proposed updates branch has
> been fixed since my earlier message to the list and has a new
> merge strategy script, in addition to 'resolve' and 'octopus',
> called 'git-merge-multibase'.  This uses Daniel's read-tree that
> can use more than one merge bases.  I request Daniel to give OK
> to its name or suggest a better name for this script -- I would
> even accept 'git-merge-barkalow' if you want ;-).

I'd actually been thinking it would just go into the the "resolve" driver, with that going back to before it chose among merge-base outputs and just sending the whole list to read-tree.

Show 91 quoted lines
> If you are planning to implement a new merge strategy, please
> use the ones in the proposed updates branch as examples, and
> complain and suggest improvements if you find the interface
> between the strategy scripts and the driver lacking.  This
> request goes primarily to Fredrik.  I'm interested in doing the
> renaming merge that would have helped HPA's klibc-kbuild vs
> klibc case myself but if somebody else is so inclined please go
> wild.
> 
> And finally, a request to everybody; please try out 'git-merge'
> and see how you like it.
> 
> `git-merge` [-n] [-s <strategy>]... <msg> <head> <remote> <remote>...
> 
> -n::
> 	Do not show diffstat at the end of the merge.
> 
> -s <strategy>::
> 	use that merge strategy; can be given more than once to
> 	specify them in the order they should be tried.  If
> 	there is no `-s` option, built-in list of strategies is
> 	used instead.
> 
> <head>::
> 	our branch head commit.
> 
> <remote>::
> 	other branch head merged into our branch.  You need at
> 	least one <remote>.  Specifying more than one <remote>
> 	obviously means you are trying an Octopus.
> 
> Here is a sample transcript from a test resolving one of the
> 'more-than-one-merge-base' commits Fredrik found in the kernel
> repository (": siamese;" is my $PS1; "  " is my $PS2).
> 
>     : siamese; git reset --hard b8112df71cae7d6a86158caeb19d215f56c4f9ab
>     : siamese; git merge -n \
>       'reproduce 0e396ee43e445cb7c215a98da4e76d0ce354d9d7' \
>       HEAD 2089a0d38bc9c2cdd084207ebf7082b18cf4bf58
>     Trying merge strategy resolve...
>     Trying to find the optimum merge base.
>     Trying simple merge.
>     Simple merge failed, trying Automatic merge.
>     Removing drivers/net/fmv18x.c
>     Auto-merging drivers/net/r8169.c.
>     merge: warning: conflicts during merge
>     ERROR: Merge conflict in drivers/net/r8169.c.
>     Removing drivers/net/sk_g16.c
>     Removing drivers/net/sk_g16.h
>     fatal: merge program failed
>     Rewinding the tree to pristine...
>     Trying merge strategy multibase...
>     Trying simple merge.
>     Simple merge failed, trying Automatic merge.
>     Removing drivers/net/fmv18x.c
>     Auto-merging drivers/net/r8169.c.
>     merge: warning: conflicts during merge
>     ERROR: Merge conflict in drivers/net/r8169.c.
>     Removing drivers/net/sk_g16.c
>     Removing drivers/net/sk_g16.h
>     fatal: merge program failed
>     Rewinding the tree to pristine...
>     Trying merge strategy octopus...
>     Rewinding the tree to pristine...
>     Using the multibase to prepare resolving by hand.
>     Trying simple merge.
>     Simple merge failed, trying Automatic merge.
>     Removing drivers/net/fmv18x.c
>     Auto-merging drivers/net/r8169.c.
>     merge: warning: conflicts during merge
>     ERROR: Merge conflict in drivers/net/r8169.c.
>     Removing drivers/net/sk_g16.c
>     Removing drivers/net/sk_g16.h
>     fatal: merge program failed
>     Automatic merge failed; fix up by hand
>     : siamese; git-update-cache --refresh
>     drivers/net/r8169.c: needs update
>     : siamese; echo $?
>     1
>     : siamese; git diff -r 0e396ee43e445cb7c215a98da4e76d0ce354d9d7
>     :100644 100644 ce449fe 0000000 M	drivers/net/r8169.c
>     : siamese; exit
> 
> In the above example, 'resolve', 'multibase' and 'octopus' are
> tried in turn (actually, 'octopus' notices that it is given only
> one <remote> and refuses to do anything without wasting time).
> Since all of these strategies fail to fully auto-merge the given
> heads, and 'multibase' gives the smallest number of conflicts,
> its result is left in the working tree for the user to resolve
> by hand.  You resolve this and commit the same way as you
> currently do with 'git-resolve' that results in conflicts.

This is no good: the current 'resolve' can generate wrong results and report that it worked cleanly, while 'multibase' would report a conflict because it isn't ignoring a real problem. My primary goal in doing the multibase version wasn't to produce more clean merges; it was to produce fewer clean-but-wrong merges.

Show 6 quoted lines
> [Footnote]
> 
> *1* Fredrik, I have been wondering if we can just say that lack
> of '-u' flag implies '-i'.  Is there a good reason that
> 'git-read-tree -m O A B' without '-u' should care if working
> tree is up to date for the paths involved?

It tries to make sure that there is room to put stuff for resolving a conflict without messing with modified files in the directory.

Previous: Junio C HamanoNext: Junio C Hamano
Message 33 of 40 in “A new merge algorithm, take 3”
  1. 0/2 A new merge algorithm, take 3Fredrik Kuivinen, Sep 7, 2005
  2. 1/2 Add '-i' flag to read-tree to make it ignore whats in the working directory.Fredrik Kuivinen, Sep 7, 2005
  3. Unified merge driver pushed out to "master" branchJunio C Hamano, Sep 11, 2005
  4. Fredrik KuivinenSep 11, 2005
  5. Junio C HamanoSep 12, 2005
  6. Another merge test case from the kernel tree.Junio C Hamano, Sep 14, 2005
  7. Daniel BarkalowSep 14, 2005
  8. Junio C HamanoSep 14, 2005
  9. Fredrik KuivinenSep 14, 2005
  10. Junio C HamanoSep 14, 2005
  11. Yet another set of merge test cases from the kernel tree.Junio C Hamano, Sep 15, 2005
  12. Fredrik KuivinenSep 19, 2005
  13. Junio C HamanoSep 20, 2005
  14. Fredrik KuivinenSep 20, 2005
  15. 2/2 A new merge algorithmFredrik Kuivinen, Sep 7, 2005
  16. Daniel BarkalowSep 7, 2005
  17. Fredrik KuivinenSep 8, 2005
  18. Daniel BarkalowSep 8, 2005
  19. Fredrik KuivinenSep 8, 2005
  20. Daniel BarkalowSep 8, 2005
  21. Junio C HamanoSep 7, 2005
  22. Junio C HamanoSep 8, 2005
  23. A Large Angry SCMSep 8, 2005
  24. Chuck LeverSep 8, 2005
  25. Junio C HamanoSep 8, 2005
  26. Linus TorvaldsSep 8, 2005
  27. Junio C HamanoSep 8, 2005
  28. Chuck LeverSep 8, 2005
  29. Linus TorvaldsSep 8, 2005
  30. Chuck LeverSep 8, 2005
  31. Linus TorvaldsSep 8, 2005
  32. [RFH] Merge driverJunio C Hamano, Sep 9, 2005
  33. Daniel BarkalowSep 9, 2005
  34. Junio C HamanoSep 9, 2005
  35. Daniel BarkalowSep 9, 2005
  36. [RFH] Merge driverJunio C Hamano, Sep 11, 2005
  37. Fredrik KuivinenSep 12, 2005
  38. Junio C HamanoSep 12, 2005
  39. Fredrik KuivinenSep 13, 2005
  40. Junio C HamanoSep 13, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.