rebase -i: remove git-rebase--interactive.sh
[git] / git-rebase.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2005 Junio C Hamano.
4 #
5
6 SUBDIRECTORY_OK=Yes
7 OPTIONS_KEEPDASHDASH=
8 OPTIONS_STUCKLONG=t
9 OPTIONS_SPEC="\
10 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
11 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
12 git rebase --continue | --abort | --skip | --edit-todo
13 --
14  Available options are
15 v,verbose!         display a diffstat of what changed upstream
16 q,quiet!           be quiet. implies --no-stat
17 autostash          automatically stash/stash pop before and after
18 fork-point         use 'merge-base --fork-point' to refine upstream
19 onto=!             rebase onto given branch instead of upstream
20 r,rebase-merges?   try to rebase merges instead of skipping them
21 p,preserve-merges! try to recreate merges instead of ignoring them
22 s,strategy=!       use the given merge strategy
23 no-ff!             cherry-pick all commits, even if unchanged
24 m,merge!           use merging strategies to rebase
25 i,interactive!     let the user edit the list of commits to rebase
26 x,exec=!           add exec lines after each commit of the editable list
27 k,keep-empty       preserve empty commits during rebase
28 allow-empty-message allow rebasing commits with empty messages
29 f,force-rebase!    force rebase even if branch is up to date
30 X,strategy-option=! pass the argument through to the merge strategy
31 stat!              display a diffstat of what changed upstream
32 n,no-stat!         do not show diffstat of what changed upstream
33 verify             allow pre-rebase hook to run
34 rerere-autoupdate  allow rerere to update index with resolved conflicts
35 root!              rebase all reachable commits up to the root(s)
36 autosquash         move commits that begin with squash!/fixup! under -i
37 committer-date-is-author-date! passed to 'git am'
38 ignore-date!       passed to 'git am'
39 signoff            passed to 'git am'
40 whitespace=!       passed to 'git apply'
41 ignore-whitespace! passed to 'git apply'
42 C=!                passed to 'git apply'
43 S,gpg-sign?        GPG-sign commits
44  Actions:
45 continue!          continue
46 abort!             abort and check out the original branch
47 skip!              skip current patch and continue
48 edit-todo!         edit the todo list during an interactive rebase
49 quit!              abort but keep HEAD where it is
50 show-current-patch! show the patch file being applied or merged
51 "
52 . git-sh-setup
53 set_reflog_action rebase
54 require_work_tree_exists
55 cd_to_toplevel
56
57 LF='
58 '
59 ok_to_skip_pre_rebase=
60 resolvemsg="
61 $(gettext 'Resolve all conflicts manually, mark them as resolved with
62 "git add/rm <conflicted_files>", then run "git rebase --continue".
63 You can instead skip this commit: run "git rebase --skip".
64 To abort and get back to the state before "git rebase", run "git rebase --abort".')
65 "
66 squash_onto=
67 unset onto
68 unset restrict_revision
69 cmd=
70 strategy=
71 strategy_opts=
72 do_merge=
73 merge_dir="$GIT_DIR"/rebase-merge
74 apply_dir="$GIT_DIR"/rebase-apply
75 verbose=
76 diffstat=
77 test "$(git config --bool rebase.stat)" = true && diffstat=t
78 autostash="$(git config --bool rebase.autostash || echo false)"
79 fork_point=auto
80 git_am_opt=
81 git_format_patch_opt=
82 rebase_root=
83 force_rebase=
84 allow_rerere_autoupdate=
85 # Non-empty if a rebase was in progress when 'git rebase' was invoked
86 in_progress=
87 # One of {am, merge, interactive}
88 type=
89 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
90 state_dir=
91 # One of {'', continue, skip, abort}, as parsed from command line
92 action=
93 rebase_merges=
94 rebase_cousins=
95 preserve_merges=
96 autosquash=
97 keep_empty=
98 allow_empty_message=
99 signoff=
100 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
101 case "$(git config --bool commit.gpgsign)" in
102 true)   gpg_sign_opt=-S ;;
103 *)      gpg_sign_opt= ;;
104 esac
105
106 read_basic_state () {
107         test -f "$state_dir/head-name" &&
108         test -f "$state_dir/onto" &&
109         head_name=$(cat "$state_dir"/head-name) &&
110         onto=$(cat "$state_dir"/onto) &&
111         # We always write to orig-head, but interactive rebase used to write to
112         # head. Fall back to reading from head to cover for the case that the
113         # user upgraded git with an ongoing interactive rebase.
114         if test -f "$state_dir"/orig-head
115         then
116                 orig_head=$(cat "$state_dir"/orig-head)
117         else
118                 orig_head=$(cat "$state_dir"/head)
119         fi &&
120         GIT_QUIET=$(cat "$state_dir"/quiet) &&
121         test -f "$state_dir"/verbose && verbose=t
122         test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
123         test -f "$state_dir"/strategy_opts &&
124                 strategy_opts="$(cat "$state_dir"/strategy_opts)"
125         test -f "$state_dir"/allow_rerere_autoupdate &&
126                 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
127         test -f "$state_dir"/gpg_sign_opt &&
128                 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
129         test -f "$state_dir"/signoff && {
130                 signoff="$(cat "$state_dir"/signoff)"
131                 force_rebase=t
132         }
133 }
134
135 write_basic_state () {
136         echo "$head_name" > "$state_dir"/head-name &&
137         echo "$onto" > "$state_dir"/onto &&
138         echo "$orig_head" > "$state_dir"/orig-head &&
139         echo "$GIT_QUIET" > "$state_dir"/quiet &&
140         test t = "$verbose" && : > "$state_dir"/verbose
141         test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
142         test -n "$strategy_opts" && echo "$strategy_opts" > \
143                 "$state_dir"/strategy_opts
144         test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
145                 "$state_dir"/allow_rerere_autoupdate
146         test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
147         test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
148 }
149
150 output () {
151         case "$verbose" in
152         '')
153                 output=$("$@" 2>&1 )
154                 status=$?
155                 test $status != 0 && printf "%s\n" "$output"
156                 return $status
157                 ;;
158         *)
159                 "$@"
160                 ;;
161         esac
162 }
163
164 move_to_original_branch () {
165         case "$head_name" in
166         refs/*)
167                 message="rebase finished: $head_name onto $onto"
168                 git update-ref -m "$message" \
169                         $head_name $(git rev-parse HEAD) $orig_head &&
170                 git symbolic-ref \
171                         -m "rebase finished: returning to $head_name" \
172                         HEAD $head_name ||
173                 die "$(eval_gettext "Could not move back to \$head_name")"
174                 ;;
175         esac
176 }
177
178 apply_autostash () {
179         if test -f "$state_dir/autostash"
180         then
181                 stash_sha1=$(cat "$state_dir/autostash")
182                 if git stash apply $stash_sha1 >/dev/null 2>&1
183                 then
184                         echo "$(gettext 'Applied autostash.')" >&2
185                 else
186                         git stash store -m "autostash" -q $stash_sha1 ||
187                         die "$(eval_gettext "Cannot store \$stash_sha1")"
188                         gettext 'Applying autostash resulted in conflicts.
189 Your changes are safe in the stash.
190 You can run "git stash pop" or "git stash drop" at any time.
191 ' >&2
192                 fi
193         fi
194 }
195
196 finish_rebase () {
197         rm -f "$(git rev-parse --git-path REBASE_HEAD)"
198         apply_autostash &&
199         { git gc --auto || true; } &&
200         rm -rf "$state_dir"
201 }
202
203 run_interactive () {
204         GIT_CHERRY_PICK_HELP="$resolvemsg"
205         export GIT_CHERRY_PICK_HELP
206
207         test -n "$keep_empty" && keep_empty="--keep-empty"
208         test -n "$rebase_merges" && rebase_merges="--rebase-merges"
209         test -n "$rebase_cousins" && rebase_cousins="--rebase-cousins"
210         test -n "$autosquash" && autosquash="--autosquash"
211         test -n "$verbose" && verbose="--verbose"
212         test -n "$force_rebase" && force_rebase="--no-ff"
213         test -n "$restrict_revision" && \
214                 restrict_revision="--restrict-revision=^$restrict_revision"
215         test -n "$upstream" && upstream="--upstream=$upstream"
216         test -n "$onto" && onto="--onto=$onto"
217         test -n "$squash_onto" && squash_onto="--squash-onto=$squash_onto"
218         test -n "$onto_name" && onto_name="--onto-name=$onto_name"
219         test -n "$head_name" && head_name="--head-name=$head_name"
220         test -n "$strategy" && strategy="--strategy=$strategy"
221         test -n "$strategy_opts" && strategy_opts="--strategy-opts=$strategy_opts"
222         test -n "$switch_to" && switch_to="--switch-to=$switch_to"
223         test -n "$cmd" && cmd="--cmd=$cmd"
224         test -n "$action" && action="--$action"
225
226         exec git rebase--interactive "$action" "$keep_empty" "$rebase_merges" "$rebase_cousins" \
227                 "$upstream" "$onto" "$squash_onto" "$restrict_revision" \
228                 "$allow_empty_message" "$autosquash" "$verbose" \
229                 "$force_rebase" "$onto_name" "$head_name" "$strategy" \
230                 "$strategy_opts" "$cmd" "$switch_to" \
231                 "$allow_rerere_autoupdate" "$gpg_sign_opt" "$signoff"
232 }
233
234 run_specific_rebase () {
235         if [ "$interactive_rebase" = implied ]; then
236                 GIT_EDITOR=:
237                 export GIT_EDITOR
238                 autosquash=
239         fi
240
241         if test -n "$interactive_rebase" -a -z "$preserve_merges"
242         then
243                 run_interactive
244         else
245                 . git-rebase--$type
246
247                 if test -z "$preserve_merges"
248                 then
249                         git_rebase__$type
250                 else
251                         git_rebase__preserve_merges
252                 fi
253         fi
254
255         ret=$?
256         if test $ret -eq 0
257         then
258                 finish_rebase
259         elif test $ret -eq 2 # special exit status for rebase -p
260         then
261                 apply_autostash &&
262                 rm -rf "$state_dir" &&
263                 die "Nothing to do"
264         fi
265         exit $ret
266 }
267
268 run_pre_rebase_hook () {
269         if test -z "$ok_to_skip_pre_rebase" &&
270            test -x "$(git rev-parse --git-path hooks/pre-rebase)"
271         then
272                 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
273                 die "$(gettext "The pre-rebase hook refused to rebase.")"
274         fi
275 }
276
277 test -f "$apply_dir"/applying &&
278         die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"
279
280 if test -d "$apply_dir"
281 then
282         type=am
283         state_dir="$apply_dir"
284 elif test -d "$merge_dir"
285 then
286         if test -d "$merge_dir"/rewritten
287         then
288                 type=preserve-merges
289                 interactive_rebase=explicit
290                 preserve_merges=t
291         elif test -f "$merge_dir"/interactive
292         then
293                 type=interactive
294                 interactive_rebase=explicit
295         else
296                 type=merge
297         fi
298         state_dir="$merge_dir"
299 fi
300 test -n "$type" && in_progress=t
301
302 total_argc=$#
303 while test $# != 0
304 do
305         case "$1" in
306         --no-verify)
307                 ok_to_skip_pre_rebase=yes
308                 ;;
309         --verify)
310                 ok_to_skip_pre_rebase=
311                 ;;
312         --continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
313                 test $total_argc -eq 2 || usage
314                 action=${1##--}
315                 ;;
316         --onto=*)
317                 onto="${1#--onto=}"
318                 ;;
319         --exec=*)
320                 cmd="${cmd}exec ${1#--exec=}${LF}"
321                 test -z "$interactive_rebase" && interactive_rebase=implied
322                 ;;
323         --interactive)
324                 interactive_rebase=explicit
325                 ;;
326         --keep-empty)
327                 keep_empty=yes
328                 ;;
329         --allow-empty-message)
330                 allow_empty_message=--allow-empty-message
331                 ;;
332         --no-keep-empty)
333                 keep_empty=
334                 ;;
335         --rebase-merges)
336                 rebase_merges=t
337                 test -z "$interactive_rebase" && interactive_rebase=implied
338                 ;;
339         --rebase-merges=*)
340                 rebase_merges=t
341                 case "${1#*=}" in
342                 rebase-cousins) rebase_cousins=t;;
343                 no-rebase-cousins) rebase_cousins=;;
344                 *) die "Unknown mode: $1";;
345                 esac
346                 test -z "$interactive_rebase" && interactive_rebase=implied
347                 ;;
348         --preserve-merges)
349                 preserve_merges=t
350                 test -z "$interactive_rebase" && interactive_rebase=implied
351                 ;;
352         --autosquash)
353                 autosquash=t
354                 ;;
355         --no-autosquash)
356                 autosquash=
357                 ;;
358         --fork-point)
359                 fork_point=t
360                 ;;
361         --no-fork-point)
362                 fork_point=
363                 ;;
364         --merge)
365                 do_merge=t
366                 ;;
367         --strategy-option=*)
368                 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}" | sed -e s/^.//)"
369                 do_merge=t
370                 test -z "$strategy" && strategy=recursive
371                 ;;
372         --strategy=*)
373                 strategy="${1#--strategy=}"
374                 do_merge=t
375                 ;;
376         --no-stat)
377                 diffstat=
378                 ;;
379         --stat)
380                 diffstat=t
381                 ;;
382         --autostash)
383                 autostash=true
384                 ;;
385         --no-autostash)
386                 autostash=false
387                 ;;
388         --verbose)
389                 verbose=t
390                 diffstat=t
391                 GIT_QUIET=
392                 ;;
393         --quiet)
394                 GIT_QUIET=t
395                 git_am_opt="$git_am_opt -q"
396                 verbose=
397                 diffstat=
398                 ;;
399         --whitespace=*)
400                 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
401                 case "${1#--whitespace=}" in
402                 fix|strip)
403                         force_rebase=t
404                         ;;
405                 esac
406                 ;;
407         --ignore-whitespace)
408                 git_am_opt="$git_am_opt $1"
409                 ;;
410         --signoff)
411                 signoff=--signoff
412                 ;;
413         --no-signoff)
414                 signoff=
415                 ;;
416         --committer-date-is-author-date|--ignore-date)
417                 git_am_opt="$git_am_opt $1"
418                 force_rebase=t
419                 ;;
420         -C*)
421                 git_am_opt="$git_am_opt $1"
422                 ;;
423         --root)
424                 rebase_root=t
425                 ;;
426         --force-rebase|--no-ff)
427                 force_rebase=t
428                 ;;
429         --rerere-autoupdate|--no-rerere-autoupdate)
430                 allow_rerere_autoupdate="$1"
431                 ;;
432         --gpg-sign)
433                 gpg_sign_opt=-S
434                 ;;
435         --gpg-sign=*)
436                 gpg_sign_opt="-S${1#--gpg-sign=}"
437                 ;;
438         --)
439                 shift
440                 break
441                 ;;
442         *)
443                 usage
444                 ;;
445         esac
446         shift
447 done
448 test $# -gt 2 && usage
449
450 if test -n "$action"
451 then
452         test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
453         # Only interactive rebase uses detailed reflog messages
454         if test -n "$interactive_rebase" && test "$GIT_REFLOG_ACTION" = rebase
455         then
456                 GIT_REFLOG_ACTION="rebase -i ($action)"
457                 export GIT_REFLOG_ACTION
458         fi
459 fi
460
461 if test "$action" = "edit-todo" && test -z "$interactive_rebase"
462 then
463         die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
464 fi
465
466 case "$action" in
467 continue)
468         # Sanity check
469         git rev-parse --verify HEAD >/dev/null ||
470                 die "$(gettext "Cannot read HEAD")"
471         git update-index --ignore-submodules --refresh &&
472         git diff-files --quiet --ignore-submodules || {
473                 echo "$(gettext "You must edit all merge conflicts and then
474 mark them as resolved using git add")"
475                 exit 1
476         }
477         read_basic_state
478         run_specific_rebase
479         ;;
480 skip)
481         output git reset --hard HEAD || exit $?
482         read_basic_state
483         run_specific_rebase
484         ;;
485 abort)
486         git rerere clear
487         read_basic_state
488         case "$head_name" in
489         refs/*)
490                 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
491                 die "$(eval_gettext "Could not move back to \$head_name")"
492                 ;;
493         esac
494         output git reset --hard $orig_head
495         finish_rebase
496         exit
497         ;;
498 quit)
499         exec rm -rf "$state_dir"
500         ;;
501 edit-todo)
502         run_specific_rebase
503         ;;
504 show-current-patch)
505         run_specific_rebase
506         die "BUG: run_specific_rebase is not supposed to return here"
507         ;;
508 esac
509
510 # Make sure no rebase is in progress
511 if test -n "$in_progress"
512 then
513         state_dir_base=${state_dir##*/}
514         cmd_live_rebase="git rebase (--continue | --abort | --skip)"
515         cmd_clear_stale_rebase="rm -fr \"$state_dir\""
516         die "
517 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
518 I wonder if you are in the middle of another rebase.  If that is the
519 case, please try
520         $cmd_live_rebase
521 If that is not the case, please
522         $cmd_clear_stale_rebase
523 and run me again.  I am stopping in case you still have something
524 valuable there.')"
525 fi
526
527 if test -n "$rebase_root" && test -z "$onto"
528 then
529         test -z "$interactive_rebase" && interactive_rebase=implied
530 fi
531
532 if test -n "$keep_empty"
533 then
534         test -z "$interactive_rebase" && interactive_rebase=implied
535 fi
536
537 if test -n "$interactive_rebase"
538 then
539         if test -z "$preserve_merges"
540         then
541                 type=interactive
542         else
543                 type=preserve-merges
544         fi
545
546         state_dir="$merge_dir"
547 elif test -n "$do_merge"
548 then
549         type=merge
550         state_dir="$merge_dir"
551 else
552         type=am
553         state_dir="$apply_dir"
554 fi
555
556 if test -t 2 && test -z "$GIT_QUIET"
557 then
558         git_format_patch_opt="$git_format_patch_opt --progress"
559 fi
560
561 if test -n "$signoff"
562 then
563         test -n "$preserve_merges" &&
564                 die "$(gettext "error: cannot combine '--signoff' with '--preserve-merges'")"
565         git_am_opt="$git_am_opt $signoff"
566         force_rebase=t
567 fi
568
569 if test -z "$rebase_root"
570 then
571         case "$#" in
572         0)
573                 if ! upstream_name=$(git rev-parse --symbolic-full-name \
574                         --verify -q @{upstream} 2>/dev/null)
575                 then
576                         . git-parse-remote
577                         error_on_missing_default_upstream "rebase" "rebase" \
578                                 "against" "git rebase $(gettext '<branch>')"
579                 fi
580
581                 test "$fork_point" = auto && fork_point=t
582                 ;;
583         *)      upstream_name="$1"
584                 if test "$upstream_name" = "-"
585                 then
586                         upstream_name="@{-1}"
587                 fi
588                 shift
589                 ;;
590         esac
591         upstream=$(peel_committish "${upstream_name}") ||
592         die "$(eval_gettext "invalid upstream '\$upstream_name'")"
593         upstream_arg="$upstream_name"
594 else
595         if test -z "$onto"
596         then
597                 empty_tree=$(git hash-object -t tree /dev/null)
598                 onto=$(git commit-tree $empty_tree </dev/null)
599                 squash_onto="$onto"
600         fi
601         unset upstream_name
602         unset upstream
603         test $# -gt 1 && usage
604         upstream_arg=--root
605 fi
606
607 # Make sure the branch to rebase onto is valid.
608 onto_name=${onto-"$upstream_name"}
609 case "$onto_name" in
610 *...*)
611         if      left=${onto_name%...*} right=${onto_name#*...} &&
612                 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
613         then
614                 case "$onto" in
615                 ?*"$LF"?*)
616                         die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
617                         ;;
618                 '')
619                         die "$(eval_gettext "\$onto_name: there is no merge base")"
620                         ;;
621                 esac
622         else
623                 die "$(eval_gettext "\$onto_name: there is no merge base")"
624         fi
625         ;;
626 *)
627         onto=$(peel_committish "$onto_name") ||
628         die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
629         ;;
630 esac
631
632 # If the branch to rebase is given, that is the branch we will rebase
633 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
634 # $orig_head -- commit object name of tip of the branch before rebasing
635 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
636 switch_to=
637 case "$#" in
638 1)
639         # Is it "rebase other $branchname" or "rebase other $commit"?
640         branch_name="$1"
641         switch_to="$1"
642
643         # Is it a local branch?
644         if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
645            orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
646         then
647                 head_name="refs/heads/$branch_name"
648         # If not is it a valid ref (branch or commit)?
649         elif orig_head=$(git rev-parse -q --verify "$branch_name")
650         then
651                 head_name="detached HEAD"
652
653         else
654                 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
655         fi
656         ;;
657 0)
658         # Do not need to switch branches, we are already on it.
659         if branch_name=$(git symbolic-ref -q HEAD)
660         then
661                 head_name=$branch_name
662                 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
663         else
664                 head_name="detached HEAD"
665                 branch_name=HEAD
666         fi
667         orig_head=$(git rev-parse --verify HEAD) || exit
668         ;;
669 *)
670         die "BUG: unexpected number of arguments left to parse"
671         ;;
672 esac
673
674 if test "$fork_point" = t
675 then
676         new_upstream=$(git merge-base --fork-point "$upstream_name" \
677                         "${switch_to:-HEAD}")
678         if test -n "$new_upstream"
679         then
680                 restrict_revision=$new_upstream
681         fi
682 fi
683
684 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
685 then
686         stash_sha1=$(git stash create "autostash") ||
687         die "$(gettext 'Cannot autostash')"
688
689         mkdir -p "$state_dir" &&
690         echo $stash_sha1 >"$state_dir/autostash" &&
691         stash_abbrev=$(git rev-parse --short $stash_sha1) &&
692         echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
693         git reset --hard
694 fi
695
696 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
697
698 # Now we are rebasing commits $upstream..$orig_head (or with --root,
699 # everything leading up to $orig_head) on top of $onto
700
701 # Check if we are already based on $onto with linear history,
702 # but this should be done only when upstream and onto are the same
703 # and if this is not an interactive rebase.
704 mb=$(git merge-base "$onto" "$orig_head")
705 if test -z "$interactive_rebase" && test "$upstream" = "$onto" &&
706         test "$mb" = "$onto" && test -z "$restrict_revision" &&
707         # linear history?
708         ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
709 then
710         if test -z "$force_rebase"
711         then
712                 # Lazily switch to the target branch if needed...
713                 test -z "$switch_to" ||
714                 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
715                         git checkout -q "$switch_to" --
716                 if test "$branch_name" = "HEAD" &&
717                          ! git symbolic-ref -q HEAD
718                 then
719                         say "$(eval_gettext "HEAD is up to date.")"
720                 else
721                         say "$(eval_gettext "Current branch \$branch_name is up to date.")"
722                 fi
723                 finish_rebase
724                 exit 0
725         else
726                 if test "$branch_name" = "HEAD" &&
727                          ! git symbolic-ref -q HEAD
728                 then
729                         say "$(eval_gettext "HEAD is up to date, rebase forced.")"
730                 else
731                         say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
732                 fi
733         fi
734 fi
735
736 # If a hook exists, give it a chance to interrupt
737 run_pre_rebase_hook "$upstream_arg" "$@"
738
739 if test -n "$diffstat"
740 then
741         if test -n "$verbose"
742         then
743                 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
744         fi
745         # We want color (if set), but no pager
746         GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
747 fi
748
749 test -n "$interactive_rebase" && run_specific_rebase
750
751 # Detach HEAD and reset the tree
752 say "$(gettext "First, rewinding head to replay your work on top of it...")"
753
754 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
755         git checkout -q "$onto^0" || die "could not detach HEAD"
756 git update-ref ORIG_HEAD $orig_head
757
758 # If the $onto is a proper descendant of the tip of the branch, then
759 # we just fast-forwarded.
760 if test "$mb" = "$orig_head"
761 then
762         say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
763         move_to_original_branch
764         finish_rebase
765         exit 0
766 fi
767
768 if test -n "$rebase_root"
769 then
770         revisions="$onto..$orig_head"
771 else
772         revisions="${restrict_revision-$upstream}..$orig_head"
773 fi
774
775 run_specific_rebase