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&& 121 GIT_QUIET=$(cat "$state_dir"/quiet)&& 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_EDITOR=: 180export GIT_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 229iftest -d"$merge_dir"/rewritten 230then 231type=preserve-merges 232 interactive_rebase=explicit 233 preserve_merges=t 234eliftest -f"$merge_dir"/interactive 235then 236type=interactive 237 interactive_rebase=explicit 238else 239type=merge 240fi 241 state_dir="$merge_dir" 242fi 243test -n"$type"&& in_progress=t 244 245total_argc=$# 246whiletest$#!=0 247do 248case"$1"in 249--no-verify) 250 ok_to_skip_pre_rebase=yes 251;; 252--verify) 253 ok_to_skip_pre_rebase= 254;; 255--continue|--skip|--abort|--quit|--edit-todo|--show-current-patch) 256test$total_argc-eq2|| usage 257 action=${1##--} 258;; 259--onto=*) 260 onto="${1#--onto=}" 261;; 262--exec=*) 263 cmd="${cmd}exec${1#--exec=}${LF}" 264test -z"$interactive_rebase"&& interactive_rebase=implied 265;; 266-y*) 267 reschedule_failed_exec=--reschedule-failed-exec 268 cmd="${cmd}exec${1#-y}${LF}" 269test -z"$interactive_rebase"&& interactive_rebase=implied 270;; 271--interactive) 272 interactive_rebase=explicit 273;; 274--keep-empty) 275 keep_empty=yes 276;; 277--allow-empty-message) 278 allow_empty_message=--allow-empty-message 279;; 280--no-keep-empty) 281 keep_empty= 282;; 283--rebase-merges) 284 rebase_merges=t 285test -z"$interactive_rebase"&& interactive_rebase=implied 286;; 287--rebase-merges=*) 288 rebase_merges=t 289case"${1#*=}"in 290 rebase-cousins) rebase_cousins=t;; 291 no-rebase-cousins) rebase_cousins=;; 292*) die "Unknown mode:$1";; 293esac 294test -z"$interactive_rebase"&& interactive_rebase=implied 295;; 296--preserve-merges) 297 preserve_merges=t 298test -z"$interactive_rebase"&& interactive_rebase=implied 299;; 300--autosquash) 301 autosquash=t 302;; 303--no-autosquash) 304 autosquash= 305;; 306--fork-point) 307 fork_point=t 308;; 309--no-fork-point) 310 fork_point= 311;; 312--merge) 313 do_merge=t 314;; 315--strategy-option=*) 316 strategy_opts="$strategy_opts$(git rev-parse --sq-quote "--${1#--strategy-option=}" | sed -e s/^.//)" 317 do_merge=t 318test -z"$strategy"&& strategy=recursive 319;; 320--strategy=*) 321 strategy="${1#--strategy=}" 322 do_merge=t 323;; 324--no-stat) 325 diffstat= 326;; 327--stat) 328 diffstat=t 329;; 330--autostash) 331 autostash=true 332;; 333--no-autostash) 334 autostash=false 335;; 336--verbose) 337 verbose=t 338 diffstat=t 339 GIT_QUIET= 340;; 341--quiet) 342 GIT_QUIET=t 343 git_am_opt="$git_am_opt-q" 344 verbose= 345 diffstat= 346;; 347--whitespace=*) 348 git_am_opt="$git_am_opt--whitespace=${1#--whitespace=}" 349case"${1#--whitespace=}"in 350 fix|strip) 351 force_rebase=t 352;; 353 warn|nowarn|error|error-all) 354;;# okay, known whitespace option 355*) 356 die "fatal: Invalid whitespace option: '${1#*=}'" 357;; 358esac 359;; 360--ignore-whitespace) 361 git_am_opt="$git_am_opt$1" 362;; 363--signoff) 364 signoff=--signoff 365;; 366--no-signoff) 367 signoff= 368;; 369--committer-date-is-author-date|--ignore-date) 370 git_am_opt="$git_am_opt$1" 371 force_rebase=t 372;; 373-C*[!0-9]*) 374 die "fatal: switch \`C' expects a numerical value" 375;; 376-C*) 377 git_am_opt="$git_am_opt$1" 378;; 379--root) 380 rebase_root=t 381;; 382--force-rebase|--no-ff) 383 force_rebase=t 384;; 385--rerere-autoupdate|--no-rerere-autoupdate) 386 allow_rerere_autoupdate="$1" 387;; 388--gpg-sign) 389 gpg_sign_opt=-S 390;; 391--gpg-sign=*) 392 gpg_sign_opt="-S${1#--gpg-sign=}" 393;; 394--reschedule-failed-exec) 395 reschedule_failed_exec=--reschedule-failed-exec 396;; 397--no-reschedule-failed-exec) 398 reschedule_failed_exec= 399;; 400--) 401shift 402break 403;; 404*) 405 usage 406;; 407esac 408shift 409done 410test$#-gt2&& usage 411 412iftest -n"$action" 413then 414test -z"$in_progress"&& die "$(gettext "No rebase in progress?")" 415# Only interactive rebase uses detailed reflog messages 416iftest -n"$interactive_rebase"&&test"$GIT_REFLOG_ACTION"= rebase 417then 418 GIT_REFLOG_ACTION="rebase -i ($action)" 419export GIT_REFLOG_ACTION 420fi 421fi 422 423iftest"$action"="edit-todo"&&test -z"$interactive_rebase" 424then 425 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")" 426fi 427 428case"$action"in 429continue) 430# Sanity check 431 git rev-parse --verify HEAD >/dev/null || 432 die "$(gettext "Cannot read HEAD")" 433 git update-index --ignore-submodules --refresh&& 434 git diff-files --quiet --ignore-submodules|| { 435echo"$(gettext "You must edit all merge conflicts and then 436mark them as resolved using git add")" 437exit1 438} 439 read_basic_state 440 run_specific_rebase 441;; 442skip) 443 output git reset--hard HEAD ||exit $? 444 read_basic_state 445 run_specific_rebase 446;; 447abort) 448 git rerere clear 449 read_basic_state 450case"$head_name"in 451 refs/*) 452 git symbolic-ref -m"rebase: aborting" HEAD $head_name|| 453 die "$(eval_gettext "Could not move back to \$head_name")" 454;; 455esac 456 output git reset--hard$orig_head 457 finish_rebase 458exit 459;; 460quit) 461execrm-rf"$state_dir" 462;; 463edit-todo) 464 run_specific_rebase 465;; 466show-current-patch) 467 run_specific_rebase 468 die "BUG: run_specific_rebase is not supposed to return here" 469;; 470esac 471 472# Make sure no rebase is in progress 473iftest -n"$in_progress" 474then 475 state_dir_base=${state_dir##*/} 476 cmd_live_rebase="git rebase (--continue | --abort | --skip)" 477 cmd_clear_stale_rebase="rm -fr\"$state_dir\"" 478 die " 479$(eval_gettext 'It seems that there is already a$state_dir_basedirectory, and 480I wonder if you are in the middle of another rebase. If that is the 481case, please try 482$cmd_live_rebase 483If that is not the case, please 484$cmd_clear_stale_rebase 485and run me again. I am stopping in case you still have something 486valuable there.')" 487fi 488 489iftest -n"$rebase_root"&&test -z"$onto" 490then 491test -z"$interactive_rebase"&& interactive_rebase=implied 492fi 493 494iftest -n"$keep_empty" 495then 496test -z"$interactive_rebase"&& interactive_rebase=implied 497fi 498 499iftest -n"$interactive_rebase" 500then 501iftest -z"$preserve_merges" 502then 503type=interactive 504else 505type=preserve-merges 506fi 507 508 state_dir="$merge_dir" 509eliftest -n"$do_merge" 510then 511type=merge 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 523iftest -n"$git_am_opt";then 524 incompatible_opts=$(echo"$git_am_opt"| \ 525sed-e's/ -q / /g'-e's/^ \(.*\) $/\1/') 526iftest -n"$interactive_rebase" 527then 528iftest -n"$incompatible_opts" 529then 530 die "$(gettext "error: cannot combine interactive options (--interactive, --exec, --rebase-merges, --preserve-merges, --keep-empty, --root + --onto)with am options ($incompatible_opts)")" 531 fi 532 fi 533 if test -n "$do_merge"; then 534 if test -n "$incompatible_opts" 535 then 536 die "$(gettext "error: cannot combine merge options (--merge, --strategy, --strategy-option) with am options ($incompatible_opts)")" 537fi 538fi 539fi 540 541iftest -n"$signoff" 542then 543test -n"$preserve_merges"&& 544 die "$(gettext "error: cannot combine '--signoff' with '--preserve-merges'")" 545 git_am_opt="$git_am_opt$signoff" 546 force_rebase=t 547fi 548 549iftest -n"$preserve_merges" 550then 551# Note: incompatibility with --signoff handled in signoff block above 552# Note: incompatibility with --interactive is just a strong warning; 553# git-rebase.txt caveats with "unless you know what you are doing" 554test -n"$rebase_merges"&& 555 die "$(gettext "error: cannot combine '--preserve-merges' with '--rebase-merges'")" 556 557test -n"$reschedule_failed_exec"&& 558 die "$(gettext "error: cannot combine '--preserve-merges' with '--reschedule-failed-exec'")" 559fi 560 561iftest -n"$rebase_merges" 562then 563test -n"$strategy_opts"&& 564 die "$(gettext "error: cannot combine '--rebase-merges' with '--strategy-option'")" 565test -n"$strategy"&& 566 die "$(gettext "error: cannot combine '--rebase-merges' with '--strategy'")" 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 if test -z "$mb" 744 then 745 echo "$(eval_gettext "Changes to \$onto:")" 746 else 747 echo "$(eval_gettext "Changes from \$mb to \$onto:")" 748 fi 749 fi 750 mb_tree="${mb:-$(git hash-object -t tree /dev/null)}" 751 # We want color (if set), but no pager 752 GIT_PAGER='' git diff --stat --summary "$mb_tree" "$onto" 753fi 754 755test -n "$interactive_rebase" && run_specific_rebase 756 757# Detach HEAD and reset the tree 758say "$(gettext "First, rewinding head to replay your work on top of it...")" 759 760GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout$onto_name" \ 761 git checkout -q "$onto^0" || die "could not detach HEAD" 762git update-ref ORIG_HEAD$orig_head 763 764# If the$ontois a proper descendant of the tip of the branch, then 765# we just fast-forwarded. 766if test "$mb" = "$orig_head" 767then 768 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")" 769 move_to_original_branch 770 finish_rebase 771 exit 0 772fi 773 774if test -n "$rebase_root" 775then 776 revisions="$onto..$orig_head" 777else 778 revisions="${restrict_revision-$upstream}..$orig_head" 779fi 780 781run_specific_rebase