diff --git a/git-commit.sh b/git-commit.sh index 485339754c..cef76a7775 100755 --- a/git-commit.sh +++ b/git-commit.sh @@ -515,13 +515,16 @@ else # we need to check if there is anything to commit run_status >/dev/null fi -if [ "$?" != "0" -a ! -f "$GIT_DIR/MERGE_HEAD" ] -then +case "$?,$PARENTS" in +0,* | *,-p' '?*-p' '?*) + # a merge commit can record the same tree as its parent. + ;; +*) rm -f "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG" use_status_color=t run_status exit 1 -fi +esac case "$no_edit" in '') diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh index 31a6f63399..2e7bcb016a 100755 --- a/t/t7501-commit.sh +++ b/t/t7501-commit.sh @@ -244,4 +244,36 @@ test_expect_success 'multiple -m' ' ' +test_expect_success 'same tree (single parent)' ' + + if git commit -m empty + then + echo oops -- should have complained + false + else + : happy + fi + +' + +test_expect_success 'same tree (merge and amend merge)' ' + + git checkout -b side HEAD^ && + echo zero >zero && + git add zero && + git commit -m "add zero" && + git checkout master && + + git merge -s ours side -m "empty ok" && + git diff HEAD^ HEAD >actual && + : >expected && + diff -u expected actual && + + git commit --amend -m "empty really ok" && + git diff HEAD^ HEAD >actual && + : >expected && + diff -u expected actual + +' + test_done