Merge branch 'maint'
[gitweb.git] / git-checkout.sh
index ed7c2c5f6aab338c844329e3ae3d9c7ce003680f..33f1e87c0c209b89eb785381db62d826818b602d 100755 (executable)
@@ -63,12 +63,13 @@ while [ "$#" != "0" ]; do
                                echo "unknown flag $arg"
                                exit 1
                        fi
-                       new="$rev"
                        new_name="$arg"
                        if git-show-ref --verify --quiet -- "refs/heads/$arg"
                        then
+                               rev=$(git-rev-parse --verify "refs/heads/$arg^0")
                                branch="$arg"
                        fi
+                       new="$rev"
                elif rev=$(git-rev-parse --verify "$arg^{tree}" 2>/dev/null)
                then
                        # checking out selected paths from a tree-ish.
@@ -210,7 +211,7 @@ else
        esac
 
        # Match the index to the working tree, and do a three-way.
-       git diff-files --name-only | git update-index --remove --stdin &&
+       git diff-files --name-only | git update-index --remove --stdin &&
        work=`git write-tree` &&
        git read-tree $v --reset -u $new || exit
 
@@ -245,7 +246,7 @@ else
     (exit $saved_err)
 fi
 
-# 
+#
 # Switch the HEAD pointer to the new branch if we
 # checked out a branch head, and remove any potential
 # old MERGE_HEAD's (subsequent commits will clearly not
@@ -270,15 +271,7 @@ if [ "$?" -eq 0 ]; then
                fi
        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...
-               #
-               git-rev-parse HEAD >"$GIT_DIR/HEAD.new" &&
-               mv "$GIT_DIR/HEAD.new" "$GIT_DIR/HEAD" &&
-               git-update-ref -m "checkout: moving to $arg" HEAD "$detached" ||
+               git-update-ref --no-deref -m "checkout: moving to $arg" HEAD "$detached" ||
                        die "Cannot detach HEAD"
                if test -n "$detach_warn"
                then