merge tests: octopus with redundant parents

This happens when git merge is run to merge multiple commits that are
descendants of current HEAD (or are HEAD).  We've hit this while updating
master to origin/master but accidentaly we called (while being on master):

	$ git merge master origin/master

Here is a minimal testcase:

	$ git init a && cd a
	$ echo a >a && git add a
	$ git commit -minitial
	$ echo b >a && git add a
	$ git commit -msecond
	$ git checkout master^

	$ git merge master master
	Fast-forwarding to: master
	Already up-to-date with master
	Merge made by the 'octopus' strategy.
	 a |    2 +-
	  1 files changed, 1 insertions(+), 1 deletions(-)

	$ git cat-file commit HEAD
	tree eebfed94e75e7760540d1485c740902590a00332
	parent bd679e85202280b263e20a57639a142fa14c2c64
	author Michał Kiedrowicz <michal.kiedrowicz@gmail.com> 1329132996 +0100
	committer Michał Kiedrowicz <michal.kiedrowicz@gmail.com> 1329132996 +0100

	Merge branches 'master' and 'master' into HEAD

Signed-off-by: Michał Kiedrowicz <michal.kiedrowicz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michał Kiedrowicz 2012-02-13 12:48:56 +01:00 committed by Junio C Hamano
parent 6eab5f2f14
commit 833abdc932
3 changed files with 39 additions and 7 deletions

View File

@ -16,7 +16,12 @@ test_expect_success setup '
test_tick &&
git commit -m second &&
git tag c1 &&
git branch test
git branch test &&
echo third >file &&
git add file &&
test_tick &&
git commit -m third &&
git tag c2
'
test_expect_success 'merge -s recursive up-to-date' '
@ -74,4 +79,14 @@ test_expect_success 'merge -s subtree up-to-date' '
'
test_expect_failure 'merge fast-forward octopus' '
git reset --hard c0 &&
test_tick &&
git merge c1 c2
expect=$(git rev-parse c2) &&
current=$(git rev-parse HEAD) &&
test "$expect" = "$current"
'
test_done

View File

@ -70,17 +70,15 @@ test_expect_success 'merge output uses pretty names' '
'
cat >expected <<\EOF
Already up-to-date with c4
Trying simple merge with c5
Merge made by the 'octopus' strategy.
Merge made by the 'recursive' strategy.
c5.c | 1 +
1 file changed, 1 insertion(+)
create mode 100644 c5.c
EOF
test_expect_success 'merge up-to-date output uses pretty names' '
git merge c4 c5 >actual &&
test_cmp actual expected
test_expect_failure 'merge reduces irrelevant remote heads' '
GIT_MERGE_VERBOSITY=0 git merge c4 c5 >actual &&
test_cmp expected actual
'
cat >expected <<\EOF

View File

@ -113,4 +113,23 @@ test_expect_success 'verify merge result' '
test $(git rev-parse HEAD^1) = $(git rev-parse E2) &&
test $(git rev-parse HEAD^2) = $(git rev-parse I2)
'
test_expect_success 'fast-forward to redundant refs' '
git reset --hard c0 &&
git merge c4 c5
'
test_expect_failure 'verify merge result' '
test $(git rev-parse HEAD) = $(git rev-parse c5)
'
test_expect_success 'merge up-to-date redundant refs' '
git reset --hard c5 &&
git merge c0 c4
'
test_expect_success 'verify merge result' '
test $(git rev-parse HEAD) = $(git rev-parse c5)
'
test_done