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