rebase: teach rebase --keep-base
[git/git.git] / t / t3416-rebase-onto-threedots.sh
1 #!/bin/sh
2
3 test_description='git rebase --onto A...B'
4
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY/lib-rebase.sh"
7
8 # Rebase only the tip commit of "topic" on merge base between "master"
9 # and "topic". Cannot do this for "side" with "master" because there
10 # is no single merge base.
11 #
12 #
13 # F---G topic G'
14 # / /
15 # A---B---C---D---E master --> A---B---C---D---E
16 # \ \ /
17 # \ x
18 # \ / \
19 # H---I---J---K side
20
21 test_expect_success setup '
22 test_commit A &&
23 test_commit B &&
24 git branch side &&
25 test_commit C &&
26 git branch topic &&
27 git checkout side &&
28 test_commit H &&
29 git checkout master &&
30 test_tick &&
31 git merge H &&
32 git tag D &&
33 test_commit E &&
34 git checkout topic &&
35 test_commit F &&
36 test_commit G &&
37 git checkout side &&
38 test_tick &&
39 git merge C &&
40 git tag I &&
41 test_commit J &&
42 test_commit K
43 '
44
45 test_expect_success 'rebase --onto master...topic' '
46 git reset --hard &&
47 git checkout topic &&
48 git reset --hard G &&
49
50 git rebase --onto master...topic F &&
51 git rev-parse HEAD^1 >actual &&
52 git rev-parse C^0 >expect &&
53 test_cmp expect actual
54 '
55
56 test_expect_success 'rebase --onto master...' '
57 git reset --hard &&
58 git checkout topic &&
59 git reset --hard G &&
60
61 git rebase --onto master... F &&
62 git rev-parse HEAD^1 >actual &&
63 git rev-parse C^0 >expect &&
64 test_cmp expect actual
65 '
66
67 test_expect_success 'rebase --onto master...side' '
68 git reset --hard &&
69 git checkout side &&
70 git reset --hard K &&
71
72 test_must_fail git rebase --onto master...side J
73 '
74
75 test_expect_success 'rebase -i --onto master...topic' '
76 git reset --hard &&
77 git checkout topic &&
78 git reset --hard G &&
79 set_fake_editor &&
80 EXPECT_COUNT=1 git rebase -i --onto master...topic F &&
81 git rev-parse HEAD^1 >actual &&
82 git rev-parse C^0 >expect &&
83 test_cmp expect actual
84 '
85
86 test_expect_success 'rebase -i --onto master...' '
87 git reset --hard &&
88 git checkout topic &&
89 git reset --hard G &&
90 set_fake_editor &&
91 EXPECT_COUNT=1 git rebase -i --onto master... F &&
92 git rev-parse HEAD^1 >actual &&
93 git rev-parse C^0 >expect &&
94 test_cmp expect actual
95 '
96
97 test_expect_success 'rebase -i --onto master...side' '
98 git reset --hard &&
99 git checkout side &&
100 git reset --hard K &&
101
102 set_fake_editor &&
103 test_must_fail git rebase -i --onto master...side J
104 '
105
106 test_expect_success 'rebase --keep-base --onto incompatible' '
107 test_must_fail git rebase --keep-base --onto master...
108 '
109
110 test_expect_success 'rebase --keep-base --root incompatible' '
111 test_must_fail git rebase --keep-base --root
112 '
113
114 test_expect_success 'rebase --keep-base master from topic' '
115 git reset --hard &&
116 git checkout topic &&
117 git reset --hard G &&
118
119 git rebase --keep-base master &&
120 git rev-parse C >base.expect &&
121 git merge-base master HEAD >base.actual &&
122 test_cmp base.expect base.actual &&
123
124 git rev-parse HEAD~2 >actual &&
125 git rev-parse C^0 >expect &&
126 test_cmp expect actual
127 '
128
129 test_expect_success 'rebase --keep-base master from side' '
130 git reset --hard &&
131 git checkout side &&
132 git reset --hard K &&
133
134 test_must_fail git rebase --keep-base master
135 '
136
137 test_expect_success 'rebase -i --keep-base master from topic' '
138 git reset --hard &&
139 git checkout topic &&
140 git reset --hard G &&
141
142 set_fake_editor &&
143 EXPECT_COUNT=2 git rebase -i --keep-base master &&
144 git rev-parse C >base.expect &&
145 git merge-base master HEAD >base.actual &&
146 test_cmp base.expect base.actual &&
147
148 git rev-parse HEAD~2 >actual &&
149 git rev-parse C^0 >expect &&
150 test_cmp expect actual
151 '
152
153 test_expect_success 'rebase -i --keep-base master from side' '
154 git reset --hard &&
155 git checkout side &&
156 git reset --hard K &&
157
158 set_fake_editor &&
159 test_must_fail git rebase -i --keep-base master
160 '
161
162 test_done