Re: git merge bug report

Junio C Hamano
2025-04-15T13:52:10Z

mu gsh <yue937@gmail.com> writes:

> cat > models.py <<EOF
> class User:
> name = "str"
>
>
> class Product:
> id = 0
> EOF
> git add models.py
> git commit -m "initial: User and Product class"
>
> # feature1
> git checkout -b feature
> cat > models.py <<EOF
> class User:
> name = "str"
>
> def user_method(self):
> return
>
>
> class Product:
> id = 0
> EOF
> git commit -am "feature: add method to User"
>
> # feature 2
> git checkout master
> cat > models.py <<EOF
> class User:
> name = "str"
> bugger = "fix me"
>
>
> class NoMethod:
> pass
>
>
> class Product:
> id = 0
> EOF
> git commit -am "master: add field to User and new class"
>
> git merge feature
> echo
> echo "==== merged, user_method into NoMethod class ===="
> cat models.py
> ```
>
> Actual Result
>
> After the merge, the user_method ends up inside the NoMethod class,
> which is incorrect and unexpected.
>
>
> Please let me know if any additional information is needed. Thank you
> for your time and help.

I think this is very much expected, unfortunately. Git is language
agnostic in the sense that it does not know the meaning of the
contents of the file it is thrown at. With the merge, what it was
asked to do is:

- The other branch, "feature1", added three lines, an empty
user_method() definition and a blank line around it, before
lines that have 'class product:' and ' id = 0' (or after lines
that have 'class User:' and ' name = str' followed by a blank
line).

- In the meantime, you added some stuff in feature2.

- Please replay what the other branch did on top of what we have.

But after your feature2, the precontext lines that it can use as an
anchor no longer exist (the blank line after 'class User:' and '
name = str' is gone). while the post context lines ("blank followed
by 'class Product: followed by 'id = 0'") are still intact.
Wiggling the added three lines there would be a more natural choice
than having to deal with "bugger = 'fix me'" whose disposition is
totally unclear to unthinking non-mind that is a mechanical merge
machinery in Git.