Possible merge bug

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

 



[Summary]
Issue occurs when two branches reorder lines of the same file and are
then merged back to the base branch. Instead of getting a content
merge conflict, the branches are merged successfully and a line in the
file is duplicated.


[Steps to Reproduce]
1. initialize a new repository and create a file with three lines of content:
```
a
b
c
```
and commit the result

2. branch from this commit and modify the contents of the file to be:
```
b
a
c
```
and commit the results

3. checkout master at commit from step one

4. branch from this commit and modify the contents of the file to be:
```
b
c
a
```
and commit the results

5. checkout master at the commit from step one

6. merge the first branch (results in ff-merge)

7. merge the second branch (results in auto merge_3way)

8. examine file contents:
```
b
a
c
a
```

[Expected Behavior]
I expected to get a content merge conflict when attempting to merge
the second branch.  If the example is changed to be a file starting
```
a
b
c
d
```
with two branches that change it to
```
c
a
b
d
```
and
```
c
d
a
b
```
respectively, and then the same sequence of merges, this is detected
as a merge conflict as I would expect the single line case to be.

[What Happened Instead]
Instead merge succeeds without conflict and results in duplication of
a line in the file


[System Info]
git version:
git version 2.34.0.rc0.377.g6d82a21a3b
cpu: x86_64
built from commit: 6d82a21a3b699caf378cb0f89b6b0e803fc58480
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
uname: Darwin 20.6.0 Darwin Kernel Version 20.6.0: Wed Jun 23 00:26:31
PDT 2021; root:xnu-7195.141.2~5/RELEASE_X86_64 x86_64
compiler info: clang: 13.0.0 (clang-1300.0.29.3)
libc info: no libc information available
$SHELL (typically, interactive shell): /bin/zsh


[Enabled Hooks]

[Other Details]
I tried this experiment with a few different merge strategies and got
the same result regardless of which I picked.  I did some rudimentary
debugging and tracked handling of the merge for this file through
merge-ort.c -> merge_3way -> ll_merge -> xdiff/xmerge.c -- It seems
xdiff/xmerge is responsible for attempting the actual merge, deciding
if there are conflicts and dropping the usual markers, or successfully
auto-merging the changes.  Wasn't sure of the testing process for
xdiff and figured I would put this to the mailing list for feedback.



[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