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