| #!/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_must_fail 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 |