|  | #!/bin/sh | 
|  |  | 
|  | test_description="merges with unrelated index changes" | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | # Testcase for some simple merges | 
|  | #   A | 
|  | #   o-------o B | 
|  | #    \ | 
|  | #     \-----o C | 
|  | #      \ | 
|  | #       \---o D | 
|  | #        \ | 
|  | #         \-o E | 
|  | #          \ | 
|  | #           o F | 
|  | #   Commit A: some file a | 
|  | #   Commit B: adds file b, modifies end of a | 
|  | #   Commit C: adds file c | 
|  | #   Commit D: adds file d, modifies beginning of a | 
|  | #   Commit E: renames a->subdir/a, adds subdir/e | 
|  | #   Commit F: empty commit | 
|  |  | 
|  | test_expect_success 'setup trivial merges' ' | 
|  | test_seq 1 10 >a && | 
|  | git add a && | 
|  | test_tick && git commit -m A && | 
|  |  | 
|  | git branch A && | 
|  | git branch B && | 
|  | git branch C && | 
|  | git branch D && | 
|  | git branch E && | 
|  | git branch F && | 
|  |  | 
|  | git checkout B && | 
|  | echo b >b && | 
|  | echo 11 >>a && | 
|  | git add a b && | 
|  | test_tick && git commit -m B && | 
|  |  | 
|  | git checkout C && | 
|  | echo c >c && | 
|  | git add c && | 
|  | test_tick && git commit -m C && | 
|  |  | 
|  | git checkout D && | 
|  | test_seq 2 10 >a && | 
|  | echo d >d && | 
|  | git add a d && | 
|  | test_tick && git commit -m D && | 
|  |  | 
|  | git checkout E && | 
|  | mkdir subdir && | 
|  | git mv a subdir/a && | 
|  | echo e >subdir/e && | 
|  | git add subdir && | 
|  | test_tick && git commit -m E && | 
|  |  | 
|  | git checkout F && | 
|  | test_tick && git commit --allow-empty -m F | 
|  | ' | 
|  |  | 
|  | test_expect_success 'ff update' ' | 
|  | git reset --hard && | 
|  | git checkout A^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | git merge E^0 && | 
|  |  | 
|  | test_must_fail git rev-parse HEAD:random_file && | 
|  | test "$(git diff --name-only --cached E)" = "random_file" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'ff update, important file modified' ' | 
|  | git reset --hard && | 
|  | git checkout A^0 && | 
|  |  | 
|  | mkdir subdir && | 
|  | touch subdir/e && | 
|  | git add subdir/e && | 
|  |  | 
|  | test_must_fail git merge E^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'resolve, trivial' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge -s resolve C^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'resolve, non-trivial' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge -s resolve D^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'recursive' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge -s recursive C^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'recursive, when merge branch matches merge base' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge -s recursive F^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'merge-recursive, when index==head but head!=HEAD' ' | 
|  | git reset --hard && | 
|  | git checkout C^0 && | 
|  |  | 
|  | # Make index match B | 
|  | git diff C B -- | git apply --cached && | 
|  | # Merge B & F, with B as "head" | 
|  | git merge-recursive A -- B F > out && | 
|  | test_i18ngrep "Already up to date" out | 
|  | ' | 
|  |  | 
|  | test_expect_success 'recursive, when file has staged changes not matching HEAD nor what a merge would give' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | mkdir subdir && | 
|  | test_seq 1 10 >subdir/a && | 
|  | git add subdir/a && | 
|  |  | 
|  | # We have staged changes; merge should error out | 
|  | test_must_fail git merge -s recursive E^0 2>err && | 
|  | test_i18ngrep "changes to the following files would be overwritten" err | 
|  | ' | 
|  |  | 
|  | test_expect_success 'recursive, when file has staged changes matching what a merge would give' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | mkdir subdir && | 
|  | test_seq 1 11 >subdir/a && | 
|  | git add subdir/a && | 
|  |  | 
|  | # We have staged changes; merge should error out | 
|  | test_must_fail git merge -s recursive E^0 2>err && | 
|  | test_i18ngrep "changes to the following files would be overwritten" err | 
|  | ' | 
|  |  | 
|  | test_expect_success 'octopus, unrelated file touched' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge C^0 D^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'octopus, related file removed' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | git rm b && | 
|  |  | 
|  | test_must_fail git merge C^0 D^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'octopus, related file modified' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | echo 12 >>a && git add a && | 
|  |  | 
|  | test_must_fail git merge C^0 D^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'ours' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge -s ours C^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_expect_success 'subtree' ' | 
|  | git reset --hard && | 
|  | git checkout B^0 && | 
|  |  | 
|  | touch random_file && git add random_file && | 
|  |  | 
|  | test_must_fail git merge -s subtree E^0 && | 
|  | test_path_is_missing .git/MERGE_HEAD | 
|  | ' | 
|  |  | 
|  | test_done |