@@ -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}
153170 finish_rb_merge
154171 exit
155172 fi
156- git am --resolved --3way --resolvemsg=" $RESOLVEMSG "
173+ head_name=$( cat .dotest/head-name) &&
174+ onto=$( cat .dotest/onto) &&
175+ orig_head=$( cat .dotest/orig-head) &&
176+ git am --resolved --3way --resolvemsg=" $RESOLVEMSG " &&
177+ move_to_original_branch
157178 exit
158179 ;;
159180 --skip)
173194 finish_rb_merge
174195 exit
175196 fi
176- git am -3 --skip --resolvemsg=" $RESOLVEMSG "
197+ head_name=$( cat .dotest/head-name) &&
198+ onto=$( cat .dotest/onto) &&
199+ orig_head=$( cat .dotest/orig-head) &&
200+ git am -3 --skip --resolvemsg=" $RESOLVEMSG " &&
201+ move_to_original_branch
177202 exit
178203 ;;
179204 --abort)
180205 git rerere clear
181206 if test -d " $dotest "
182207 then
208+ move_to_original_branch
183209 rm -r " $dotest "
184210 elif test -d .dotest
185211 then
212+ dotest=.dotest
213+ move_to_original_branch
186214 rm -r .dotest
187215 else
188216 die " No rebase in progress?"
@@ -318,6 +346,19 @@ then
318346 GIT_PAGER=' ' git diff --stat --summary " $mb " " $onto "
319347fi
320348
349+ # move to a detached HEAD
350+ orig_head=$( git rev-parse HEAD^0)
351+ head_name=$( git symbolic-ref HEAD 2> /dev/null)
352+ case " $head_name " in
353+ ' ' )
354+ head_name=" detached HEAD"
355+ ;;
356+ * )
357+ git checkout " $orig_head " > /dev/null 2>&1 ||
358+ die " could not detach HEAD"
359+ ;;
360+ esac
361+
321362# Rewind the head to "$onto"; this saves our current head in ORIG_HEAD.
322363echo " First, rewinding head to replay your work on top of it..."
323364git-reset --hard " $onto "
@@ -327,14 +368,21 @@ git-reset --hard "$onto"
327368if test " $mb " = " $branch "
328369then
329370 echo >&2 " Fast-forwarded $branch_name to $onto_name ."
371+ move_to_original_branch
330372 exit 0
331373fi
332374
333375if test -z " $do_merge "
334376then
335377 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 $?
378+ git am $git_am_opt --binary -3 -k --resolvemsg=" $RESOLVEMSG " &&
379+ move_to_original_branch
380+ ret=$?
381+ test 0 ! = $ret -a -d .dotest &&
382+ echo $head_name > .dotest/head-name &&
383+ echo $onto > .dotest/onto &&
384+ echo $orig_head > .dotest/orig-head
385+ exit $ret
338386fi
339387
340388# start doing a rebase with git-merge
343391mkdir -p " $dotest "
344392echo " $onto " > " $dotest /onto"
345393echo " $onto_name " > " $dotest /onto_name"
346- prev_head=` git rev-parse HEAD^0 `
394+ prev_head=$orig_head
347395echo " $prev_head " > " $dotest /prev_head"
396+ echo " $orig_head " > " $dotest /orig-head"
397+ echo " $head_name " > " $dotest /head-name"
348398
349399msgnum=0
350400for cmt in ` git rev-list --reverse --no-merges " $upstream " ..ORIG_HEAD`
0 commit comments