Linus Torvalds | 40d8cfe | 2005-06-14 18:56:05 -0700 | [diff] [blame] | 1 | #!/bin/sh |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 2 | # |
| 3 | # Copyright (c) 2005, 2006 Linus Torvalds and Junio C Hamano |
| 4 | # |
| 5 | USAGE='[--mixed | --soft | --hard] [<commit-ish>] [ [--] <paths>...]' |
Junio C Hamano | a81c311 | 2006-12-14 00:40:15 -0800 | [diff] [blame] | 6 | SUBDIRECTORY_OK=Yes |
freku045@student.liu.se | 806f36d | 2005-12-13 23:30:31 +0100 | [diff] [blame] | 7 | . git-sh-setup |
Shawn O. Pearce | 42ea5a5 | 2006-12-28 02:34:52 -0500 | [diff] [blame] | 8 | set_reflog_action "reset $*" |
Shawn O. Pearce | 7eff28a | 2006-12-30 23:32:38 -0500 | [diff] [blame] | 9 | require_work_tree |
c.shoemaker@cox.net | 2f9d685 | 2005-10-29 00:16:20 -0400 | [diff] [blame] | 10 | |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 11 | update= reset_type=--mixed |
| 12 | unset rev |
| 13 | |
David Kastrup | 822f7c7 | 2007-09-23 22:42:08 +0200 | [diff] [blame] | 14 | while test $# != 0 |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 15 | do |
| 16 | case "$1" in |
| 17 | --mixed | --soft | --hard) |
| 18 | reset_type="$1" |
| 19 | ;; |
| 20 | --) |
| 21 | break |
| 22 | ;; |
| 23 | -*) |
| 24 | usage |
| 25 | ;; |
| 26 | *) |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 27 | rev=$(git rev-parse --verify "$1") || exit |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 28 | shift |
| 29 | break |
| 30 | ;; |
| 31 | esac |
| 32 | shift |
| 33 | done |
| 34 | |
| 35 | : ${rev=HEAD} |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 36 | rev=$(git rev-parse --verify $rev^0) || exit |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 37 | |
| 38 | # Skip -- in "git reset HEAD -- foo" and "git reset -- foo". |
| 39 | case "$1" in --) shift ;; esac |
| 40 | |
| 41 | # git reset --mixed tree [--] paths... can be used to |
| 42 | # load chosen paths from the tree into the index without |
Justin Lebar | 0168990 | 2014-03-31 15:11:46 -0700 | [diff] [blame] | 43 | # affecting the working tree or HEAD. |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 44 | if test $# != 0 |
| 45 | then |
David Kågedal | a5cd09f | 2007-01-18 12:15:13 +0100 | [diff] [blame] | 46 | test "$reset_type" = "--mixed" || |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 47 | die "Cannot do partial $reset_type reset." |
Junio C Hamano | bc8c029 | 2007-01-05 01:38:56 -0800 | [diff] [blame] | 48 | |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 49 | git diff-index --cached $rev -- "$@" | |
Junio C Hamano | bc8c029 | 2007-01-05 01:38:56 -0800 | [diff] [blame] | 50 | 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/' | |
| 51 | git update-index --add --remove --index-info || exit |
Junio C Hamano | 2ce633b | 2006-12-14 01:19:19 -0800 | [diff] [blame] | 52 | git update-index --refresh |
| 53 | exit |
| 54 | fi |
| 55 | |
Junio C Hamano | 514c09f | 2007-01-12 12:49:05 -0800 | [diff] [blame] | 56 | cd_to_toplevel |
Junio C Hamano | a81c311 | 2006-12-14 00:40:15 -0800 | [diff] [blame] | 57 | |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 58 | if test "$reset_type" = "--hard" |
| 59 | then |
Linus Torvalds | c68998f | 2006-05-14 11:20:37 -0700 | [diff] [blame] | 60 | update=-u |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 61 | fi |
| 62 | |
Justin Lebar | 0168990 | 2014-03-31 15:11:46 -0700 | [diff] [blame] | 63 | # Soft reset does not touch the index file or the working tree |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 64 | # at all, but requires them in a good order. Other resets reset |
| 65 | # the index file to the tree object we are switching to. |
| 66 | if test "$reset_type" = "--soft" |
| 67 | then |
| 68 | if test -f "$GIT_DIR/MERGE_HEAD" || |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 69 | test "" != "$(git ls-files --unmerged)" |
Junio C Hamano | 32173e6 | 2005-08-06 20:59:47 -0700 | [diff] [blame] | 70 | then |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 71 | die "Cannot do a soft reset in the middle of a merge." |
Junio C Hamano | 32173e6 | 2005-08-06 20:59:47 -0700 | [diff] [blame] | 72 | fi |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 73 | else |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 74 | git read-tree -v --reset $update "$rev" || exit |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 75 | fi |
| 76 | |
| 77 | # Any resets update HEAD to the head being switched to. |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 78 | if orig=$(git rev-parse --verify HEAD 2>/dev/null) |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 79 | then |
| 80 | echo "$orig" >"$GIT_DIR/ORIG_HEAD" |
| 81 | else |
| 82 | rm -f "$GIT_DIR/ORIG_HEAD" |
| 83 | fi |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 84 | git update-ref -m "$GIT_REFLOG_ACTION" HEAD "$rev" |
Junio C Hamano | dee4e38 | 2006-07-27 22:27:44 -0700 | [diff] [blame] | 85 | update_ref_status=$? |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 86 | |
| 87 | case "$reset_type" in |
| 88 | --hard ) |
Johannes Schindelin | 95f2fb7 | 2006-12-21 15:26:35 +0100 | [diff] [blame] | 89 | test $update_ref_status = 0 && { |
Jason Riedy | 2aad957 | 2007-01-15 17:31:29 -0800 | [diff] [blame] | 90 | printf "HEAD is now at " |
Johannes Schindelin | 95f2fb7 | 2006-12-21 15:26:35 +0100 | [diff] [blame] | 91 | GIT_PAGER= git log --max-count=1 --pretty=oneline \ |
| 92 | --abbrev-commit HEAD |
| 93 | } |
| 94 | ;; |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 95 | --soft ) |
| 96 | ;; # Nothing else to do |
| 97 | --mixed ) |
| 98 | # Report what has not been updated. |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 99 | git update-index --refresh |
Junio C Hamano | 45d197a | 2005-08-22 17:55:26 -0700 | [diff] [blame] | 100 | ;; |
| 101 | esac |
| 102 | |
Junio C Hamano | 49ed2bc | 2006-12-04 19:44:40 -0800 | [diff] [blame] | 103 | rm -f "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/rr-cache/MERGE_RR" \ |
| 104 | "$GIT_DIR/SQUASH_MSG" "$GIT_DIR/MERGE_MSG" |
Junio C Hamano | dee4e38 | 2006-07-27 22:27:44 -0700 | [diff] [blame] | 105 | |
| 106 | exit $update_ref_status |