[PATCH] merge-file: honor merge.conflictStyle outside of a repository
- From
Yannik Tausch <dev@ytausch.de>
- Date
- Feb 5, 2026, 20:27 UTC
- Message-ID
- <3724733C-FECB-47F5-841C-84DE9792332D@ytausch.de>
- In-Reply-To
- <xmqq4invm2dk.fsf@gitster.g>
Show 23 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
>
> Yannik Tausch <dev@ytausch.de> writes:
>
>> We noticed that `git merge-file` only respects the `merge.conflictStyle`
>> configuration when run inside a repository. Outside a repository, the
>> setting is ignored and only the `--diff3`/`--zdiff3` flags work.
>>
>> Looking at the history, this appears to be intentional since b541248467
>> ("merge.conflictstyle: choose between merge and diff3 -m styles", 2008),
>> which explicitly gates config reading on being inside a repository.
>>
>> This behavior surprised me, and I couldn't find it documented anywhere.
>> Would a small documentation patch to git-merge-file.txt be welcome,
>> noting that the config is only read when inside a repository?
>
> Or even better, teach the command to read (limited set of)
> configuration files.
>
> By definition, you cannot read from per-repository configuration
> file when working outside a repository, but these days we let our
> commands read configuration from system and personal configuration
> files, I think. Back in 2008, it is understandable we couldn't.Thanks for the suggestion. Here's a patch:
From bed0035d38072c67e0be8eedb0cf98da936cbac6 Mon Sep 17 00:00:00 2001 From: Yannik Tausch <dev@ytausch.de> Date: Thu, 5 Feb 2026 21:09:52 +0100 Subject: [PATCH] merge-file: honor merge.conflictStyle outside of a repository
When running outside a repository, git merge-file previously ignored the merge.conflictStyle configuration variable entirely. Teach it to read from system and user configuration files using read_very_early_config(), so that users can set their preferred conflict style globally and have it honored even outside a repository.
Signed-off-by: Yannik Tausch <dev@ytausch.de> --- Documentation/git-merge-file.adoc | 3 +++ builtin/merge-file.c | 11 +++++----- t/t6403-merge-file.sh | 34 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-merge-file.adoc b/Documentation/git-merge-file.adoc index 71915a00fa..773037aa14 100644 --- a/Documentation/git-merge-file.adoc +++ b/Documentation/git-merge-file.adoc @@ -86,6 +86,9 @@ object store and the object ID of its blob is written to standard output. --zdiff3:: Show conflicts in "zdiff3" style. +The `--diff3` and `--zdiff3` options default to the value of the +`merge.conflictStyle` configuration variable (see linkgit:git-config[1]). + --ours:: --theirs:: --union:: diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 46775d0c79..1b6e16b9cb 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -95,12 +95,13 @@ int cmd_merge_file(int argc, xmp.style = 0; xmp.favor = 0; - if (startup_info->have_repository) { - /* Read the configuration file */ + if (startup_info->have_repository) repo_config(the_repository, git_xmerge_config, NULL); - if (0 <= git_xmerge_style) - xmp.style = git_xmerge_style; - } + else + read_very_early_config(git_xmerge_config, NULL); + + if (0 <= git_xmerge_style) + xmp.style = git_xmerge_style; argc = parse_options(argc, argv, prefix, options, merge_file_usage, 0); if (argc != 3) diff --git a/t/t6403-merge-file.sh b/t/t6403-merge-file.sh index 06ab4d7aed..9df9f878c8 100755 --- a/t/t6403-merge-file.sh +++ b/t/t6403-merge-file.sh @@ -428,6 +428,40 @@ test_expect_success '"diff3 -m" style output (2)' ' test_cmp expect actual ' +test_expect_success 'merge.conflictStyle honored outside repo' ' + test_config_global merge.conflictStyle diff3 && + cat >nongit-base <<-\EOF && + line1 + original + line3 + EOF + cat >nongit-ours <<-\EOF && + line1 + ours + line3 + EOF + cat >nongit-theirs <<-\EOF && + line1 + theirs + line3 + EOF + cat >nongit-expect <<-\EOF && + line1 + <<<<<<< ours + ours + ||||||| base + original + ======= + theirs + >>>>>>> theirs + line3 + EOF + test_must_fail nongit git merge-file -p \ + -L ours -L base -L theirs \ + "$PWD/nongit-ours" "$PWD/nongit-base" "$PWD/nongit-theirs" >nongit-actual && + test_cmp nongit-expect nongit-actual +' + test_expect_success 'marker size' ' cat >expect <<-\EOF && Dominus regit me,
-- 2.52.0