|  | #!/bin/sh | 
|  |  | 
|  | test_description='cherry picking and reverting a merge | 
|  |  | 
|  | b---c | 
|  | /   / | 
|  | initial---a | 
|  |  | 
|  | ' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  |  | 
|  | >A && | 
|  | >B && | 
|  | git add A B && | 
|  | git commit -m "Initial" && | 
|  | git tag initial && | 
|  | git branch side && | 
|  | echo new line >A && | 
|  | git commit -m "add line to A" A && | 
|  | git tag a && | 
|  | git checkout side && | 
|  | echo new line >B && | 
|  | git commit -m "add line to B" B && | 
|  | git tag b && | 
|  | git checkout master && | 
|  | git merge side && | 
|  | git tag c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'cherry-pick a non-merge with -m should fail' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout a^0 && | 
|  | test_expect_code 128 git cherry-pick -m 1 b && | 
|  | git diff --exit-code a -- | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'cherry pick a merge without -m should fail' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout a^0 && | 
|  | test_must_fail git cherry-pick c && | 
|  | git diff --exit-code a -- | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'cherry pick a merge (1)' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout a^0 && | 
|  | git cherry-pick -m 1 c && | 
|  | git diff --exit-code c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'cherry pick a merge (2)' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout b^0 && | 
|  | git cherry-pick -m 2 c && | 
|  | git diff --exit-code c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'cherry pick a merge relative to nonexistent parent should fail' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout b^0 && | 
|  | test_must_fail git cherry-pick -m 3 c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'revert a non-merge with -m should fail' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout c^0 && | 
|  | test_must_fail git revert -m 1 b && | 
|  | git diff --exit-code c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'revert a merge without -m should fail' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout c^0 && | 
|  | test_must_fail git revert c && | 
|  | git diff --exit-code c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'revert a merge (1)' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout c^0 && | 
|  | git revert -m 1 c && | 
|  | git diff --exit-code a -- | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'revert a merge (2)' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout c^0 && | 
|  | git revert -m 2 c && | 
|  | git diff --exit-code b -- | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'revert a merge relative to nonexistent parent should fail' ' | 
|  |  | 
|  | git reset --hard && | 
|  | git checkout c^0 && | 
|  | test_must_fail git revert -m 3 c && | 
|  | git diff --exit-code c | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_done |