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