From: Seth House <seth@eseth.com> To: git@vger.kernel.org Cc: Seth House <seth@eseth.com>, Felipe Contreras <felipe.contreras@gmail.com> Subject: [PATCH v11 1/3] mergetool: add hideResolved configuration Date: Tue, 9 Feb 2021 13:07:10 -0700 [thread overview] Message-ID: <20210209200712.156540-2-seth@eseth.com> (raw) In-Reply-To: <20210209200712.156540-1-seth@eseth.com> The purpose of a mergetool is to help the user resolve any conflicts that Git cannot automatically resolve. If there is a conflict that must be resolved manually Git will write a file named MERGED which contains everything Git was able to resolve by itself and also everything that it was not able to resolve wrapped in conflict markers. One way to think of MERGED is as a two- or three-way diff. If each "side" of the conflict markers is separately extracted an external tool can represent those conflicts as a side-by-side diff. However many mergetools instead diff LOCAL and REMOTE both of which contain versions of the file from before the merge. Since the conflicts Git resolved automatically are not present it forces the user to manually re-resolve those conflicts. Some mergetools also show MERGED but often only for reference and not as the focal point to resolve the conflicts. This adds a `mergetool.hideResolved` flag that will overwrite LOCAL and REMOTE with each corresponding "side" of a conflicted file and thus hide all conflicts that Git was able to resolve itself. Overwriting these files will immediately benefit any mergetool that uses them without requiring any changes to the tool. No adverse effects were noted in a small survey of popular mergetools[1] so this behavior defaults to `true`. However it can be globally disabled by setting `mergetool.hideResolved` to `false`. [1] https://www.eseth.org/2020/mergetools.html https://github.com/whiteinge/eseth/blob/c884424769fffb05d87afb33b2cf80cecb4044c3/2020/mergetools.md Original-implementation-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Seth House <seth@eseth.com> --- Documentation/config/mergetool.txt | 10 ++++++++++ git-mergetool.sh | 14 ++++++++++++++ t/t7610-mergetool.sh | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/Documentation/config/mergetool.txt b/Documentation/config/mergetool.txt index 16a27443a3..b858191970 100644 --- a/Documentation/config/mergetool.txt +++ b/Documentation/config/mergetool.txt @@ -40,6 +40,16 @@ mergetool.meld.useAutoMerge:: value of `false` avoids using `--auto-merge` altogether, and is the default value. +mergetool.hideResolved:: + During a merge Git will automatically resolve as many conflicts as + possible and write the 'MERGED' file containing conflict markers around + any conflicts that it cannot resolve; 'LOCAL' and 'REMOTE' normally + represent the versions of the file from before Git's conflict + resolution. This flag causes 'LOCAL' and 'REMOTE' to be overwriten so + that only the unresolved conflicts are presented to the merge tool. Can + be configured per-tool via the `mergetool.<tool>.hideResolved` + configuration variable. Defaults to `true`. + mergetool.keepBackup:: After performing a merge, the original file with conflict markers can be saved as a file with a `.orig` extension. If this variable diff --git a/git-mergetool.sh b/git-mergetool.sh index e3f6d543fb..40a103443d 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -239,6 +239,13 @@ checkout_staged_file () { fi } +hide_resolved () { + git merge-file --ours -q -p "$LOCAL" "$BASE" "$REMOTE" >"$LCONFL" + git merge-file --theirs -q -p "$LOCAL" "$BASE" "$REMOTE" >"$RCONFL" + mv -- "$LCONFL" "$LOCAL" + mv -- "$RCONFL" "$REMOTE" +} + merge_file () { MERGED="$1" @@ -276,7 +283,9 @@ merge_file () { BACKUP="$MERGETOOL_TMPDIR/${BASE}_BACKUP_$$$ext" LOCAL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_$$$ext" + LCONFL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_LCONFL_$$$ext" REMOTE="$MERGETOOL_TMPDIR/${BASE}_REMOTE_$$$ext" + RCONFL="$MERGETOOL_TMPDIR/${BASE}_REMOTE_RCONFL_$$$ext" BASE="$MERGETOOL_TMPDIR/${BASE}_BASE_$$$ext" base_mode= local_mode= remote_mode= @@ -322,6 +331,11 @@ merge_file () { checkout_staged_file 2 "$MERGED" "$LOCAL" checkout_staged_file 3 "$MERGED" "$REMOTE" + if test "$(git config --type=bool mergetool.hideResolved)" != "false" + then + hide_resolved + fi + if test -z "$local_mode" || test -z "$remote_mode" then echo "Deleted merge conflict for '$MERGED':" diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index 04b0095072..cec4a860ef 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -842,4 +842,22 @@ test_expect_success 'mergetool --tool-help shows recognized tools' ' grep meld mergetools ' +test_expect_success 'mergetool hideResolved' ' + test_config mergetool.hideResolved true && + test_when_finished "git reset --hard" && + git checkout -b test${test_count}_b master && + test_write_lines >file1 base "" a && + git commit -a -m "base" && + test_write_lines >file1 base "" c && + git commit -a -m "remote update" && + git checkout -b test${test_count}_a HEAD~ && + test_write_lines >file1 local "" b && + git commit -a -m "local update" && + test_must_fail git merge test${test_count}_b && + yes "" | git mergetool file1 && + test_write_lines >expect local "" c && + test_cmp expect file1 && + git commit -m "test resolved with mergetool" +' + test_done -- 2.29.2
next prev parent reply other threads:[~2021-02-09 20:54 UTC|newest] Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-12-23 4:53 [PATCH v5 0/1] mergetool: remove unconflicted lines Felipe Contreras 2020-12-23 4:53 ` [PATCH v5 1/1] mergetool: add automerge configuration Felipe Contreras 2020-12-23 13:34 ` Junio C Hamano 2020-12-23 14:23 ` Felipe Contreras 2020-12-23 20:21 ` Junio C Hamano 2020-12-24 0:14 ` Felipe Contreras 2020-12-24 0:32 ` Junio C Hamano 2020-12-24 1:36 ` Felipe Contreras 2020-12-24 6:17 ` Junio C Hamano 2020-12-24 15:59 ` Felipe Contreras 2020-12-24 22:32 ` Junio C Hamano 2020-12-27 18:01 ` Felipe Contreras 2020-12-24 9:24 ` [PATCH v5 0/1] mergetool: remove unconflicted lines Junio C Hamano 2020-12-24 16:16 ` Felipe Contreras 2020-12-30 5:47 ` Johannes Schindelin 2020-12-30 22:33 ` Felipe Contreras 2020-12-27 20:58 ` [PATCH v6 0/1] mergetool: add automerge configuration Seth House 2020-12-27 20:58 ` [PATCH v6 1/2] " Seth House 2020-12-27 22:06 ` Junio C Hamano 2020-12-27 22:29 ` Seth House 2020-12-27 22:59 ` Junio C Hamano 2020-12-27 20:58 ` [PATCH v6 2/2] mergetool: Add per-tool support for the autoMerge flag Seth House 2020-12-27 22:31 ` Junio C Hamano 2020-12-28 0:41 ` [PATCH v7 0/2] mergetool: add automerge configuration Seth House 2020-12-28 0:41 ` [PATCH v7 1/2] " Seth House 2020-12-28 0:41 ` [PATCH v7 2/2] mergetool: Add per-tool support for the autoMerge flag Seth House 2020-12-28 1:18 ` Felipe Contreras 2020-12-28 4:54 ` [PATCH v8 0/4] mergetool: add automerge configuration Seth House 2020-12-28 4:54 ` [PATCH v8 1/4] " Seth House 2020-12-28 11:30 ` Johannes Sixt 2020-12-28 4:54 ` [PATCH v8 2/4] mergetool: Add per-tool support for the autoMerge flag Seth House 2020-12-28 13:09 ` Junio C Hamano 2020-12-28 4:54 ` [PATCH v8 3/4] mergetool: Break setup_tool out into separate initialization function Seth House 2020-12-28 11:48 ` Johannes Sixt 2020-12-28 4:54 ` [PATCH v8 4/4] mergetool: Add automerge_enabled tool-specific override function Seth House 2020-12-28 11:57 ` Johannes Sixt 2020-12-28 13:19 ` Junio C Hamano 2020-12-28 19:29 ` [PATCH v9 0/5] mergetool: add automerge configuration Seth House 2020-12-28 19:29 ` [PATCH v9 1/5] " Seth House 2020-12-28 19:29 ` [PATCH v9 2/5] mergetool: alphabetize the mergetool config docs Seth House 2020-12-28 19:29 ` [PATCH v9 3/5] mergetool: add per-tool support for the autoMerge flag Seth House 2020-12-28 19:29 ` [PATCH v9 4/5] mergetool: break setup_tool out into separate initialization function Seth House 2020-12-29 8:50 ` Johannes Sixt 2020-12-29 17:23 ` Seth House 2020-12-28 19:29 ` [PATCH v9 5/5] mergetool: add automerge_enabled tool-specific override function Seth House 2020-12-29 2:01 ` Felipe Contreras 2021-01-06 5:55 ` Junio C Hamano 2021-01-07 3:58 ` Seth House 2021-01-07 6:38 ` Junio C Hamano 2021-01-07 9:27 ` Seth House 2021-01-07 21:26 ` Junio C Hamano 2021-01-08 15:04 ` Johannes Schindelin 2021-01-30 5:46 ` [PATCH v10 0/3] mergetool: add hideResolved configuration (was automerge) Seth House 2021-01-30 5:46 ` [PATCH v10 1/3] mergetool: add hideResolved configuration Seth House 2021-01-30 8:08 ` Junio C Hamano 2021-01-30 5:46 ` [PATCH v10 2/3] mergetool: break setup_tool out into separate initialization function Seth House 2021-01-30 5:46 ` [PATCH v10 3/3] mergetool: add per-tool support and overrides for the hideResolved flag Seth House 2021-01-30 8:08 ` Junio C Hamano 2021-02-09 20:07 ` [PATCH v11 0/3] mergetool: add hideResolved configuration (was automerge) Seth House 2021-02-09 20:07 ` Seth House [this message] 2021-03-09 2:29 ` [PATCH] mergetool: do not enable hideResolved by default Jonathan Nieder 2021-03-09 5:42 ` Seth House 2021-03-10 1:23 ` Jonathan Nieder 2021-03-10 8:06 ` Junio C Hamano 2021-03-11 1:57 ` Junio C Hamano 2021-03-12 23:12 ` Junio C Hamano 2021-03-12 23:29 ` Jonathan Nieder 2021-03-12 23:36 ` Junio C Hamano 2021-03-13 8:36 ` [PATCH v2 0/2] " Jonathan Nieder 2021-03-13 8:38 ` [PATCH 1/2] " Jonathan Nieder 2021-03-13 8:41 ` [PATCH 2/2] doc: describe mergetool configuration in git-mergetool(1) Jonathan Nieder 2021-03-13 23:34 ` Junio C Hamano 2021-03-13 23:37 ` Junio C Hamano 2021-02-09 20:07 ` [PATCH v11 2/3] mergetool: break setup_tool out into separate initialization function Seth House 2021-02-09 20:07 ` [PATCH v11 3/3] mergetool: add per-tool support and overrides for the hideResolved flag Seth House 2021-02-09 22:11 ` [PATCH v11 0/3] mergetool: add hideResolved configuration (was automerge) Junio C Hamano 2021-02-09 23:27 ` Seth House 2020-12-28 10:29 ` [PATCH v7 0/2] mergetool: add automerge configuration Junio C Hamano 2020-12-28 14:40 ` Felipe Contreras 2020-12-28 1:02 ` [PATCH v6 0/1] " Felipe Contreras
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=20210209200712.156540-2-seth@eseth.com \ --to=seth@eseth.com \ --cc=felipe.contreras@gmail.com \ --cc=git@vger.kernel.org \ --subject='Re: [PATCH v11 1/3] mergetool: add hideResolved configuration' \ /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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).