|  | #!/bin/sh | 
|  |  | 
|  | test_description='git-merge | 
|  |  | 
|  | Do not overwrite changes.' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success 'setup' ' | 
|  | echo c0 > c0.c && | 
|  | git add c0.c && | 
|  | git commit -m c0 && | 
|  | git tag c0 && | 
|  | echo c1 > c1.c && | 
|  | git add c1.c && | 
|  | git commit -m c1 && | 
|  | git tag c1 && | 
|  | git reset --hard c0 && | 
|  | echo c2 > c2.c && | 
|  | git add c2.c && | 
|  | git commit -m c2 && | 
|  | git tag c2 && | 
|  | git reset --hard c1 && | 
|  | echo "c1 a" > c1.c && | 
|  | git add c1.c && | 
|  | git commit -m "c1 a" && | 
|  | git tag c1a && | 
|  | echo "VERY IMPORTANT CHANGES" > important | 
|  | ' | 
|  |  | 
|  | test_expect_success 'will not overwrite untracked file' ' | 
|  | git reset --hard c1 && | 
|  | cat important > c2.c && | 
|  | ! git merge c2 && | 
|  | test_cmp important c2.c | 
|  | ' | 
|  |  | 
|  | test_expect_success 'will not overwrite new file' ' | 
|  | git reset --hard c1 && | 
|  | cat important > c2.c && | 
|  | git add c2.c && | 
|  | ! git merge c2 && | 
|  | test_cmp important c2.c | 
|  | ' | 
|  |  | 
|  | test_expect_success 'will not overwrite staged changes' ' | 
|  | git reset --hard c1 && | 
|  | cat important > c2.c && | 
|  | git add c2.c && | 
|  | rm c2.c && | 
|  | ! git merge c2 && | 
|  | git checkout c2.c && | 
|  | test_cmp important c2.c | 
|  | ' | 
|  |  | 
|  | test_expect_success 'will not overwrite removed file' ' | 
|  | git reset --hard c1 && | 
|  | git rm c1.c && | 
|  | git commit -m "rm c1.c" && | 
|  | cat important > c1.c && | 
|  | ! git merge c1a && | 
|  | test_cmp important c1.c | 
|  | ' | 
|  |  | 
|  | test_expect_success 'will not overwrite re-added file' ' | 
|  | git reset --hard c1 && | 
|  | git rm c1.c && | 
|  | git commit -m "rm c1.c" && | 
|  | cat important > c1.c && | 
|  | git add c1.c && | 
|  | ! git merge c1a && | 
|  | test_cmp important c1.c | 
|  | ' | 
|  |  | 
|  | test_expect_success 'will not overwrite removed file with staged changes' ' | 
|  | git reset --hard c1 && | 
|  | git rm c1.c && | 
|  | git commit -m "rm c1.c" && | 
|  | cat important > c1.c && | 
|  | git add c1.c && | 
|  | rm c1.c && | 
|  | ! git merge c1a && | 
|  | git checkout c1.c && | 
|  | test_cmp important c1.c | 
|  | ' | 
|  |  | 
|  | test_done |