回复: [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 >