mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Linus Torvalds](/assets/img/avatar_default.png)
Now that the one-way merge strategy does the right thing wrt files that do not exist in the result, just remove all the random crud we did in "git reset" to do this all by hand. Instead, just pass in "-u" to git-read-tree when we do a hard reset, and depend on git-read-tree to update the working tree appropriately. This basically means that git reset turns into # Always update the HEAD ref git update-ref HEAD "$rev" case "--soft" # do nothing to index/working tree case "--hard" # read index _and_ update working tree git-read-tree --reset -u "$rev" case "--mixed" # update just index, report on working tree differences git-read-tree --reset "$rev" git-update-index --refresh which is what it was always semantically doing, it just did it in a rather strange way because it was written to not expect git-read-tree to do anything to the working tree. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
65 lines
1.4 KiB
Bash
Executable file
65 lines
1.4 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
USAGE='[--mixed | --soft | --hard] [<commit-ish>]'
|
|
. git-sh-setup
|
|
|
|
tmp=${GIT_DIR}/reset.$$
|
|
trap 'rm -f $tmp-*' 0 1 2 3 15
|
|
|
|
update=
|
|
reset_type=--mixed
|
|
case "$1" in
|
|
--mixed | --soft | --hard)
|
|
reset_type="$1"
|
|
shift
|
|
;;
|
|
-*)
|
|
usage ;;
|
|
esac
|
|
|
|
rev=$(git-rev-parse --verify --default HEAD "$@") || exit
|
|
rev=$(git-rev-parse --verify $rev^0) || exit
|
|
|
|
# We need to remember the set of paths that _could_ be left
|
|
# behind before a hard reset, so that we can remove them.
|
|
if test "$reset_type" = "--hard"
|
|
then
|
|
update=-u
|
|
fi
|
|
|
|
# Soft reset does not touch the index file nor 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"
|
|
then
|
|
if test -f "$GIT_DIR/MERGE_HEAD" ||
|
|
test "" != "$(git-ls-files --unmerged)"
|
|
then
|
|
die "Cannot do a soft reset in the middle of a merge."
|
|
fi
|
|
else
|
|
git-read-tree --reset $update "$rev" || exit
|
|
fi
|
|
|
|
# Any resets update HEAD to the head being switched to.
|
|
if orig=$(git-rev-parse --verify HEAD 2>/dev/null)
|
|
then
|
|
echo "$orig" >"$GIT_DIR/ORIG_HEAD"
|
|
else
|
|
rm -f "$GIT_DIR/ORIG_HEAD"
|
|
fi
|
|
git-update-ref HEAD "$rev"
|
|
|
|
case "$reset_type" in
|
|
--hard )
|
|
;; # Nothing else to do
|
|
--soft )
|
|
;; # Nothing else to do
|
|
--mixed )
|
|
# Report what has not been updated.
|
|
git-update-index --refresh
|
|
;;
|
|
esac
|
|
|
|
rm -f "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/rr-cache/MERGE_RR"
|