Re: [BUG] git merge sometimes loses changes from one branch

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

 



On Fri, Sep 12, 2025 at 6:41 AM Guo Tingsheng <CoriCraft16@xxxxxxxxxxx> wrote:
>
> Hello Git developers,
>
> I would like to report a potential issue in Git's merge behavior, where changes from one branch may be lost even when the other branch does not modify the same location.
>
> Environment:
> - git version: 2.43.0
> - OS: Ubuntu 24.04 LTS
>
> Steps to reproduce:
> 1. On branch A, modify a file at a certain location:
>
>    @@ -1026,7 +1028,9 @@
>    public final class AutoBuilderCompilationTest {
>                 "  }",
>                 "}");
>         Compilation compilation =
>    -        javac().withProcessors(new AutoBuilderProcessor()).compile(javaFileObject);
>    +        javac()
>    +            .withProcessors(new AutoBuilderProcessor())
>    +            .compile(javaFileObject);
>         assertThat(compilation).failed();
>         assertThat(compilation)
>             .hadErrorContaining(
>
> 2. On branch B, make no changes to this location.
>
> 3. Merge branch A and branch B.
>
> Expected result:
> - The merge should retain the changes made in branch A:
>
>    @@ -1026,7 +1028,9 @@
>    public final class AutoBuilderCompilationTest {
>                 "  }",
>                 "}");
>         Compilation compilation =
>    -        javac().withProcessors(new AutoBuilderProcessor()).compile(javaFileObject);
>    +        javac()
>    +            .withProcessors(new AutoBuilderProcessor())
>    +            .compile(javaFileObject);
>         assertThat(compilation).failed();
>         assertThat(compilation)
>             .hadErrorContaining(
>
> Actual result:
> - Git sometimes produces a merged result where the modification from branch A is lost, yielding:
>
>    @@ -1026,7 +1028,9 @@
>    public final class AutoBuilderCompilationTest {
>                 "  }",
>                 "}");
>         Compilation compilation =
>            javac().withProcessors(new AutoBuilderProcessor()).compile(javaFileObject);
>         assertThat(compilation).failed();
>         assertThat(compilation)
>             .hadErrorContaining(
>
> Additional information:
> - This issue occurs even when the other branch (B) does not modify the same location.
> - It appears to happen non-deterministically and may lead to subtle bugs in real-world merges.

My only guess here would be having a non-unique merge-base, where one
of the merge bases also introduced this change, so that it appears
that A made no change relative to the consolidated merge base while
also making it look like branch B undid the change relative to that
consolidated merge base.  But, that's a wild guess and I have no idea
if that's related to what you're seeing or if there's some unrelated
issue at play.

Can you create a testcase to reproduce this, either a repository that
others can clone together with the commands to trigger it, or a bunch
of commands to both create a simple repository and demonstrate the
issue?





[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