1 #!/bin/sh
3 test_description='git merge
5 Testing octopus merge when reducing parents to independent branches.'
7 . ./test-lib.sh
9 # 0 - 1
10 # \ 2
11 # \ 3
12 # \ 4 - 5
13 #
14 # So 1, 2, 3 and 5 should be kept, 4 should be avoided.
16 test_expect_success 'setup' '
17 echo c0 > c0.c &&
18 git add c0.c &&
19 git commit -m c0 &&
20 git tag c0 &&
21 echo c1 > c1.c &&
22 git add c1.c &&
23 git commit -m c1 &&
24 git tag c1 &&
25 git reset --hard c0 &&
26 echo c2 > c2.c &&
27 git add c2.c &&
28 git commit -m c2 &&
29 git tag c2 &&
30 git reset --hard c0 &&
31 echo c3 > c3.c &&
32 git add c3.c &&
33 git commit -m c3 &&
34 git tag c3 &&
35 git reset --hard c0 &&
36 echo c4 > c4.c &&
37 git add c4.c &&
38 git commit -m c4 &&
39 git tag c4 &&
40 echo c5 > c5.c &&
41 git add c5.c &&
42 git commit -m c5 &&
43 git tag c5
44 '
46 test_expect_success 'merge c1 with c2, c3, c4, c5' '
47 git reset --hard c1 &&
48 git merge c2 c3 c4 c5 &&
49 test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&
50 test "$(git rev-parse c1)" = "$(git rev-parse HEAD^1)" &&
51 test "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" &&
52 test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&
53 test "$(git rev-parse c5)" = "$(git rev-parse HEAD^4)" &&
54 git diff --exit-code &&
55 test -f c0.c &&
56 test -f c1.c &&
57 test -f c2.c &&
58 test -f c3.c &&
59 test -f c4.c &&
60 test -f c5.c
61 '
63 test_expect_success 'setup' '
64 for i in A B C D E
65 do
66 echo $i > $i.c &&
67 git add $i.c &&
68 git commit -m $i &&
69 git tag $i
70 done &&
71 git reset --hard A &&
72 for i in F G H I
73 do
74 echo $i > $i.c &&
75 git add $i.c &&
76 git commit -m $i &&
77 git tag $i
78 done
79 '
81 test_expect_success 'merge E and I' '
82 git reset --hard A &&
83 git merge E I
84 '
86 test_expect_success 'verify merge result' '
87 test $(git rev-parse HEAD^1) = $(git rev-parse E) &&
88 test $(git rev-parse HEAD^2) = $(git rev-parse I)
89 '
91 test_expect_success 'add conflicts' '
92 git reset --hard E &&
93 echo foo > file.c &&
94 git add file.c &&
95 git commit -m E2 &&
96 git tag E2 &&
97 git reset --hard I &&
98 echo bar >file.c &&
99 git add file.c &&
100 git commit -m I2 &&
101 git tag I2
102 '
104 test_expect_success 'merge E2 and I2, causing a conflict and resolve it' '
105 git reset --hard A &&
106 test_must_fail git merge E2 I2 &&
107 echo baz > file.c &&
108 git add file.c &&
109 git commit -m "resolve conflict"
110 '
112 test_expect_success 'verify merge result' '
113 test $(git rev-parse HEAD^1) = $(git rev-parse E2) &&
114 test $(git rev-parse HEAD^2) = $(git rev-parse I2)
115 '
116 test_done