Subject: Re: [BUG] git merge reports conflict when two branches add independent methods at the same location

From: Ben Knoble <[email-masked]>
Date: Sat, 13 Sep 2025 15:24:36 -0400

> Le 12 sept. 2025 à 18:57, Elijah Newren <[email-masked]> a écrit :
> 
> On Fri, Sep 12, 2025 at 6:38 AM Guo Tingsheng <[email-masked]> wrote:
>> 
>> Hello Git developers,
>> 
>> I would like to report a potential issue in Git's merge behavior, where semantically independent changes at the same position are reported as a conflict, even though they could be merged automatically.
>> 
>> Environment:
>> - git version: 2.43.0
>> - OS: Ubuntu 24.04 LTS
>> 
>> Steps to reproduce:
>> 1. Start with a file containing only:
>> 
>>   public class Calculator {
>>   }
>> 
>> 2. On branch A, add a new method `add`:
>> 
>>   @@ -1,1 +1,3 @@
>>   public class Calculator {
>>   +    public static double add(double a, double b) {
>>   +        return a + b;
>>   +    }
>> 
>> 3. On branch B, add a new method `subtract`:
>> 
>>   @@ -1,1 +1,3 @@
>>   public class Calculator {
>>   +    public static double subtract(double a, double b) {
>>   +        return a - b;
>>   +    }
>> 
>> 4. Merge branch A and branch B.
>> 
>> Expected result:
>> - The merge should succeed automatically, producing a file that contains both methods (order does not matter).
>>  For example:
>> 
>>   public class Calculator {
>>       public static double add(double a, double b) {
>>           return a + b;
>>       }
>>       public static double subtract(double a, double b) {
>>           return a - b;
>>       }
>>   }
>> 
>> Actual result:
>> - Git reports a conflict and aborts the merge, requiring manual conflict resolution.
>> 
>> Additional information:
>> - Although the two changes occur at the same location in the file, they are independent additions with no semantic overlap.
>> - It would be desirable for Git's merge algorithm to automatically combine such changes, as the final merged state is deterministic and conflict-free.
>> - This limitation may impact developer productivity in real-world projects where multiple contributors extend the same class or configuration file independently.
> 
> Thanks for the report, but how is Git supposed to know that they are
> independent changes with no semantic overlap?  Git doesn't understand
> the semantics of the files it tracks.  It has no idea whether the
> things being added are functions, or statements/expressions within a
> function, or college essays, or hand-written recipes, or data dumps,
> or anything else.  It would need to know those semantics, which would
> probably require something on the level of use of AI to determine that
> the changes are independent non-competing additions with no semantic
> overlap and that you want to keep both.

Sorry, can’t resist: we’ve been writing semantic analysis code for decades. It wouldn’t take AI to get this right.

What’s hard about the situation is that it doesn’t generalize easily: a semantic analyzer that can resolve conflicts for one file, project, language, etc., is not necessarily of any help to its brethren.

Still, if you write a lot of Java or similar code and have this problem frequently, building a merge strategy option or mergetool you can use to resolve this easily seems worthwhile. (Not something mainline Git needs, of course, for all the reasons pointed out here.)