Code

rebase -i: work on a detached HEAD
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Tue, 25 Sep 2007 15:43:15 +0000 (16:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 26 Sep 2007 07:42:17 +0000 (00:42 -0700)
Earlier, rebase -i refused to rebase a detached HEAD.  Now it no longer
does.

Incidentally, this fixes "git gc --auto" shadowing the true exit status.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-rebase--interactive.sh
t/t3404-rebase-interactive.sh

index 8e6e9431e885660cd01ae95c4a13b8bbbf260063..823291d4afbe8571882fd01a614e07dd0439d1c2 100755 (executable)
@@ -317,17 +317,20 @@ do_next () {
        else
                NEWHEAD=$(git rev-parse HEAD)
        fi &&
-       message="$GIT_REFLOG_ACTION: $HEADNAME onto $SHORTONTO)" &&
-       git update-ref -m "$message" $HEADNAME $NEWHEAD $OLDHEAD &&
-       git symbolic-ref HEAD $HEADNAME && {
+       case $HEADNAME in
+       refs/*)
+               message="$GIT_REFLOG_ACTION: $HEADNAME onto $SHORTONTO)" &&
+               git update-ref -m "$message" $HEADNAME $NEWHEAD $OLDHEAD &&
+               git symbolic-ref HEAD $HEADNAME
+               ;;
+       esac && {
                test ! -f "$DOTEST"/verbose ||
                        git diff --stat $(cat "$DOTEST"/head)..HEAD
        } &&
        rm -rf "$DOTEST" &&
+       git gc --auto &&
        warn "Successfully rebased and updated $HEADNAME."
 
-       git gc --auto
-
        exit
 }
 
@@ -367,7 +370,11 @@ do
 
                HEADNAME=$(cat "$DOTEST"/head-name)
                HEAD=$(cat "$DOTEST"/head)
-               git symbolic-ref HEAD $HEADNAME &&
+               case $HEADNAME in
+               refs/*)
+                       git symbolic-ref HEAD $HEADNAME
+                       ;;
+               esac &&
                output git reset --hard $HEAD &&
                rm -rf "$DOTEST"
                exit
@@ -445,8 +452,8 @@ do
                test -z "$ONTO" && ONTO=$UPSTREAM
 
                : > "$DOTEST"/interactive || die "Could not mark as interactive"
-               git symbolic-ref HEAD > "$DOTEST"/head-name ||
-                       die "Could not get HEAD"
+               git symbolic-ref HEAD > "$DOTEST"/head-name 2> /dev/null ||
+                       echo "detached HEAD" > "$DOTEST"/head-name
 
                echo $HEAD > "$DOTEST"/head
                echo $UPSTREAM > "$DOTEST"/upstream
index 1af73a47c6af80c51a6ac6df4c5b20529c1a3565..f2214dd0fa5055ecbd824e41080ec39c25ce57f9 100755 (executable)
@@ -309,4 +309,12 @@ test_expect_success '--continue tries to commit, even for "edit"' '
        test $parent = $(git rev-parse HEAD^)
 '
 
+test_expect_success 'rebase a detached HEAD' '
+       grandparent=$(git rev-parse HEAD~2) &&
+       git checkout $(git rev-parse HEAD) &&
+       test_tick &&
+       FAKE_LINES="2 1" git rebase -i HEAD~2 &&
+       test $grandparent = $(git rev-parse HEAD~2)
+'
+
 test_done