mu gsh <yue937@xxxxxxxxx> 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.