Re: Bug in merge-ort (rename detection can have collisions?)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Elijah Newren <newren@xxxxxxxxx> writes:

> Sorry for the long delay.  I haven't gotten much Git time lately...
>
> On Mon, Jun 13, 2022 at 9:52 AM Glen Choo <chooglen@xxxxxxxxxx> wrote:
>>
> [...]
>> Elijah Newren <newren@xxxxxxxxx> writes:
>>
>> > On Fri, Jun 10, 2022 at 9:53 AM Junio C Hamano <gitster@xxxxxxxxx> wrote:
>> >>
>> >> Elijah Newren <newren@xxxxxxxxx> writes:
>> >>
>> >> > On Tue, Jun 7, 2022 at 5:11 PM Glen Choo <chooglen@xxxxxxxxxx> wrote:
>> >> >>
>> >> >> (I'm not 100% what the bug _is_, only that there is one.)
>> >> >>
>> >> >> = Report
>> >> >>
>> >> >> At $DAYJOB, there was a report that "git merge" was failing on certain
>> >> >> branches. Fortunately, the repo is publicly accessible, so I can share
>> >> >> the full reproduction recipe:
>> >> >> ...
>> >> > Thanks for the detailed report; very cool.  Interestingly, if you
>> >> > reverse the direction of the merge (checkout origin/upstream-master
>> >> > and merge origin/master) then you get a different error:
>> >> > ...
>> >> > Anyway, long story short...I don't have a fix yet, but just thought
>> >> > I'd mention I saw the email and spent some hours digging in.
>> >>
>> >> Thanks for continued support for the ort strategy.  From the very
>> >> beginning, I was hesitant to make our tools try to be too clever
>> >> with excessive heuristics, but at least we are not making a silent
>> >> mismerge in this case, so it is probably OK, especially with "-s
>> >> recursive" still left as an escape hatch.
>> >
>> > In fact, the more general problem area here appears to affect the
>> > recursive strategy as well.  I'm glad the specific testcase reported
>> > works under recursive and gave Glen (or his user) a workaround, but
>> > that feels like luck rather than design because my minimal
>> > reproduction testcase not only triggers the same issue he saw with the
>> > ort strategy, but also triggers a previously unknown fatal bug in the
>> > recursive strategy too.
>>
>> Yeah, hm. I was surprised that we encountered this bug at all, but it's
>> not so surprising after seeing how many edge conditions this bug
>> contains.
>
> To be fair, I've dug into cases with more.  :-)

:)

>> I wonder if there other rename detection bugs lurking beyond the
>> horizon,
>
> I was trying to dig around for related issues so I can fix the class
> of problems rather than just the instance.  Reversing the direction of
> the merge was just one component of that (and I reported that
> particular tweak since it triggered something a little different).
>
> The original motivation for writing merge-ort was to address bugs I
> couldn't otherwise fix within merge-recursive's implementation.  I've
> put a lot of time into corner cases, many of which (perhaps even the
> majority) were not actually motivated by real-life testcases but me
> just having an obsession with making Git's merge machinery handle
> weird inputs.  Junio even commented on some of my testcases with 'I am
> not sure if there is a single "correct" answer everybody can agree on
> for each of these "insane" cases, though.'.  Now, obviously I can miss
> some inputs, as evidenced by the issue you reported, so there is
> always a chance there are more.  However...
>
>> whether we already assume that these bugs exist, and if so,
>> whether we should officially document "merge without rename detection"
>> as a workaround [1].
>>
>> [1] Assuming that the workaround works of course. I tried to disable
>> rename detection several times, but I couldn't really figure out whether
>> I did it correctly or whether it fixed the bug (which is why I didn't
>> include it in the initial report.)
>
> Turning off renames and relying on users to correct merge issues may
> be reasonable when there are only a few.  When there are more than a
> few, my experience in the past with turning off rename detection (or
> there being too many renames that rename detection turns itself off)
> is that users often:
>
>   * don't match up renamed files and do a three-way merge, but just
> pick one of the two conflicting sides, unknowingly discarding changes
> made on the other side
>   * sometimes notice the files that should have been renames, and
> manually hand apply the subset of changes they remember from one file
> to the other, and unknowingly discarding the remaining subset of
> changes (which were often changes made by people other than the one
> doing the merges).
>
> In the particular repository in question, you've got 600+ renames on
> one side, and 200+ on the other -- including multiple different entire
> directories.  (Also, since lack of rename detection makes renames get
> reported as modify/delete conflicts, and you've got 400+ actual
> modify/delete conflicts on top of all the renames, users would have
> lots of "fun" attempting to sort things all out without tool support.)
>  So, I'm worried the "fallback"/"workaround" is likely to put users in
> a worse situation rather than a better one.

Ah, that's a good point. I hadn't given too much thought to the
complexity of manually resolving a merge without rename detection, but,
like you said, it's probably not a useful fallback anyway.


> But, even if your goal really is to have a fallback, why not just use
> the `resolve` strategy?  Your testcase doesn't have multiple merge
> bases, and the resolve strategy is roughly the recursive strategy
> minus the renames and the multiple merge base handling.

Oh, today I learned about the `resolve` strategy..


> (Also, I'm not just avoiding work.  I have already written patches to
> turn off rename detection in the ort strategy.  I pointed these out to
> Stolee and Dscho for a special internal usecase of theirs, and at
> least one of those emails cc'ed the mailing list. so you should be
> able to find those patches with a search.  I'm just not convinced of
> the need to merge those patches.)
>
>
>
> Anyway, that all said, I posted a fix for this issue over at
> https://lore.kernel.org/git/pull.1268.git.1655871651.gitgitgadget@xxxxxxxxx/.
> With it, I can repeat the tensorflow merge you highlighted, in either
> direction, without issue.

That's fantastic. Thanks for keeping me in the loop :)



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux