#!/bin/sh # # Copyright (c) 2005, 2006 Linus Torvalds and Junio C Hamano # setglobal USAGE = ''[--mixed | --soft | --hard] [] [ [--] ...]'' setglobal SUBDIRECTORY_OK = 'Yes' source git-sh-setup set_reflog_action "reset $ifsjoin(Argv)" require_work_tree setglobal update = '', reset_type = '--mixed' unset rev while test $# != 0 { match $1 { with --mixed | --soft | --hard setglobal reset_type = $1 with -- break with -* usage with * setglobal rev = $[git rev-parse --verify $1] || exit shift break } shift } : $(rev=HEAD) setglobal rev = $[git rev-parse --verify $rev^0] || exit # Skip -- in "git reset HEAD -- foo" and "git reset -- foo". match $1 { with -- shift } # git reset --mixed tree [--] paths... can be used to # load chosen paths from the tree into the index without # affecting the working tree or HEAD. if test $Argc != 0 { test $reset_type = "--mixed" || die "Cannot do partial $reset_type reset." git diff-index --cached $rev -- @Argv | sed -e 's/^:\([0-7][0-7]*\) [0-7][0-7]* \([0-9a-f][0-9a-f]*\) [0-9a-f][0-9a-f]* [A-Z] \(.*\)$/\1 \2 \3/' | git update-index --add --remove --index-info || exit git update-index --refresh exit } cd_to_toplevel if test $reset_type = "--hard" { setglobal update = '-u' } # Soft reset does not touch the index file or the working tree # at all, but requires them in a good order. Other resets reset # the index file to the tree object we are switching to. if test $reset_type = "--soft" { if test -f "$GIT_DIR/MERGE_HEAD" || test "" != $[git ls-files --unmerged] { die "Cannot do a soft reset in the middle of a merge." } } else { git read-tree -v --reset $update $rev || exit } # Any resets update HEAD to the head being switched to. if setglobal orig = $[git rev-parse --verify HEAD !2 >/dev/null] { echo $orig >"$GIT_DIR/ORIG_HEAD" } else { rm -f "$GIT_DIR/ORIG_HEAD" } git update-ref -m $GIT_REFLOG_ACTION HEAD $rev setglobal update_ref_status = $Status match $reset_type { with --hard test $update_ref_status = 0 && do { printf "HEAD is now at " env GIT_PAGER= git log --max-count=1 --pretty=oneline \ --abbrev-commit HEAD } with --soft # Nothing else to do with --mixed # Report what has not been updated. git update-index --refresh } rm -f "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/rr-cache/MERGE_RR" \ "$GIT_DIR/SQUASH_MSG" "$GIT_DIR/MERGE_MSG" exit $update_ref_status