|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2008 Stephen Haberman
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='git rebase preserve merges
|
|
|
|
|
|
|
|
This test runs git rebase with preserve merges and ensures commits
|
|
|
|
dropped by the --cherry-pick flag have their childrens parents
|
|
|
|
rewritten.
|
|
|
|
'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
# set up two branches like this:
|
|
|
|
#
|
|
|
|
# A - B - C - D - E
|
|
|
|
# \
|
|
|
|
# F - G - H
|
|
|
|
# \
|
|
|
|
# I
|
|
|
|
#
|
|
|
|
# where B, D and G touch the same file.
|
|
|
|
|
|
|
|
test_expect_success 'setup' '
|
|
|
|
test_commit A file1 &&
|
|
|
|
test_commit B file1 1 &&
|
|
|
|
test_commit C file2 &&
|
|
|
|
test_commit D file1 2 &&
|
|
|
|
test_commit E file3 &&
|
|
|
|
git checkout A &&
|
|
|
|
test_commit F file4 &&
|
|
|
|
test_commit G file1 3 &&
|
|
|
|
test_commit H file5 &&
|
|
|
|
git checkout F &&
|
|
|
|
test_commit I file6
|
|
|
|
'
|
|
|
|
|
|
|
|
# A - B - C - D - E
|
|
|
|
# \ \ \
|
|
|
|
# F - G - H -- L \ --> L
|
|
|
|
# \ | \
|
|
|
|
# I -- G2 -- J -- K I -- K
|
|
|
|
# G2 = same changes as G
|
|
|
|
test_expect_success 'skip same-resolution merges with -p' '
|
|
|
|
git checkout H &&
|
|
|
|
test_must_fail git merge E &&
|
|
|
|
test_commit L file1 23 &&
|
|
|
|
git checkout I &&
|
|
|
|
test_commit G2 file1 3 &&
|
|
|
|
test_must_fail git merge E &&
|
|
|
|
test_commit J file1 23 &&
|
|
|
|
test_commit K file7 file7 &&
|
|
|
|
git rebase -i -p L &&
|
|
|
|
test $(git rev-parse HEAD^^) = $(git rev-parse L) &&
|
|
|
|
test "23" = "$(cat file1)" &&
|
|
|
|
test "I" = "$(cat file6)" &&
|
|
|
|
test "file7" = "$(cat file7)"
|
|
|
|
'
|
|
|
|
|
|
|
|
# A - B - C - D - E
|
|
|
|
# \ \ \
|
|
|
|
# F - G - H -- L2 \ --> L2
|
|
|
|
# \ | \
|
|
|
|
# I -- G3 --- J2 -- K2 I -- G3 -- K2
|
|
|
|
# G2 = different changes as G
|
|
|
|
test_expect_success 'keep different-resolution merges with -p' '
|
|
|
|
git checkout H &&
|
|
|
|
test_must_fail git merge E &&
|
|
|
|
test_commit L2 file1 23 &&
|
|
|
|
git checkout I &&
|
|
|
|
test_commit G3 file1 4 &&
|
|
|
|
test_must_fail git merge E &&
|
|
|
|
test_commit J2 file1 24 &&
|
|
|
|
test_commit K2 file7 file7 &&
|
|
|
|
test_must_fail git rebase -i -p L2 &&
|
|
|
|
echo 234 > file1 &&
|
|
|
|
git add file1 &&
|
|
|
|
git rebase --continue &&
|
|
|
|
test $(git rev-parse HEAD^^^) = $(git rev-parse L2) &&
|
|
|
|
test "234" = "$(cat file1)" &&
|
|
|
|
test "I" = "$(cat file6)" &&
|
|
|
|
test "file7" = "$(cat file7)"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_done
|