git-commit --amend

The new flag is used to amend the tip of the current branch.  Prepare
the tree object you would want to replace the latest commit as usual
(this includes the usual -i/-o and explicit paths), and the commit log
editor is seeded with the commit message from the tip of the current
branch.  The commit you create replaces the current tip -- if it was a
merge, it will have the parents of the current tip as parents -- so the
current top commit is discarded.

It is a rough equivalent for:

	$ git reset --soft HEAD^
	$ ... do something else to come up with the right tree ...
	$ git commit -c ORIG_HEAD

but can be used to amend a merge commit.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-03-02 21:04:05 -08:00
parent d320a5437f
commit b4019f0456

View File

@ -3,7 +3,7 @@
# Copyright (c) 2005 Linus Torvalds # Copyright (c) 2005 Linus Torvalds
# Copyright (c) 2006 Junio C Hamano # Copyright (c) 2006 Junio C Hamano
USAGE='[-a] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit>] [-e] [--author <author>] [[-i | -o] <path>...]' USAGE='[-a] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit>) [--amend] [-e] [--author <author>] [[-i | -o] <path>...]'
SUBDIRECTORY_OK=Yes SUBDIRECTORY_OK=Yes
. git-sh-setup . git-sh-setup
@ -64,6 +64,22 @@ run_status () {
# We always show status for the whole tree. # We always show status for the whole tree.
cd "$TOP" cd "$TOP"
IS_INITIAL="$initial_commit"
REFERENCE=HEAD
case "$amend" in
t)
# If we are amending the initial commit, there
# is no HEAD^1.
if git-rev-parse --verify "HEAD^1" >/dev/null 2>&1
then
REFERENCE="HEAD^1"
IS_INITIAL=
else
IS_INITIAL=t
fi
;;
esac
# If TMP_INDEX is defined, that means we are doing # If TMP_INDEX is defined, that means we are doing
# "--only" partial commit, and that index file is used # "--only" partial commit, and that index file is used
# to build the tree for the commit. Otherwise, if # to build the tree for the commit. Otherwise, if
@ -85,10 +101,10 @@ run_status () {
*) echo "# On branch $branch" ;; *) echo "# On branch $branch" ;;
esac esac
if test -z "$initial_commit" if test -z "$IS_INITIAL"
then then
git-diff-index -M --cached --name-status \ git-diff-index -M --cached --name-status \
--diff-filter=MDTCRA HEAD | --diff-filter=MDTCRA $REFERENCE |
sed -e ' sed -e '
s/\\/\\\\/g s/\\/\\\\/g
s/ /\\ /g s/ /\\ /g
@ -147,7 +163,7 @@ run_status () {
if test -n "$verbose" if test -n "$verbose"
then then
git-diff-index --cached -M -p --diff-filter=MDTCRA HEAD git-diff-index --cached -M -p --diff-filter=MDTCRA $REFERENCE
fi fi
case "$committable" in case "$committable" in
0) 0)
@ -173,6 +189,7 @@ also=
only= only=
logfile= logfile=
use_commit= use_commit=
amend=
no_edit= no_edit=
log_given= log_given=
log_message= log_message=
@ -254,6 +271,12 @@ do
verify= verify=
shift shift
;; ;;
--a|--am|--ame|--amen|--amend)
amend=t
log_given=t$log_given
use_commit=HEAD
shift
;;
-c) -c)
case "$#" in 1) usage ;; esac case "$#" in 1) usage ;; esac
shift shift
@ -328,6 +351,15 @@ done
################################################################ ################################################################
# Sanity check options # Sanity check options
case "$amend,$initial_commit" in
t,t)
die "You do not have anything to amend." ;;
t,)
if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
die "You are in the middle of a merge -- cannot amend."
fi ;;
esac
case "$log_given" in case "$log_given" in
tt*) tt*)
die "Only one of -c/-C/-F/-m can be used." ;; die "Only one of -c/-C/-F/-m can be used." ;;
@ -559,6 +591,9 @@ if test -z "$initial_commit"
then then
if [ -f "$GIT_DIR/MERGE_HEAD" ]; then if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"` PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
elif test -n "$amend"; then
PARENTS=$(git-cat-file commit HEAD |
sed -n -e '/^$/q' -e 's/^parent /-p /p')
fi fi
else else
if [ -z "$(git-ls-files)" ]; then if [ -z "$(git-ls-files)" ]; then