@@ -87,7 +87,7 @@ call_merge () {
8787 cmt=" $( cat " $dotest /cmt.$1 " ) "
8888 echo " $cmt " > " $dotest /current"
8989 hd=$( git rev-parse --verify HEAD)
90- cmt_name=$( git symbolic-ref HEAD)
90+ cmt_name=$( git symbolic-ref HEAD 2> /dev/null || echo HEAD )
9191 msgnum=$( cat " $dotest /msgnum" )
9292 end=$( cat " $dotest /end" )
9393 eval GITHEAD_$cmt =' "${cmt_name##refs/heads/}~$(($end - $msgnum))"'
@@ -115,7 +115,24 @@ call_merge () {
115115 esac
116116}
117117
118+ move_to_original_branch () {
119+ test -z " $head_name " &&
120+ head_name=" $( cat " $dotest " /head-name) " &&
121+ onto=" $( cat " $dotest " /onto) " &&
122+ orig_head=" $( cat " $dotest " /orig-head) "
123+ case " $head_name " in
124+ refs/* )
125+ message=" rebase finished: $head_name onto $onto "
126+ git update-ref -m " $message " \
127+ $head_name $( git rev-parse HEAD) $orig_head &&
128+ git symbolic-ref HEAD $head_name ||
129+ die " Could not move back to $head_name "
130+ ;;
131+ esac
132+ }
133+
118134finish_rb_merge () {
135+ move_to_original_branch
119136 rm -r " $dotest "
120137 echo " All done."
121138}
173190 finish_rb_merge
174191 exit
175192 fi
176- git am -3 --skip --resolvemsg=" $RESOLVEMSG "
193+ head_name=$( cat .dotest/head-name) &&
194+ onto=$( cat .dotest/onto) &&
195+ orig_head=$( cat .dotest/orig-head) &&
196+ git am -3 --skip --resolvemsg=" $RESOLVEMSG " &&
197+ move_to_original_branch
177198 exit
178199 ;;
179200 --abort)
180201 git rerere clear
181202 if test -d " $dotest "
182203 then
204+ move_to_original_branch
183205 rm -r " $dotest "
184206 elif test -d .dotest
185207 then
208+ dotest=.dotest
209+ move_to_original_branch
186210 rm -r .dotest
187211 else
188212 die " No rebase in progress?"
@@ -318,6 +342,19 @@ then
318342 GIT_PAGER=' ' git diff --stat --summary " $mb " " $onto "
319343fi
320344
345+ # move to a detached HEAD
346+ orig_head=$( git rev-parse HEAD^0)
347+ head_name=$( git symbolic-ref HEAD 2> /dev/null)
348+ case " $head_name " in
349+ ' ' )
350+ head_name=" detached HEAD"
351+ ;;
352+ * )
353+ git checkout " $orig_head " > /dev/null 2>&1 ||
354+ die " could not detach HEAD"
355+ ;;
356+ esac
357+
321358# Rewind the head to "$onto"; this saves our current head in ORIG_HEAD.
322359echo " First, rewinding head to replay your work on top of it..."
323360git-reset --hard " $onto "
@@ -327,14 +364,21 @@ git-reset --hard "$onto"
327364if test " $mb " = " $branch "
328365then
329366 echo >&2 " Fast-forwarded $branch_name to $onto_name ."
367+ move_to_original_branch
330368 exit 0
331369fi
332370
333371if test -z " $do_merge "
334372then
335373 git format-patch -k --stdout --full-index --ignore-if-in-upstream " $upstream " ..ORIG_HEAD |
336- git am $git_am_opt --binary -3 -k --resolvemsg=" $RESOLVEMSG "
337- exit $?
374+ git am $git_am_opt --binary -3 -k --resolvemsg=" $RESOLVEMSG " &&
375+ move_to_original_branch
376+ ret=$?
377+ test 0 ! = $ret -a -d .dotest &&
378+ echo $head_name > .dotest/head-name &&
379+ echo $onto > .dotest/onto &&
380+ echo $orig_head > .dotest/orig-head
381+ exit $ret
338382fi
339383
340384# start doing a rebase with git-merge
343387mkdir -p " $dotest "
344388echo " $onto " > " $dotest /onto"
345389echo " $onto_name " > " $dotest /onto_name"
346- prev_head=` git rev-parse HEAD^0 `
390+ prev_head=$orig_head
347391echo " $prev_head " > " $dotest /prev_head"
392+ echo " $orig_head " > " $dotest /orig-head"
393+ echo " $head_name " > " $dotest /head-name"
348394
349395msgnum=0
350396for cmt in ` git rev-list --reverse --no-merges " $upstream " ..ORIG_HEAD`
0 commit comments