| #!/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' ' |
| : > file1 && |
| git add file1 && |
| test_tick && |
| git commit -m A && |
| git tag A && |
| echo 1 > file1 && |
| test_tick && |
| git commit -m B file1 && |
| : > file2 && |
| git add file2 && |
| test_tick && |
| git commit -m C && |
| echo 2 > file1 && |
| test_tick && |
| git commit -m D file1 && |
| : > file3 && |
| git add file3 && |
| test_tick && |
| git commit -m E && |
| git tag E && |
| git checkout -b branch1 A && |
| : > file4 && |
| git add file4 && |
| test_tick && |
| git commit -m F && |
| git tag F && |
| echo 3 > file1 && |
| test_tick && |
| git commit -m G file1 && |
| git tag G && |
| : > file5 && |
| git add file5 && |
| test_tick && |
| git commit -m H && |
| git tag H && |
| git checkout -b branch2 F && |
| : > file6 && |
| git add file6 && |
| test_tick && |
| git commit -m I && |
| git tag I |
| ' |
| |
| # 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 branch1 && |
| ! git merge E && |
| echo 23 > file1 && |
| git add file1 && |
| git commit -m L && |
| git checkout branch2 && |
| echo 3 > file1 && |
| git commit -a -m G2 && |
| ! git merge E && |
| echo 23 > file1 && |
| git add file1 && |
| git commit -m J && |
| echo file7 > file7 && |
| git add file7 && |
| git commit -m K && |
| GIT_EDITOR=: git rebase -i -p branch1 && |
| test $(git rev-parse branch2^^) = $(git rev-parse branch1) && |
| test "23" = "$(cat file1)" && |
| test "" = "$(cat file6)" && |
| test "file7" = "$(cat file7)" && |
| |
| git checkout branch1 && |
| git reset --hard H && |
| git checkout branch2 && |
| git reset --hard I |
| ' |
| |
| # A - B - C - D - E |
| # \ \ \ |
| # F - G - H -- L \ --> L |
| # \ | \ |
| # I -- G2 -- J -- K I -- G2 -- K |
| # G2 = different changes as G |
| test_expect_success 'keep different-resolution merges with -p' ' |
| git checkout branch1 && |
| ! git merge E && |
| echo 23 > file1 && |
| git add file1 && |
| git commit -m L && |
| git checkout branch2 && |
| echo 4 > file1 && |
| git commit -a -m G2 && |
| ! git merge E && |
| echo 24 > file1 && |
| git add file1 && |
| git commit -m J && |
| echo file7 > file7 && |
| git add file7 && |
| git commit -m K && |
| ! GIT_EDITOR=: git rebase -i -p branch1 && |
| echo 234 > file1 && |
| git add file1 && |
| GIT_EDITOR=: git rebase --continue && |
| test $(git rev-parse branch2^^^) = $(git rev-parse branch1) && |
| test "234" = "$(cat file1)" && |
| test "" = "$(cat file6)" && |
| test "file7" = "$(cat file7)" && |
| |
| git checkout branch1 && |
| git reset --hard H && |
| git checkout branch2 && |
| git reset --hard I |
| ' |
| |
| test_done |