mirror of
https://github.com/tj/git-extras.git
synced 2026-09-10 07:26:17 -04:00
73 lines
1.3 KiB
Bash
Executable file
73 lines
1.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
back="^"
|
|
cstr="commits"
|
|
ccnt=$(git rev-list --count HEAD)
|
|
if [ $ccnt -eq 1 ]; then cstr="commit"; fi
|
|
parm3=""
|
|
|
|
function _undo()
|
|
{
|
|
type=${1:-soft}
|
|
undo_cnt=${2:-1}
|
|
reset=${3:-""}
|
|
echo "type=$type, cnt=$undo_cnt, reset=$reset"
|
|
if [ $undo_cnt -gt $ccnt ]; then
|
|
echo "Only $ccnt $cstr, cannot undo $undo_cnt"
|
|
elif [ "$type" = "hard" -a $ccnt -eq $undo_cnt ]; then
|
|
echo "Cannot hard undo all commits"
|
|
elif [ "$type" = "soft" -a $ccnt -eq 1 ]; then
|
|
git update-ref -d HEAD
|
|
else
|
|
git reset --$type HEAD~$undo_cnt
|
|
fi
|
|
if [ "$reset" != "" ]; then git reset; fi
|
|
}
|
|
|
|
case "$1" in
|
|
-h)
|
|
cat << EOL
|
|
This will erase any changes since your last commit.
|
|
If you want to get help info, run "git undo --help" instead.
|
|
Do you want to continue? [yN]"
|
|
EOL
|
|
read -r res
|
|
case "${res}" in
|
|
"Y" | "y")
|
|
parm1=hard
|
|
parm2=${2:-1}
|
|
;;
|
|
* )
|
|
exit 0
|
|
;;
|
|
esac
|
|
;;
|
|
--hard)
|
|
parm1=hard
|
|
parm2=${2:-1}
|
|
;;
|
|
-s|--soft)
|
|
parm1=soft
|
|
parm2=${2:-1}
|
|
parm3=reset
|
|
;;
|
|
"")
|
|
parm1=soft
|
|
parm2=1
|
|
;;
|
|
*[!0-9]*)
|
|
echo "Invalid parameter: $1"
|
|
exit 1
|
|
;;
|
|
*)
|
|
parm1=soft
|
|
parm2="$1"
|
|
;;
|
|
esac
|
|
|
|
if [[ ! $parm2 =~ [0-9]*([0-9]) ]]; then
|
|
echo "Invalid undo count: $parm2"
|
|
exit 1
|
|
fi
|
|
|
|
_undo $parm1 $parm2 $parm3 |