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

Re: [RFC/PATCH] mergetool: use resolved conflicts in all the views

From
Seth House <seth@eseth.com>
Date
Dec 18, 2020, 05:49 UTC
Message-ID
<20201218054947.GA123376@ellen>
In-Reply-To
<5fdc18a91c402_f2faf20837@natae.notmuch>
On Thu, Dec 17, 2020 at 08:49:13PM -0600, Felipe Contreras wrote:
> And no person is the sole arbiter of truth, in this list, or anywhere.
> People have managed to change Junio's mind.

I'm not worried about Junio but I am wondering if anyone has managed to change your mind. You and I have been going back and forth on this list and on Reddit for two solid days and, to be frank, I'm running out of steam.

> You said you would provide a list of tools that would be affected.

No, I said I would provide a list of before/after screenshots so people in this thread that haven't been following the entire discussion can more easily see the differences and benefits of this change.

I can't speak for the preferences of all the mergetool authors out there but I will try to convince you of the merit of adding a configuration flag in two places instead of just one. This took me a long time to write; I would appreciate it if you read it slowly and carefully.

There are three broad classifications of mergetools that I've seen so far. I've only collected notes for seventeen of them but there are many, many others. I mentioned those classifications earlier in this thread but to repeat them here:

1.  Tools that ignore conflict resolution and simply diff LOCAL and
    REMOTE. This accounts for most of them.
2.  Tools that perform their own, internal conflict resolution. Examples
    are tkdiff, WinMerge, IntelliJ.
3.  Tools that reuse Git's conflict resolution by splitting MERGED.
    Examples are Emacs + Magit, vim-mergetool, diffconflicts.

This patch *will* (probably) always benefit the first group. Because this patch *overwrites* LOCAL and REMOTE those tools will see immediate benefit without having to make any changes at all.

This patch *may* benefit the second group, or it may not affect them at all, or they may want it off. If they keep it on they will run conflict resolution against files that have already undergone that process in Git and likely turn up no additional resolutions since Git is quite good at doing that. It is also possible that some of them may do a better job than Git, or that some of them may want Git to tackle some of the conflict resolution (things that require access to the file history such as renames or recursive parents), but also want to perform even more sophisticated conflict resolution on top of that. Some of those tools are very clever and innovation in this space is still happening.

This patch *may* benefit the third group or it may make them no longer necessary. Speaking as the author of one of them: I see that as a good thing.

This patch *may* prevent tools in the second and third groups from having all the information they desire to show users without also running additional Git commands. Because this patch *overwrites* LOCAL and REMOTE any tool that wishes to show the state of the file before the merge was started will need to use Git to generate a new copy of those files. Although this is a negative I think benefiting the large number of tools in the first group outweighs this negative. Because the second and third groups of tools are more sophisticated, I think the authors of those tools are better suited to navigating these pros and cons.

In closing, below are several use-cases for having both a tool-level flag and a global flag:

I, as the author of diffconflicts, *will* want to disable this flag for diffconflicts because that tool already does what this flag does *and* because that tool makes use of the original versions of LOCAL and REMOTE which this patch destroys.

I, as a user of diffconflicts, *may* want to disable this flag because in practice I don't actually reference LOCAL and REMOTE very often. Other users may reference LOCAL and REMOTE every time. You yourself said, "Even if I were using diffconflict, I would want this option on." Other users may choose differently than you because you are also not the "sole arbiter of truth" and because this is entirely about personal preference and is decidedly not about objective truth. If this patch always benefited everyone then we would make it default and not put it behind an opt-in flag.

I, as a user of diffconflicts, may want to both disable this flag for diffconflicts but enable this flag for VS Code and kdiff3. It is not unusual for people to use more than one mergetool. Some of them are better or worse at visualizing different kinds of conflicts. Sometimes a conflict is small and straightforward; othertimes a conflict is complicated and requires deep knowledge of the history of both branches. If we force this to be a global flag only then users will not be able to make different choices for different tools.

Someone who does use multiple mergetools but only uses tools from group one may appreciate a single global flag so s/he doesn't need to set it for each tool.

Someone who is actively developing a new mergetool may want to enable or disable this flag for that tool while still keeping the flag enabled or disabled for tools that s/he uses for work or school. Someone who is comparing and contrasting multiple mergetools for work or school may want to selectively enable or disable the flag for one tool or another in order to do the comparison. Someone may want the same mergetool configured twice, once with this flag and once without, in order to contrast the difference.

An end-user may want to use a mergetool differently than the author intended. You said, "This should be a setting in the tool driver, not a user-visible setting," and then you said, "Even if I were using diffconflict, I would want this option on." But I said, "I, as the author of diffconflicts, *will* want to disable this flag." and there's no reason we can't have both. I can't presume what preference other mergetool authors will have. We can make some educated guesses and even default the option to true for some mergetool wrappers that ship with Git but there's every possibility that a user will prefer it a different way or that a mergetool author will. And there's every possibility that there will be differing opinions between users and authors like there is between you and me. But that's ok! Because it's just a configuration option.

Previous: Felipe ContrerasNext: Felipe Contreras
Message 18 of 70 in “mergetool: use resolved conflicts in all the views”
  1. mergetool: use resolved conflicts in all the viewsFelipe Contreras, Dec 16, 2020
  2. Junio C HamanoDec 16, 2020
  3. Seth HouseDec 16, 2020
  4. Junio C HamanoDec 17, 2020
  5. Felipe ContrerasDec 17, 2020
  6. Johannes SixtDec 17, 2020
  7. Felipe ContrerasDec 17, 2020
  8. Johannes SixtDec 17, 2020
  9. Felipe ContrerasDec 18, 2020
  10. Seth HouseDec 17, 2020
  11. Felipe ContrerasDec 17, 2020
  12. Seth HouseDec 17, 2020
  13. Junio C HamanoDec 17, 2020
  14. Felipe ContrerasDec 18, 2020
  15. Felipe ContrerasDec 18, 2020
  16. Seth HouseDec 18, 2020
  17. Felipe ContrerasDec 18, 2020
  18. Seth HouseDec 18, 2020
  19. Felipe ContrerasDec 18, 2020
  20. Seth HouseDec 19, 2020
  21. Felipe ContrerasDec 19, 2020
  22. Junio C HamanoDec 19, 2020
  23. Felipe ContrerasDec 19, 2020
  24. Junio C HamanoDec 19, 2020
  25. Felipe ContrerasDec 19, 2020
  26. Seth HouseDec 21, 2020
  27. Felipe ContrerasDec 21, 2020
  28. Seth HouseDec 21, 2020
  29. Felipe ContrerasDec 21, 2020
  30. David AguilarDec 21, 2020
  31. Code of conduct violation?Felipe Contreras, Dec 21, 2020
  32. Junio C HamanoDec 22, 2020
  33. Felipe ContrerasDec 22, 2020
  34. Pratyush YadavDec 22, 2020
  35. Felipe ContrerasDec 23, 2020
  36. Junio C HamanoDec 23, 2020
  37. Felipe ContrerasDec 23, 2020
  38. Nobody is THE one making contributionJunio C Hamano, Dec 23, 2020
  39. Felipe ContrerasDec 23, 2020
  40. Junio C HamanoDec 23, 2020
  41. Felipe ContrerasDec 24, 2020
  42. Ævar Arnfjörð BjarmasonDec 24, 2020
  43. Felipe ContrerasDec 24, 2020
  44. Ævar Arnfjörð BjarmasonDec 24, 2020
  45. Felipe ContrerasDec 24, 2020
  46. Junio C HamanoDec 24, 2020
  47. Felipe ContrerasDec 27, 2020
  48. Junio C HamanoDec 27, 2020
  49. Felipe ContrerasDec 27, 2020
  50. Junio C HamanoDec 28, 2020
  51. Felipe ContrerasDec 28, 2020
  52. Randall S. BeckerDec 24, 2020
  53. Felipe ContrerasDec 24, 2020
  54. Junio C HamanoDec 24, 2020
  55. David AguilarDec 24, 2020
  56. Felipe ContrerasDec 24, 2020
  57. Junio C HamanoDec 18, 2020
  58. Felipe ContrerasDec 18, 2020
  59. Junio C HamanoDec 19, 2020
  60. Felipe ContrerasDec 19, 2020
  61. David AguilarDec 20, 2020
  62. Felipe ContrerasDec 20, 2020
  63. David AguilarDec 20, 2020
  64. Felipe ContrerasDec 21, 2020
  65. Seth HouseDec 19, 2020
  66. Felipe ContrerasDec 16, 2020
  67. Junio C HamanoDec 17, 2020
  68. Felipe ContrerasDec 17, 2020
  69. mergetool: use resolved conflicts in all the viewsFelipe Contreras, Dec 17, 2020
  70. Felipe ContrerasDec 21, 2020

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.