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