1#!/bin/sh 2 3USAGE='[--mixed | --soft | --hard] [<commit-ish>]' 4. git-sh-setup 5 6tmp=${GIT_DIR}/reset.$$ 7trap'rm -f$tmp-*'0 1 2 3 15 8 9update= 10reset_type=--mixed 11case"$1"in 12--mixed|--soft|--hard) 13 reset_type="$1" 14shift 15;; 16-*) 17 usage ;; 18esac 19 20rev=$(git-rev-parse --verify --default HEAD "$@")||exit 21rev=$(git-rev-parse --verify $rev^0)||exit 22 23# We need to remember the set of paths that _could_ be left 24# behind before a hard reset, so that we can remove them. 25iftest"$reset_type"="--hard" 26then 27 update=-u 28fi 29 30# Soft reset does not touch the index file nor the working tree 31# at all, but requires them in a good order. Other resets reset 32# the index file to the tree object we are switching to. 33iftest"$reset_type"="--soft" 34then 35iftest -f"$GIT_DIR/MERGE_HEAD"|| 36test""!="$(git-ls-files --unmerged)" 37then 38 die "Cannot do a soft reset in the middle of a merge." 39fi 40else 41 git-read-tree --reset$update"$rev"||exit 42fi 43 44# Any resets update HEAD to the head being switched to. 45if orig=$(git-rev-parse --verify HEAD 2>/dev/null) 46then 47echo"$orig">"$GIT_DIR/ORIG_HEAD" 48else 49rm-f"$GIT_DIR/ORIG_HEAD" 50fi 51git-update-ref -m"reset$reset_type$@" HEAD "$rev" 52 53case"$reset_type"in 54--hard) 55;;# Nothing else to do 56--soft) 57;;# Nothing else to do 58--mixed) 59# Report what has not been updated. 60 git-update-index --refresh 61;; 62esac 63 64rm-f"$GIT_DIR/MERGE_HEAD""$GIT_DIR/rr-cache/MERGE_RR"