git-commit: Allow to amend a merge commit that does not change the tree

Normally, it should not be allowed to generate an empty commit. A merge
commit generated with git 'merge -s ours' does not change the tree (along
the first parent), but merges are not "empty" even if they do not change
the tree. Hence, commit 8588452ceb allowed to amend a merge commit that
does not change the tree, but 4fb5fd5d30 disallowed it again in an
attempt to avoid that an existing commit is amended such that it becomes
empty. With this change, a commit can be edited (create a new one or amend
an existing one) either if there are changes or if there are at least two
parents.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Sixt 2007-12-03 08:24:50 +01:00 коммит произвёл Junio C Hamano
Родитель afcc4f7767
Коммит 13aba1e514
2 изменённых файлов: 38 добавлений и 3 удалений

Просмотреть файл

@ -515,13 +515,16 @@ else
# we need to check if there is anything to commit # we need to check if there is anything to commit
run_status >/dev/null run_status >/dev/null
fi fi
if [ "$?" != "0" -a ! -f "$GIT_DIR/MERGE_HEAD" ] case "$?,$PARENTS" in
then 0,* | *,-p' '?*-p' '?*)
# a merge commit can record the same tree as its parent.
;;
*)
rm -f "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG" rm -f "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG"
use_status_color=t use_status_color=t
run_status run_status
exit 1 exit 1
fi esac
case "$no_edit" in case "$no_edit" in
'') '')

Просмотреть файл

@ -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 test_done