Thread (3 messages) 3 messages, 2 authors, 2025-10-28

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

From: Guo Tingsheng <hidden>
Date: 2025-10-28 16:12:35

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.

To make it easier to reproduce, I have open-sourced this example in a public repository:
Repository: https://github.com/CoriWork/bug-replay.git

You can clone the repository and follow the README.md to replay the bug!

---

Environment:
- Git version: 2.43.0
- OS: Ubuntu 24.04 LTS

---

Steps to reproduce:
1. On branch B, modify a file at a certain location:
@@ -1068,9 +1026,7 @@ 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 A, make no changes to this location.

3. Merge branch A and branch B.

---

Expected result:
The merge should retain the change made in branch B:
@@ -1068,9 +1026,7 @@ 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);

---

Additional information:
- This issue occurs even when branch B does not modify the same location.
- It appears to happen deterministically under a specific construction that
  splits one patch into two disjoint sets of hunks, applies them separately
  to create two branches, and then merges them back.
- The merged result can differ from the expected content of the original commit.

Thank you for your time and your work maintaining Git.

Best regards,  
Guo Tingsheng  
< CoriCraft16@outlook.com >
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help