1#!/bin/sh 2# 3# Copyright (c) 2005, 2006 Linus Torvalds and Junio C Hamano 4# 5USAGE='[--mixed | --soft | --hard] [<commit-ish>] [ [--] <paths>...]' 6SUBDIRECTORY_OK=Yes 7. git-sh-setup 8set_reflog_action "reset $*" 9 10update= reset_type=--mixed 11unsetrev 12 13while case$#in0)break;;esac 14do 15case"$1"in 16--mixed|--soft|--hard) 17 reset_type="$1" 18;; 19--) 20break 21;; 22-*) 23 usage 24;; 25*) 26rev=$(git-rev-parse --verify "$1")||exit 27shift 28break 29;; 30esac 31shift 32done 33 34:${rev=HEAD} 35rev=$(git-rev-parse --verify $rev^0)||exit 36 37# Skip -- in "git reset HEAD -- foo" and "git reset -- foo". 38case"$1"in--)shift;;esac 39 40# git reset --mixed tree [--] paths... can be used to 41# load chosen paths from the tree into the index without 42# affecting the working tree nor HEAD. 43iftest$#!=0 44then 45test"$reset_type"=="--mixed"|| 46 die "Cannot do partial$reset_typereset." 47 git ls-tree -r --full-name$rev--"$@"| 48 git update-index --add --index-info||exit 49 git update-index --refresh 50exit 51fi 52 53TOP=$(git-rev-parse --show-cdup) 54iftest!-z"$TOP" 55then 56cd"$TOP" 57fi 58 59iftest"$reset_type"="--hard" 60then 61 update=-u 62fi 63 64# Soft reset does not touch the index file nor the working tree 65# at all, but requires them in a good order. Other resets reset 66# the index file to the tree object we are switching to. 67iftest"$reset_type"="--soft" 68then 69iftest -f"$GIT_DIR/MERGE_HEAD"|| 70test""!="$(git-ls-files --unmerged)" 71then 72 die "Cannot do a soft reset in the middle of a merge." 73fi 74else 75 git-read-tree --reset$update"$rev"||exit 76fi 77 78# Any resets update HEAD to the head being switched to. 79if orig=$(git-rev-parse --verify HEAD 2>/dev/null) 80then 81echo"$orig">"$GIT_DIR/ORIG_HEAD" 82else 83rm-f"$GIT_DIR/ORIG_HEAD" 84fi 85git-update-ref -m"$GIT_REFLOG_ACTION" HEAD "$rev" 86update_ref_status=$? 87 88case"$reset_type"in 89--hard) 90test$update_ref_status=0&& { 91echo -n"HEAD is now at " 92 GIT_PAGER= git log --max-count=1--pretty=oneline \ 93--abbrev-commit HEAD 94} 95;; 96--soft) 97;;# Nothing else to do 98--mixed) 99# Report what has not been updated. 100 git-update-index --refresh 101;; 102esac 103 104rm-f"$GIT_DIR/MERGE_HEAD""$GIT_DIR/rr-cache/MERGE_RR" \ 105"$GIT_DIR/SQUASH_MSG""$GIT_DIR/MERGE_MSG" 106 107exit$update_ref_status