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