#!/usr/bin/env bash 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:-""} if [ "$undo_cnt" -gt "$ccnt" ]; then echo "Only $ccnt $cstr, cannot undo $undo_cnt" elif [ "$type" = "hard" ] && [ "$ccnt" -eq "$undo_cnt" ]; then echo "Cannot hard undo all commits" elif [ "$type" = "soft" ] && [ "$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 =~ ^[1-9][0-9]*$ ]]; then echo "Invalid undo count: $parm2" exit 1 fi _undo "$parm1" "$parm2" "$parm3"