mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
git-revert: revert an existing commit.
Given one existing commit, revert the change the patch introduces, and record a new commit that records it. This requires your working tree to be clean (no modifications from the HEAD commit). This is based on what Linus posted to the list, with enhancements he suggested, including the use of -M to attempt reverting renames. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
d87449c553
commit
045f82cbee
1
Makefile
1
Makefile
@ -70,6 +70,7 @@ SCRIPTS=git git-apply-patch-script git-merge-one-file-script git-prune-script \
|
||||
|
||||
SCRIPTS += git-count-objects-script
|
||||
# SCRIPTS += git-send-email-script
|
||||
SCRIPTS += git-revert-script
|
||||
|
||||
PROG= git-update-cache git-diff-files git-init-db git-write-tree \
|
||||
git-read-tree git-commit-tree git-cat-file git-fsck-cache \
|
||||
|
37
git-revert-script
Executable file
37
git-revert-script
Executable file
@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
. git-sh-setup-script || die "Not a git archive"
|
||||
|
||||
# We want a clean tree and clean index to be able to revert.
|
||||
status=$(git status)
|
||||
case "$status" in
|
||||
'nothing to commit') ;;
|
||||
*)
|
||||
echo "$status"
|
||||
die "Your working tree is dirty; cannot revert a previous patch." ;;
|
||||
esac
|
||||
|
||||
rev=$(git-rev-parse --no-flags --verify --revs-only "$@") &&
|
||||
commit=$(git-rev-parse --verify "$rev^0") || exit
|
||||
if git-diff-tree -R -M -p $commit | git-apply --index &&
|
||||
msg=$(git-rev-list --pretty=oneline --max-count=1 $commit)
|
||||
then
|
||||
{
|
||||
echo "$msg" | sed -e '
|
||||
s/^[^ ]* /Revert "/
|
||||
s/$/"/'
|
||||
echo
|
||||
echo "This reverts $commit commit."
|
||||
test "$rev" = "$commit" ||
|
||||
echo "(original 'git revert' arguments: $@)"
|
||||
} | git commit -F -
|
||||
else
|
||||
# Now why did it fail?
|
||||
parents=`git-cat-file commit "$commit" 2>/dev/null |
|
||||
sed -ne '/^$/q;/^parent /p' |
|
||||
wc -l`
|
||||
case $parents in
|
||||
0) die "Cannot revert the root commit nor non commit-ish." ;;
|
||||
1) die "The patch does not apply." ;;
|
||||
*) die "Cannot revert a merge commit." ;;
|
||||
esac
|
||||
fi
|
Loading…
Reference in New Issue
Block a user