]>
Commit | Line | Data |
---|---|---|
40d8cfe4 | 1 | #!/bin/sh |
45d197a4 | 2 | |
806f36d4 FK |
3 | USAGE='[--mixed | --soft | --hard] [<commit-ish>]' |
4 | . git-sh-setup | |
2f9d685c | 5 | |
6ff0b1c5 | 6 | tmp=${GIT_DIR}/reset.$$ |
45d197a4 JH |
7 | trap 'rm -f $tmp-*' 0 1 2 3 15 |
8 | ||
c68998f5 | 9 | update= |
45d197a4 JH |
10 | reset_type=--mixed |
11 | case "$1" in | |
12 | --mixed | --soft | --hard) | |
13 | reset_type="$1" | |
14 | shift | |
15 | ;; | |
2f9d685c CS |
16 | -*) |
17 | usage ;; | |
45d197a4 JH |
18 | esac |
19 | ||
ac83aa2e JH |
20 | case $# in |
21 | 0) rev=HEAD ;; | |
22 | 1) rev=$(git-rev-parse --verify "$1") || exit ;; | |
23 | *) usage ;; | |
24 | esac | |
2ad77e67 | 25 | rev=$(git-rev-parse --verify $rev^0) || exit |
45d197a4 JH |
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. | |
29 | if test "$reset_type" = "--hard" | |
30 | then | |
c68998f5 | 31 | update=-u |
45d197a4 JH |
32 | fi |
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. | |
37 | if test "$reset_type" = "--soft" | |
38 | then | |
39 | if test -f "$GIT_DIR/MERGE_HEAD" || | |
40 | test "" != "$(git-ls-files --unmerged)" | |
32173e69 | 41 | then |
45d197a4 | 42 | die "Cannot do a soft reset in the middle of a merge." |
32173e69 | 43 | fi |
45d197a4 | 44 | else |
c68998f5 | 45 | git-read-tree --reset $update "$rev" || exit |
45d197a4 JH |
46 | fi |
47 | ||
48 | # Any resets update HEAD to the head being switched to. | |
49 | if orig=$(git-rev-parse --verify HEAD 2>/dev/null) | |
50 | then | |
51 | echo "$orig" >"$GIT_DIR/ORIG_HEAD" | |
52 | else | |
53 | rm -f "$GIT_DIR/ORIG_HEAD" | |
54 | fi | |
dee4e384 JH |
55 | git-update-ref -m "reset $reset_type $*" HEAD "$rev" |
56 | update_ref_status=$? | |
45d197a4 JH |
57 | |
58 | case "$reset_type" in | |
59 | --hard ) | |
c68998f5 | 60 | ;; # Nothing else to do |
45d197a4 JH |
61 | --soft ) |
62 | ;; # Nothing else to do | |
63 | --mixed ) | |
64 | # Report what has not been updated. | |
215a7ad1 | 65 | git-update-index --refresh |
45d197a4 JH |
66 | ;; |
67 | esac | |
68 | ||
7d0c6887 | 69 | rm -f "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/rr-cache/MERGE_RR" "$GIT_DIR/SQUASH_MSG" |
dee4e384 JH |
70 | |
71 | exit $update_ref_status |