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

Re: Handling merge conflicts a bit more gracefully..

From
Junio C Hamano <junkio@cox.net>
Date
Jun 9, 2005, 04:35 UTC
Message-ID
<7vfyvsuoz3.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.58.0506081936370.2286@ppc970.osdl.org>
>>>>> "LT" == Linus Torvalds <torvalds@osdl.org> writes:

LT> Yeah, ok, so the fact that we allow missing things in the LT> index (which was debatable to start with) makes for LT> exceptions.

Not just that. Another big difference is that we allow _extra_ things in the index in two-tree case (i.e. local additions). But I do not think these exceptions are necessarily bad.

And you are right that two-tree is _very_ different from three-way merge.

LT> We could certainly be stricter about the index contents, and LT> require that they match the branch we're merging from LT> exactly, rather than be a subset.

I guess great minds do not always think alike. I was going in quite the opposite direction. I vaguely recall saying this before on this list ;-)

With the current three-way code, if I rewrite two-way merge using the three-way "read-tree -m H I-mixed-with-H M" (emulated two-tree fast forward, where "I" denotes "tree that would have resulted from the original cache"), it would give quite different results from the "carry forward" two-way code we have. So in that sense, three-way and two-way are quite different.

I have, however, not convinced myself that this difference is coming from some fundamental difference between two-tree fast forward and three-way merge. If desirable results fall out naturally for the "emulated two-way" case by handling three-way case more carefully (e.g. not having stricter index requirements than necessary), that would be wonderful. I think, for example, there are places where we have too strict index requirements in three-way merge (grep for '(ALT)' in t/t1000*.sh test file).

I probably am dreaming, though.

LT> I think the case that is more important (and more likely to LT> hit people) is when they have something in their working LT> tree that conflicts with the merge, and then what you want LT> is really that the current "update" code do the three-way LT> merge in the working directory, not that it's done on the LT> index file contents.

LT> ..., but I don't think the index file is the most important LT> case. The more important case is the one that the three-way LT> merge doesn't handle either!

I agree with all of the above. Their working tree has changes from H, and merging M into H conflicts with those changes. That means, although they did not actually make a formal commit, what they have is essentially this:

         cache contents
         is here
         v
      ---I---
     /       ^work tree contents is here
  --H
     \
      ----------M

which means we are exactly in the same situation as "merge I and M pivoting on H" three-way merge, with a dirty work tree. Any solution and help we would give to the end-user for the three-way case would automatically help this two-way case, wouldn't it?

I do not think index file is important either; maybe I am not really understanding your argument. I fully accept the new world order with today's merge-one-file-script changes, that the merge result will be left in the work tree for the user to verify and sort out. What I am trying to do in the above picture is to help the end-user forward-porting differences in I since H (along with the work tree changes since I) when doing a fast-forward from H to M happens, using the files in the work tree.

Previous: Linus TorvaldsNext: Linus Torvalds
Message 11 of 33 in “Handling merge conflicts a bit more gracefully..”
  1. Linus TorvaldsJun 8, 2005
  2. Junio C HamanoJun 8, 2005
  3. Linus TorvaldsJun 8, 2005
  4. Junio C HamanoJun 9, 2005
  5. Linus TorvaldsJun 9, 2005
  6. Junio C HamanoJun 9, 2005
  7. Junio C HamanoJun 9, 2005
  8. Linus TorvaldsJun 9, 2005
  9. Junio C HamanoJun 9, 2005
  10. Linus TorvaldsJun 9, 2005
  11. Junio C HamanoJun 9, 2005
  12. Linus TorvaldsJun 9, 2005
  13. Junio C HamanoJun 9, 2005
  14. 0/3 Handling merge conflicts a bit more gracefullyJunio C Hamano, Jun 9, 2005
  15. 1/3 read-tree.c: rename local variables used in 3-way merge code.Junio C Hamano, Jun 9, 2005
  16. 2/3 read-tree -m 3-way: loosen index requirements that is too strict.Junio C Hamano, Jun 9, 2005
  17. 3/3 read-tree -m 3-way: handle more trivial merges internallyJunio C Hamano, Jun 9, 2005
  18. Linus TorvaldsJun 9, 2005
  19. Junio C HamanoJun 9, 2005
  20. Linus TorvaldsJun 9, 2005
  21. Junio C HamanoJun 9, 2005
  22. Add git-diff-stages command.Junio C Hamano, Jun 9, 2005
  23. Linus TorvaldsJun 9, 2005
  24. diff-stages: unuglify the too big main() function.Junio C Hamano, Jun 11, 2005
  25. Junio C HamanoJun 10, 2005
  26. Herbert XuJun 18, 2005
  27. Linus TorvaldsJun 18, 2005
  28. Jeff GarzikJun 9, 2005
  29. Linus TorvaldsJun 9, 2005
  30. read-tree.c: rename local variables used in 3-way merge code.Junio C Hamano, Jun 9, 2005
  31. Handle entry removals during merge correctly.Junio C Hamano, Jun 9, 2005
  32. read-tree -m 3-way: loosen an index requirement that was too strict.Junio C Hamano, Jun 9, 2005
  33. read-tree -m 3-way: handle more trivial merges internally.Junio C Hamano, Jun 9, 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.