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
|
|
|
|
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
|