diff options
author | Junio C Hamano <junkio@cox.net> | 2007-01-09 20:39:09 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-01-09 20:40:39 -0800 |
commit | bfbbb8f8cf8250718ffd028efe179557d29ae72d (patch) | |
tree | 38c08b88ed30aafebc78d9c363047f33d73c642b | |
parent | git-checkout: safety check for detached HEAD checks existing refs (diff) | |
download | tgif-bfbbb8f8cf8250718ffd028efe179557d29ae72d.tar.xz |
git-checkout: handle local changes sanely when detaching HEAD
When switching branches, we usually first try read-tree to make
sure that we do not lose the local changes and then updated the
HEAD using update-ref. However, we detached and updated HEAD
before these checks, which was quite bad in a repository with
local changes.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-x | git-checkout.sh | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/git-checkout.sh b/git-checkout.sh index dcf6ddbdf1..8f4356d49a 100755 --- a/git-checkout.sh +++ b/git-checkout.sh @@ -150,21 +150,18 @@ fi # correct, it feels somewhat funny. More importantly, we do not # want "git checkout" nor "git checkout -f" to detach HEAD. +detached= +detach_warn= + if test -z "$branch$newbranch" && test "$new" != "$old" then - # NEEDSWORK: we would want to have a command here - # that allows us to detach the HEAD atomically. Perhaps - # something like "git update-ref --detach HEAD $new" - echo "$new" >"$GIT_DIR/HEAD.new" && - mv "$GIT_DIR/HEAD.new" "$GIT_DIR/HEAD" || die "Cannot detach HEAD" - + detached="$new" if test -n "$oldbranch" then - echo >&2 "warning: you are not on ANY branch anymore. + detach_warn="warning: you are not on ANY branch anymore. If you meant to create a new branch from the commit, you need -b to associate a new branch with the wanted checkout. Example: - git checkout -b <new_branch_name> $arg -" + git checkout -b <new_branch_name> $arg" fi elif test -z "$oldbranch" && test -n "$branch" then @@ -258,8 +255,25 @@ if [ "$?" -eq 0 ]; then git-update-ref -m "checkout: Created from $new_name" "refs/heads/$newbranch" $new || exit branch="$newbranch" fi - [ "$branch" ] && - GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD "refs/heads/$branch" + if test -n "$branch" + then + GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD "refs/heads/$branch" + elif test -n "$detached" + then + # NEEDSWORK: we would want a command to detach the HEAD + # atomically, instead of this handcrafted command sequence. + # Perhaps: + # git update-ref --detach HEAD $new + # or something like that... + # + echo "$detached" >"$GIT_DIR/HEAD.new" && + mv "$GIT_DIR/HEAD.new" "$GIT_DIR/HEAD" || + die "Cannot detach HEAD" + if test -n "$detach_warn" + then + echo >&2 "$detach_warn" + fi + fi rm -f "$GIT_DIR/MERGE_HEAD" else exit 1 |