git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git merge bug report

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 15, 2025, 13:52 UTC
Message-ID
<xmqqtt6po7lj.fsf@gitster.g>
In-Reply-To
<CAE8aReXOwM8ByyObxrb8NhRMYfK1OB_6B9eOO07mYXMkp_E8EA@mail.gmail.com>
mu gsh <yue937@gmail.com> writes:
Show 57 quoted lines
> 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.

Previous: mu gshNext: Lucas Seiki Oshiro
Message 2 of 4 in “git merge bug report”
  1. mu gshApr 15, 2025
  2. Junio C HamanoApr 15, 2025
  3. Lucas Seiki OshiroApr 15, 2025
  4. mu gshApr 15, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.