Skip to content

Commit 9058b8f

Browse files
committed
Merge branch 'en/merge-octopus-fix'
"merge-octopus" strategy did not ensure that the index is clean when merge begins. * en/merge-octopus-fix: merge-octopus: abort if index does not match HEAD t6044: new merge testcases for when index doesn't match HEAD
2 parents edc2f71 + 3ec62ad commit 9058b8f

File tree

2 files changed

+159
-0
lines changed

2 files changed

+159
-0
lines changed

git-merge-octopus.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ esac
4444
# MRC is the current "merge reference commit"
4545
# MRT is the current "merge result tree"
4646

47+
if ! git diff-index --quiet --cached HEAD --
48+
then
49+
echo "Error: Your local changes to the following files would be overwritten by merge"
50+
git diff-index --cached --name-only HEAD -- | sed -e 's/^/ /'
51+
exit 2
52+
fi
4753
MRC=$(git rev-parse --verify -q $head)
4854
MRT=$(git write-tree)
4955
NON_FF_MERGE=0
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
#!/bin/sh
2+
3+
test_description="merges with unrelated index changes"
4+
5+
. ./test-lib.sh
6+
7+
# Testcase for some simple merges
8+
# A
9+
# o-----o B
10+
# \
11+
# \---o C
12+
# \
13+
# \-o D
14+
# \
15+
# o E
16+
# Commit A: some file a
17+
# Commit B: adds file b, modifies end of a
18+
# Commit C: adds file c
19+
# Commit D: adds file d, modifies beginning of a
20+
# Commit E: renames a->subdir/a, adds subdir/e
21+
22+
test_expect_success 'setup trivial merges' '
23+
seq 1 10 >a &&
24+
git add a &&
25+
test_tick && git commit -m A &&
26+
27+
git branch A &&
28+
git branch B &&
29+
git branch C &&
30+
git branch D &&
31+
git branch E &&
32+
33+
git checkout B &&
34+
echo b >b &&
35+
echo 11 >>a &&
36+
git add a b &&
37+
test_tick && git commit -m B &&
38+
39+
git checkout C &&
40+
echo c >c &&
41+
git add c &&
42+
test_tick && git commit -m C &&
43+
44+
git checkout D &&
45+
seq 2 10 >a &&
46+
echo d >d &&
47+
git add a d &&
48+
test_tick && git commit -m D &&
49+
50+
git checkout E &&
51+
mkdir subdir &&
52+
git mv a subdir/a &&
53+
echo e >subdir/e &&
54+
git add subdir &&
55+
test_tick && git commit -m E
56+
'
57+
58+
test_expect_success 'ff update' '
59+
git reset --hard &&
60+
git checkout A^0 &&
61+
62+
touch random_file && git add random_file &&
63+
64+
git merge E^0 &&
65+
66+
test_must_fail git rev-parse HEAD:random_file &&
67+
test "$(git diff --name-only --cached E)" = "random_file"
68+
'
69+
70+
test_expect_success 'ff update, important file modified' '
71+
git reset --hard &&
72+
git checkout A^0 &&
73+
74+
mkdir subdir &&
75+
touch subdir/e &&
76+
git add subdir/e &&
77+
78+
test_must_fail git merge E^0
79+
'
80+
81+
test_expect_success 'resolve, trivial' '
82+
git reset --hard &&
83+
git checkout B^0 &&
84+
85+
touch random_file && git add random_file &&
86+
87+
test_must_fail git merge -s resolve C^0
88+
'
89+
90+
test_expect_success 'resolve, non-trivial' '
91+
git reset --hard &&
92+
git checkout B^0 &&
93+
94+
touch random_file && git add random_file &&
95+
96+
test_must_fail git merge -s resolve D^0
97+
'
98+
99+
test_expect_success 'recursive' '
100+
git reset --hard &&
101+
git checkout B^0 &&
102+
103+
touch random_file && git add random_file &&
104+
105+
test_must_fail git merge -s recursive C^0
106+
'
107+
108+
test_expect_success 'octopus, unrelated file touched' '
109+
git reset --hard &&
110+
git checkout B^0 &&
111+
112+
touch random_file && git add random_file &&
113+
114+
test_must_fail git merge C^0 D^0
115+
'
116+
117+
test_expect_success 'octopus, related file removed' '
118+
git reset --hard &&
119+
git checkout B^0 &&
120+
121+
git rm b &&
122+
123+
test_must_fail git merge C^0 D^0
124+
'
125+
126+
test_expect_success 'octopus, related file modified' '
127+
git reset --hard &&
128+
git checkout B^0 &&
129+
130+
echo 12 >>a && git add a &&
131+
132+
test_must_fail git merge C^0 D^0
133+
'
134+
135+
test_expect_success 'ours' '
136+
git reset --hard &&
137+
git checkout B^0 &&
138+
139+
touch random_file && git add random_file &&
140+
141+
test_must_fail git merge -s ours C^0
142+
'
143+
144+
test_expect_success 'subtree' '
145+
git reset --hard &&
146+
git checkout B^0 &&
147+
148+
touch random_file && git add random_file &&
149+
150+
test_must_fail git merge -s subtree E^0
151+
'
152+
153+
test_done

0 commit comments

Comments
 (0)