1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano. 4# 5 6SUBDIRECTORY_OK=Yes 7OPTIONS_KEEPDASHDASH= 8OPTIONS_STUCKLONG=t 9OPTIONS_SPEC="\ 10git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>] 11git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>] 12git rebase --continue | --abort | --skip | --edit-todo 13-- 14 Available options are 15v,verbose! display a diffstat of what changed upstream 16q,quiet! be quiet. implies --no-stat 17autostash automatically stash/stash pop before and after 18fork-point use 'merge-base --fork-point' to refine upstream 19onto=! rebase onto given branch instead of upstream 20r,rebase-merges? try to rebase merges instead of skipping them 21p,preserve-merges! try to recreate merges instead of ignoring them 22s,strategy=! use the given merge strategy 23no-ff! cherry-pick all commits, even if unchanged 24m,merge! use merging strategies to rebase 25i,interactive! let the user edit the list of commits to rebase 26x,exec=! add exec lines after each commit of the editable list 27k,keep-empty preserve empty commits during rebase 28allow-empty-message allow rebasing commits with empty messages 29f,force-rebase! force rebase even if branch is up to date 30X,strategy-option=! pass the argument through to the merge strategy 31stat! display a diffstat of what changed upstream 32n,no-stat! do not show diffstat of what changed upstream 33verify allow pre-rebase hook to run 34rerere-autoupdate allow rerere to update index with resolved conflicts 35root! rebase all reachable commits up to the root(s) 36autosquash move commits that begin with squash!/fixup! under -i 37committer-date-is-author-date! passed to 'git am' 38ignore-date! passed to 'git am' 39signoff passed to 'git am' 40whitespace=! passed to 'git apply' 41ignore-whitespace! passed to 'git apply' 42C=! passed to 'git apply' 43S,gpg-sign? GPG-sign commits 44 Actions: 45continue! continue 46abort! abort and check out the original branch 47skip! skip current patch and continue 48edit-todo! edit the todo list during an interactive rebase 49quit! abort but keep HEAD where it is 50show-current-patch! show the patch file being applied or merged 51" 52. git-sh-setup 53set_reflog_action rebase 54require_work_tree_exists 55cd_to_toplevel 56 57LF=' 58' 59ok_to_skip_pre_rebase= 60resolvemsg=" 61$(gettext 'Resolve all conflicts manually, mark them as resolved with 62"git add/rm<conflicted_files>", then run "git rebase --continue". 63You can instead skip this commit: run "git rebase --skip". 64To abort and get back to the state before "git rebase", run "git rebase --abort".') 65" 66squash_onto= 67unset onto 68unset restrict_revision 69cmd= 70strategy= 71strategy_opts= 72do_merge= 73merge_dir="$GIT_DIR"/rebase-merge 74apply_dir="$GIT_DIR"/rebase-apply 75verbose= 76diffstat= 77test"$(git config --bool rebase.stat)"= true && diffstat=t 78autostash="$(git config --bool rebase.autostash || echo false)" 79fork_point=auto 80git_am_opt= 81git_format_patch_opt= 82rebase_root= 83force_rebase= 84allow_rerere_autoupdate= 85# Non-empty if a rebase was in progress when 'git rebase' was invoked 86in_progress= 87# One of {am, merge, interactive} 88type= 89# One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge} 90state_dir= 91# One of {'', continue, skip, abort}, as parsed from command line 92action= 93rebase_merges= 94rebase_cousins= 95preserve_merges= 96autosquash= 97keep_empty= 98allow_empty_message= 99signoff= 100test"$(git config --bool rebase.autosquash)"="true"&& autosquash=t 101case"$(git config --bool commit.gpgsign)"in 102true) gpg_sign_opt=-S;; 103*) gpg_sign_opt= ;; 104esac 105 106read_basic_state () { 107test -f"$state_dir/head-name"&& 108test -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. 114iftest -f"$state_dir"/orig-head 115then 116 orig_head=$(cat "$state_dir"/orig-head) 117else 118 orig_head=$(cat "$state_dir"/head) 119fi&& 120 GIT_QUIET=$(cat "$state_dir"/quiet)&& 121test -f"$state_dir"/verbose && verbose=t 122test -f"$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)" 123test -f"$state_dir"/strategy_opts && 124 strategy_opts="$(cat "$state_dir"/strategy_opts)" 125test -f"$state_dir"/allow_rerere_autoupdate && 126 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)" 127test -f"$state_dir"/gpg_sign_opt && 128 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)" 129test -f"$state_dir"/signoff && { 130 signoff="$(cat "$state_dir"/signoff)" 131 force_rebase=t 132} 133} 134 135write_basic_state () { 136echo"$head_name">"$state_dir"/head-name&& 137echo"$onto">"$state_dir"/onto && 138echo"$orig_head">"$state_dir"/orig-head&& 139echo"$GIT_QUIET">"$state_dir"/quiet && 140test t ="$verbose"&& : >"$state_dir"/verbose 141test -n"$strategy"&&echo"$strategy">"$state_dir"/strategy 142test -n"$strategy_opts"&&echo"$strategy_opts"> \ 143"$state_dir"/strategy_opts 144test -n"$allow_rerere_autoupdate"&&echo"$allow_rerere_autoupdate"> \ 145"$state_dir"/allow_rerere_autoupdate 146test -n"$gpg_sign_opt"&&echo"$gpg_sign_opt">"$state_dir"/gpg_sign_opt 147test -n"$signoff"&&echo"$signoff">"$state_dir"/signoff 148} 149 150output () { 151case"$verbose"in 152'') 153 output=$("$@" 2>&1 ) 154 status=$? 155test$status!=0&&printf"%s\n""$output" 156return$status 157;; 158*) 159"$@" 160;; 161esac 162} 163 164move_to_original_branch () { 165case"$head_name"in 166 refs/*) 167 message="rebase finished:$head_nameonto$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;; 175esac 176} 177 178apply_autostash () { 179iftest -f"$state_dir/autostash" 180then 181 stash_sha1=$(cat "$state_dir/autostash") 182if git stash apply $stash_sha1>/dev/null 2>&1 183then 184echo"$(gettext 'Applied autostash.')">&2 185else 186 git stash store -m"autostash"-q$stash_sha1|| 187 die "$(eval_gettext "Cannot store \$stash_sha1")" 188gettext'Applying autostash resulted in conflicts. 189Your changes are safe in the stash. 190You can run "git stash pop" or "git stash drop" at any time. 191'>&2 192fi 193fi 194} 195 196finish_rebase () { 197rm-f"$(git rev-parse --git-path REBASE_HEAD)" 198 apply_autostash && 199{ git gc --auto|| true; } && 200rm-rf"$state_dir" 201} 202 203run_interactive () { 204 GIT_CHERRY_PICK_HELP="$resolvemsg" 205export GIT_CHERRY_PICK_HELP 206 207test -n"$keep_empty"&& keep_empty="--keep-empty" 208test -n"$rebase_merges"&& rebase_merges="--rebase-merges" 209test -n"$rebase_cousins"&& rebase_cousins="--rebase-cousins" 210test -n"$autosquash"&& autosquash="--autosquash" 211test -n"$verbose"&& verbose="--verbose" 212test -n"$force_rebase"&& force_rebase="--no-ff" 213test -n"$restrict_revision"&& \ 214 restrict_revision="--restrict-revision=^$restrict_revision" 215test -n"$upstream"&& upstream="--upstream=$upstream" 216test -n"$onto"&& onto="--onto=$onto" 217test -n"$squash_onto"&& squash_onto="--squash-onto=$squash_onto" 218test -n"$onto_name"&& onto_name="--onto-name=$onto_name" 219test -n"$head_name"&& head_name="--head-name=$head_name" 220test -n"$strategy"&& strategy="--strategy=$strategy" 221test -n"$strategy_opts"&& strategy_opts="--strategy-opts=$strategy_opts" 222test -n"$switch_to"&& switch_to="--switch-to=$switch_to" 223test -n"$cmd"&& cmd="--cmd=$cmd" 224test -n"$action"&& action="--$action" 225 226exec 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 234run_specific_rebase () { 235if["$interactive_rebase"= implied ];then 236 GIT_EDITOR=: 237export GIT_EDITOR 238 autosquash= 239fi 240 241iftest -n"$interactive_rebase"-a -z"$preserve_merges" 242then 243 run_interactive 244else 245 . git-rebase--$type 246 247iftest -z"$preserve_merges" 248then 249 git_rebase__$type 250else 251 git_rebase__preserve_merges 252fi 253fi 254 255 ret=$? 256iftest$ret-eq0 257then 258 finish_rebase 259eliftest$ret-eq2# special exit status for rebase -p 260then 261 apply_autostash && 262rm-rf"$state_dir"&& 263 die "Nothing to do" 264fi 265exit$ret 266} 267 268run_pre_rebase_hook () { 269iftest -z"$ok_to_skip_pre_rebase"&& 270test -x"$(git rev-parse --git-path hooks/pre-rebase)" 271then 272"$(git rev-parse --git-path hooks/pre-rebase)"${1+"$@"}|| 273 die "$(gettext "The pre-rebase hook refused to rebase.")" 274fi 275} 276 277test -f"$apply_dir"/applying && 278 die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")" 279 280iftest -d"$apply_dir" 281then 282type=am 283 state_dir="$apply_dir" 284eliftest -d"$merge_dir" 285then 286iftest -d"$merge_dir"/rewritten 287then 288type=preserve-merges 289 interactive_rebase=explicit 290 preserve_merges=t 291eliftest -f"$merge_dir"/interactive 292then 293type=interactive 294 interactive_rebase=explicit 295else 296type=merge 297fi 298 state_dir="$merge_dir" 299fi 300test -n"$type"&& in_progress=t 301 302total_argc=$# 303whiletest$#!=0 304do 305case"$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) 313test$total_argc-eq2|| usage 314 action=${1##--} 315;; 316--onto=*) 317 onto="${1#--onto=}" 318;; 319--exec=*) 320 cmd="${cmd}exec${1#--exec=}${LF}" 321test -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 337test -z"$interactive_rebase"&& interactive_rebase=implied 338;; 339--rebase-merges=*) 340 rebase_merges=t 341case"${1#*=}"in 342 rebase-cousins) rebase_cousins=t;; 343 no-rebase-cousins) rebase_cousins=;; 344*) die "Unknown mode:$1";; 345esac 346test -z"$interactive_rebase"&& interactive_rebase=implied 347;; 348--preserve-merges) 349 preserve_merges=t 350test -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 370test -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=}" 401case"${1#--whitespace=}"in 402 fix|strip) 403 force_rebase=t 404;; 405esac 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--) 439shift 440break 441;; 442*) 443 usage 444;; 445esac 446shift 447done 448test$#-gt2&& usage 449 450iftest -n"$action" 451then 452test -z"$in_progress"&& die "$(gettext "No rebase in progress?")" 453# Only interactive rebase uses detailed reflog messages 454iftest -n"$interactive_rebase"&&test"$GIT_REFLOG_ACTION"= rebase 455then 456 GIT_REFLOG_ACTION="rebase -i ($action)" 457export GIT_REFLOG_ACTION 458fi 459fi 460 461iftest"$action"="edit-todo"&&test -z"$interactive_rebase" 462then 463 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")" 464fi 465 466case"$action"in 467continue) 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|| { 473echo"$(gettext "You must edit all merge conflicts and then 474mark them as resolved using git add")" 475exit1 476} 477 read_basic_state 478 run_specific_rebase 479;; 480skip) 481 output git reset--hard HEAD ||exit $? 482 read_basic_state 483 run_specific_rebase 484;; 485abort) 486 git rerere clear 487 read_basic_state 488case"$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;; 493esac 494 output git reset--hard$orig_head 495 finish_rebase 496exit 497;; 498quit) 499execrm-rf"$state_dir" 500;; 501edit-todo) 502 run_specific_rebase 503;; 504show-current-patch) 505 run_specific_rebase 506 die "BUG: run_specific_rebase is not supposed to return here" 507;; 508esac 509 510# Make sure no rebase is in progress 511iftest -n"$in_progress" 512then 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_basedirectory, and 518I wonder if you are in the middle of another rebase. If that is the 519case, please try 520$cmd_live_rebase 521If that is not the case, please 522$cmd_clear_stale_rebase 523and run me again. I am stopping in case you still have something 524valuable there.')" 525fi 526 527iftest -n"$rebase_root"&&test -z"$onto" 528then 529test -z"$interactive_rebase"&& interactive_rebase=implied 530fi 531 532iftest -n"$keep_empty" 533then 534test -z"$interactive_rebase"&& interactive_rebase=implied 535fi 536 537iftest -n"$interactive_rebase" 538then 539iftest -z"$preserve_merges" 540then 541type=interactive 542else 543type=preserve-merges 544fi 545 546 state_dir="$merge_dir" 547eliftest -n"$do_merge" 548then 549type=merge 550 state_dir="$merge_dir" 551else 552type=am 553 state_dir="$apply_dir" 554fi 555 556iftest -t2&&test -z"$GIT_QUIET" 557then 558 git_format_patch_opt="$git_format_patch_opt--progress" 559fi 560 561iftest -n"$signoff" 562then 563test -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 567fi 568 569iftest -z"$rebase_root" 570then 571case"$#"in 5720) 573if! upstream_name=$(git rev-parse --symbolic-full-name \ 574--verify -q @{upstream}2>/dev/null) 575then 576 . git-parse-remote 577 error_on_missing_default_upstream "rebase""rebase" \ 578"against""git rebase$(gettext '<branch>')" 579fi 580 581test"$fork_point"= auto && fork_point=t 582;; 583*) upstream_name="$1" 584iftest"$upstream_name"="-" 585then 586 upstream_name="@{-1}" 587fi 588shift 589;; 590esac 591 upstream=$(peel_committish "${upstream_name}")|| 592 die "$(eval_gettext "invalid upstream '\$upstream_name'")" 593 upstream_arg="$upstream_name" 594else 595iftest -z"$onto" 596then 597 empty_tree=$(git hash-object -t tree /dev/null) 598 onto=$(git commit-tree $empty_tree </dev/null) 599 squash_onto="$onto" 600fi 601unset upstream_name 602unset upstream 603test$#-gt1&& usage 604 upstream_arg=--root 605fi 606 607# Make sure the branch to rebase onto is valid. 608onto_name=${onto-"$upstream_name"} 609case"$onto_name"in 610*...*) 611if left=${onto_name%...*} right=${onto_name#*...}&& 612 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD}) 613then 614case"$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;; 621esac 622else 623 die "$(eval_gettext "\$onto_name: there is no merge base")" 624fi 625;; 626*) 627 onto=$(peel_committish "$onto_name")|| 628 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")" 629;; 630esac 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" 636switch_to= 637case"$#"in 6381) 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? 644if git show-ref --verify --quiet --"refs/heads/$branch_name"&& 645 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name") 646then 647 head_name="refs/heads/$branch_name" 648# If not is it a valid ref (branch or commit)? 649elif orig_head=$(git rev-parse -q --verify "$branch_name") 650then 651 head_name="detached HEAD" 652 653else 654 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")" 655fi 656;; 6570) 658# Do not need to switch branches, we are already on it. 659if branch_name=$(git symbolic-ref -q HEAD) 660then 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 ;; 672esac 673 674if test "$fork_point" = t 675then 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 682fi 683 684if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null 685then 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 694fi 695 696require_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$ontowith 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. 704mb=$(git merge-base "$onto" "$orig_head") 705if 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 709then 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 734fi 735 736# If a hook exists, give it a chance to interrupt 737run_pre_rebase_hook "$upstream_arg" "$@" 738 739if test -n "$diffstat" 740then 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" 747fi 748 749test -n "$interactive_rebase" && run_specific_rebase 750 751# Detach HEAD and reset the tree 752say "$(gettext "First, rewinding head to replay your work on top of it...")" 753 754GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout$onto_name" \ 755 git checkout -q "$onto^0" || die "could not detach HEAD" 756git update-ref ORIG_HEAD$orig_head 757 758# If the$ontois a proper descendant of the tip of the branch, then 759# we just fast-forwarded. 760if test "$mb" = "$orig_head" 761then 762 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")" 763 move_to_original_branch 764 finish_rebase 765 exit 0 766fi 767 768if test -n "$rebase_root" 769then 770 revisions="$onto..$orig_head" 771else 772 revisions="${restrict_revision-$upstream}..$orig_head" 773fi 774 775run_specific_rebase