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