-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Junio C Hamano
committed
Aug 10, 2005
1 parent
d87449c
commit 045f82c
Showing
2 changed files
with
38 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |