git-reset.shon commit Merge branch 'js/cvs' (922819c)
   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"
  14        shift
  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.
  29if test "$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.
  37if test "$reset_type" = "--soft"
  38then
  39        if test -f "$GIT_DIR/MERGE_HEAD" ||
  40           test "" != "$(git-ls-files --unmerged)"
  41        then
  42                die "Cannot do a soft reset in the middle of a merge."
  43        fi
  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
  51        echo "$orig" >"$GIT_DIR/ORIG_HEAD"
  52else
  53        rm -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