From: Junio C Hamano <gitster@pobox.com>
To: "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Elijah Newren <newren@gmail.com>
Subject: Re: [PATCH 2/2] merge: avoid searching for strategies with fewer than 0 conflicts
Date: Sun, 21 Aug 2022 11:05:24 -0700 [thread overview]
Message-ID: <xmqqwnb1fp5n.fsf@gitster.g> (raw)
In-Reply-To: <5657a05e7635ecadbb8d2e41ad97fe19f3633fdd.1661056709.git.gitgitgadget@gmail.com> (Elijah Newren via GitGitGadget's message of "Sun, 21 Aug 2022 04:38:29 +0000")
"Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Elijah Newren <newren@gmail.com>
>
> builtin/merge.c has a loop over the specified strategies, where if
> they all fail with conflicts, it picks the one with the least number
> of conflicts.
>
> In the codepath that finds a successful merge, if an automatic commit
> was wanted, the code breaks out of the above loop, which makes sense.
> However, if the user requested there be no automatic commit, the loop
> would continue looking for a "better" strategy. Since it had just
> found a strategy with 0 conflicts though, and it is not possible to
> have fewer than 0 conflicts, the continuing search is guaranteed to be
> futile.
Let's imagine "git merge -s ours -s ort X", both of which resolve
the merge cleanly but differently.
The "best_cnt" thing tries to find the last strategy with the lowest
score from evaluate_result(), so strictly speaking I think this
changes the behaviour. Am I mistaken?
When two strategies 'ours' and 'ort' resolved a given merge cleanly
(but differently), we would have taken the result from 'ort' in the
original code, but now we stop at seeing that 'ours' resolved the
merge cleanly and use its result.
> cnt = (use_strategies_nr > 1) ? evaluate_result() : 0;
> if (best_cnt <= 0 || cnt <= best_cnt) {
While I think "we see one clean merge, so it is OK to quit" is more
intuitive than the current behaviour, we need to update this
comparison to require the new candidate to have strictly better
result to take over the tentative best from the current candidate.
That will make things consistent with this change and makes it
easier to sell.
As the userbase of Git is so wide, it is very plausible that
somebody already invented and publisized that prepending "-s ours"
before the real strategy they want to use as an idiom to say "fall
back to pretend merge cleanly succeeded but did not affect the tree"
in a script that automate rebuilding tentative integration branch to
test, or something. They can "fix" their "idiom" to append instead
of prepend "-s ours", and that would arguably make the resulting
command line more intuitive and easier to understand, but the fact
that whatever that was working for them to their liking suddenly
changes the behaviour is a regression we have to ask them to accept.
I do not mind writing something like this
"git merge" with multiple strategies chooses to leave the least
number of conflicted paths as the result. Among multiple strategies
that give the same number of conflicted paths, it used to use the
last such strategy with the smallest number of conflicted paths.
The command now prefers the first such strategy instead.
If you have been using "git merge -s ours -s another X" as a way to
say "we prefer 'another' strategy to merge, but use 'ours' strategy
to make progress if it does not", you now have to swap the order of
strategies you list on the command line.
in the "Backward Incompatibility Notes" section of the release
notes.
Thanks.
next prev parent reply other threads:[~2022-08-21 18:05 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-21 4:38 [PATCH 0/2] Miscellaneous merge fixes Elijah Newren via GitGitGadget
2022-08-21 4:38 ` [PATCH 1/2] merge: only apply autostash when appropriate Elijah Newren via GitGitGadget
2022-08-21 4:52 ` Eric Sunshine
2022-08-21 5:18 ` Elijah Newren
2022-08-21 4:38 ` [PATCH 2/2] merge: avoid searching for strategies with fewer than 0 conflicts Elijah Newren via GitGitGadget
2022-08-21 18:05 ` Junio C Hamano [this message]
2022-08-22 15:00 ` Elijah Newren
2022-08-22 16:19 ` Junio C Hamano
2022-08-23 1:18 ` Elijah Newren
2022-08-23 2:42 ` [PATCH v2 0/3] Miscellaneous merge fixes Elijah Newren via GitGitGadget
2022-08-23 2:42 ` [PATCH v2 1/3] merge: only apply autostash when appropriate Elijah Newren via GitGitGadget
2022-08-23 2:42 ` [PATCH v2 2/3] merge: cleanup confusing logic for handling successful merges Elijah Newren via GitGitGadget
2022-08-23 2:42 ` [PATCH v2 3/3] merge: small code readability improvement Elijah Newren via GitGitGadget
2022-08-23 3:03 ` [PATCH v2 0/3] Miscellaneous merge fixes Elijah Newren
2022-08-24 21:09 ` Junio C Hamano
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=xmqqwnb1fp5n.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=newren@gmail.com \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).