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 20p,preserve-merges! try to recreate merges instead of ignoring them 21s,strategy=! use the given merge strategy 22no-ff! cherry-pick all commits, even if unchanged 23m,merge! use merging strategies to rebase 24i,interactive! let the user edit the list of commits to rebase 25x,exec=! add exec lines after each commit of the editable list 26k,keep-empty preserve empty commits during rebase 27f,force-rebase! force rebase even if branch is up to date 28X,strategy-option=! pass the argument through to the merge strategy 29stat! display a diffstat of what changed upstream 30n,no-stat! do not show diffstat of what changed upstream 31verify allow pre-rebase hook to run 32rerere-autoupdate allow rerere to update index with resolved conflicts 33root! rebase all reachable commits up to the root(s) 34autosquash move commits that begin with squash!/fixup! under -i 35committer-date-is-author-date! passed to 'git am' 36ignore-date! passed to 'git am' 37signoff passed to 'git am' 38whitespace=! passed to 'git apply' 39ignore-whitespace! passed to 'git apply' 40C=! passed to 'git apply' 41S,gpg-sign? GPG-sign commits 42 Actions: 43continue! continue 44abort! abort and check out the original branch 45skip! skip current patch and continue 46edit-todo! edit the todo list during an interactive rebase 47quit! abort but keep HEAD where it is 48" 49. git-sh-setup 50set_reflog_action rebase 51require_work_tree_exists 52cd_to_toplevel 53 54LF=' 55' 56ok_to_skip_pre_rebase= 57resolvemsg=" 58$(gettext 'Resolve all conflicts manually, mark them as resolved with 59"git add/rm<conflicted_files>", then run "git rebase --continue". 60You can instead skip this commit: run "git rebase --skip". 61To abort and get back to the state before "git rebase", run "git rebase --abort".') 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= 90preserve_merges= 91autosquash= 92keep_empty= 93test"$(git config --bool rebase.autosquash)"="true"&& autosquash=t 94case"$(git config --bool commit.gpgsign)"in 95true) gpg_sign_opt=-S;; 96*) gpg_sign_opt= ;; 97esac 98 99read_basic_state () { 100test -f"$state_dir/head-name"&& 101test -f"$state_dir/onto"&& 102 head_name=$(cat "$state_dir"/head-name)&& 103 onto=$(cat "$state_dir"/onto)&& 104# We always write to orig-head, but interactive rebase used to write to 105# head. Fall back to reading from head to cover for the case that the 106# user upgraded git with an ongoing interactive rebase. 107iftest -f"$state_dir"/orig-head 108then 109 orig_head=$(cat "$state_dir"/orig-head) 110else 111 orig_head=$(cat "$state_dir"/head) 112fi&& 113 GIT_QUIET=$(cat "$state_dir"/quiet)&& 114test -f"$state_dir"/verbose && verbose=t 115test -f"$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)" 116test -f"$state_dir"/strategy_opts && 117 strategy_opts="$(cat "$state_dir"/strategy_opts)" 118test -f"$state_dir"/allow_rerere_autoupdate && 119 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)" 120test -f"$state_dir"/gpg_sign_opt && 121 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)" 122} 123 124write_basic_state () { 125echo"$head_name">"$state_dir"/head-name&& 126echo"$onto">"$state_dir"/onto && 127echo"$orig_head">"$state_dir"/orig-head&& 128echo"$GIT_QUIET">"$state_dir"/quiet && 129test t ="$verbose"&& : >"$state_dir"/verbose 130test -n"$strategy"&&echo"$strategy">"$state_dir"/strategy 131test -n"$strategy_opts"&&echo"$strategy_opts"> \ 132"$state_dir"/strategy_opts 133test -n"$allow_rerere_autoupdate"&&echo"$allow_rerere_autoupdate"> \ 134"$state_dir"/allow_rerere_autoupdate 135test -n"$gpg_sign_opt"&&echo"$gpg_sign_opt">"$state_dir"/gpg_sign_opt 136} 137 138output () { 139case"$verbose"in 140'') 141 output=$("$@" 2>&1 ) 142 status=$? 143test$status!=0&&printf"%s\n""$output" 144return$status 145;; 146*) 147"$@" 148;; 149esac 150} 151 152move_to_original_branch () { 153case"$head_name"in 154 refs/*) 155 message="rebase finished:$head_nameonto$onto" 156 git update-ref -m"$message" \ 157$head_name $(git rev-parse HEAD) $orig_head&& 158 git symbolic-ref \ 159-m"rebase finished: returning to$head_name" \ 160 HEAD $head_name|| 161 die "$(eval_gettext "Could not move back to \$head_name")" 162;; 163esac 164} 165 166apply_autostash () { 167iftest -f"$state_dir/autostash" 168then 169 stash_sha1=$(cat "$state_dir/autostash") 170if git stash apply $stash_sha1>/dev/null 2>&1 171then 172echo"$(gettext 'Applied autostash.')">&2 173else 174 git stash store -m"autostash"-q$stash_sha1|| 175 die "$(eval_gettext "Cannot store \$stash_sha1")" 176gettext'Applying autostash resulted in conflicts. 177Your changes are safe in the stash. 178You can run "git stash pop" or "git stash drop" at any time. 179'>&2 180fi 181fi 182} 183 184finish_rebase () { 185 apply_autostash && 186{ git gc --auto|| true; } && 187rm-rf"$state_dir" 188} 189 190run_specific_rebase () { 191if["$interactive_rebase"= implied ];then 192 GIT_EDITOR=: 193export GIT_EDITOR 194 autosquash= 195fi 196 . git-rebase--$type 197 ret=$? 198iftest$ret-eq0 199then 200 finish_rebase 201eliftest$ret-eq2# special exit status for rebase -i 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 -f"$merge_dir"/interactive 229then 230type=interactive 231 interactive_rebase=explicit 232else 233type=merge 234fi 235 state_dir="$merge_dir" 236fi 237test -n"$type"&& in_progress=t 238 239total_argc=$# 240whiletest$#!=0 241do 242case"$1"in 243--no-verify) 244 ok_to_skip_pre_rebase=yes 245;; 246--verify) 247 ok_to_skip_pre_rebase= 248;; 249--continue|--skip|--abort|--quit|--edit-todo) 250test$total_argc-eq2|| usage 251 action=${1##--} 252;; 253--onto=*) 254 onto="${1#--onto=}" 255;; 256--exec=*) 257 cmd="${cmd}exec${1#--exec=}${LF}" 258test -z"$interactive_rebase"&& interactive_rebase=implied 259;; 260--interactive) 261 interactive_rebase=explicit 262;; 263--keep-empty) 264 keep_empty=yes 265;; 266--no-keep-empty) 267 keep_empty= 268;; 269--preserve-merges) 270 preserve_merges=t 271test -z"$interactive_rebase"&& interactive_rebase=implied 272;; 273--autosquash) 274 autosquash=t 275;; 276--no-autosquash) 277 autosquash= 278;; 279--fork-point) 280 fork_point=t 281;; 282--no-fork-point) 283 fork_point= 284;; 285--merge) 286 do_merge=t 287;; 288--strategy-option=*) 289 strategy_opts="$strategy_opts$(git rev-parse --sq-quote "--${1#--strategy-option=}")" 290 do_merge=t 291test -z"$strategy"&& strategy=recursive 292;; 293--strategy=*) 294 strategy="${1#--strategy=}" 295 do_merge=t 296;; 297--no-stat) 298 diffstat= 299;; 300--stat) 301 diffstat=t 302;; 303--autostash) 304 autostash=true 305;; 306--no-autostash) 307 autostash=false 308;; 309--verbose) 310 verbose=t 311 diffstat=t 312 GIT_QUIET= 313;; 314--quiet) 315 GIT_QUIET=t 316 git_am_opt="$git_am_opt-q" 317 verbose= 318 diffstat= 319;; 320--whitespace=*) 321 git_am_opt="$git_am_opt--whitespace=${1#--whitespace=}" 322case"${1#--whitespace=}"in 323 fix|strip) 324 force_rebase=t 325;; 326esac 327;; 328--ignore-whitespace) 329 git_am_opt="$git_am_opt$1" 330;; 331--committer-date-is-author-date|--ignore-date|--signoff|--no-signoff) 332 git_am_opt="$git_am_opt$1" 333 force_rebase=t 334;; 335-C*) 336 git_am_opt="$git_am_opt$1" 337;; 338--root) 339 rebase_root=t 340;; 341--force-rebase|--no-ff) 342 force_rebase=t 343;; 344--rerere-autoupdate|--no-rerere-autoupdate) 345 allow_rerere_autoupdate="$1" 346;; 347--gpg-sign) 348 gpg_sign_opt=-S 349;; 350--gpg-sign=*) 351 gpg_sign_opt="-S${1#--gpg-sign=}" 352;; 353--) 354shift 355break 356;; 357*) 358 usage 359;; 360esac 361shift 362done 363test$#-gt2&& usage 364 365iftest -n"$action" 366then 367test -z"$in_progress"&& die "$(gettext "No rebase in progress?")" 368# Only interactive rebase uses detailed reflog messages 369iftest"$type"= interactive &&test"$GIT_REFLOG_ACTION"= rebase 370then 371 GIT_REFLOG_ACTION="rebase -i ($action)" 372export GIT_REFLOG_ACTION 373fi 374fi 375 376iftest"$action"="edit-todo"&&test"$type"!="interactive" 377then 378 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")" 379fi 380 381case"$action"in 382continue) 383# Sanity check 384 git rev-parse --verify HEAD >/dev/null || 385 die "$(gettext "Cannot read HEAD")" 386 git update-index --ignore-submodules --refresh&& 387 git diff-files --quiet --ignore-submodules|| { 388echo"$(gettext "You must edit all merge conflicts and then 389mark them as resolved using git add")" 390exit1 391} 392 read_basic_state 393 run_specific_rebase 394;; 395skip) 396 output git reset--hard HEAD ||exit $? 397 read_basic_state 398 run_specific_rebase 399;; 400abort) 401 git rerere clear 402 read_basic_state 403case"$head_name"in 404 refs/*) 405 git symbolic-ref -m"rebase: aborting" HEAD $head_name|| 406 die "$(eval_gettext "Could not move back to \$head_name")" 407;; 408esac 409 output git reset--hard$orig_head 410 finish_rebase 411exit 412;; 413quit) 414execrm-rf"$state_dir" 415;; 416edit-todo) 417 run_specific_rebase 418;; 419esac 420 421# Make sure no rebase is in progress 422iftest -n"$in_progress" 423then 424 state_dir_base=${state_dir##*/} 425 cmd_live_rebase="git rebase (--continue | --abort | --skip)" 426 cmd_clear_stale_rebase="rm -fr\"$state_dir\"" 427 die " 428$(eval_gettext 'It seems that there is already a$state_dir_basedirectory, and 429I wonder if you are in the middle of another rebase. If that is the 430case, please try 431$cmd_live_rebase 432If that is not the case, please 433$cmd_clear_stale_rebase 434and run me again. I am stopping in case you still have something 435valuable there.')" 436fi 437 438iftest -n"$rebase_root"&&test -z"$onto" 439then 440test -z"$interactive_rebase"&& interactive_rebase=implied 441fi 442 443iftest -n"$interactive_rebase" 444then 445type=interactive 446 state_dir="$merge_dir" 447eliftest -n"$do_merge" 448then 449type=merge 450 state_dir="$merge_dir" 451else 452type=am 453 state_dir="$apply_dir" 454fi 455 456iftest -t2&&test -z"$GIT_QUIET" 457then 458 git_format_patch_opt="$git_format_patch_opt--progress" 459fi 460 461iftest -z"$rebase_root" 462then 463case"$#"in 4640) 465if! upstream_name=$(git rev-parse --symbolic-full-name \ 466--verify -q @{upstream}2>/dev/null) 467then 468 . git-parse-remote 469 error_on_missing_default_upstream "rebase""rebase" \ 470"against""git rebase$(gettext '<branch>')" 471fi 472 473test"$fork_point"= auto && fork_point=t 474;; 475*) upstream_name="$1" 476iftest"$upstream_name"="-" 477then 478 upstream_name="@{-1}" 479fi 480shift 481;; 482esac 483 upstream=$(peel_committish "${upstream_name}")|| 484 die "$(eval_gettext "invalid upstream '\$upstream_name'")" 485 upstream_arg="$upstream_name" 486else 487iftest -z"$onto" 488then 489 empty_tree=$(git hash-object -t tree /dev/null) 490 onto=$(git commit-tree $empty_tree </dev/null) 491 squash_onto="$onto" 492fi 493unset upstream_name 494unset upstream 495test$#-gt1&& usage 496 upstream_arg=--root 497fi 498 499# Make sure the branch to rebase onto is valid. 500onto_name=${onto-"$upstream_name"} 501case"$onto_name"in 502*...*) 503if left=${onto_name%...*} right=${onto_name#*...}&& 504 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD}) 505then 506case"$onto"in 507 ?*"$LF"?*) 508 die "$(eval_gettext "\$onto_name: there are more than one merge bases")" 509;; 510'') 511 die "$(eval_gettext "\$onto_name: there is no merge base")" 512;; 513esac 514else 515 die "$(eval_gettext "\$onto_name: there is no merge base")" 516fi 517;; 518*) 519 onto=$(peel_committish "$onto_name")|| 520 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")" 521;; 522esac 523 524# If the branch to rebase is given, that is the branch we will rebase 525# $branch_name -- branch/commit being rebased, or HEAD (already detached) 526# $orig_head -- commit object name of tip of the branch before rebasing 527# $head_name -- refs/heads/<that-branch> or "detached HEAD" 528switch_to= 529case"$#"in 5301) 531# Is it "rebase other $branchname" or "rebase other $commit"? 532 branch_name="$1" 533 switch_to="$1" 534 535# Is it a local branch? 536if git show-ref --verify --quiet --"refs/heads/$branch_name"&& 537 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name") 538then 539 head_name="refs/heads/$branch_name" 540# If not is it a valid ref (branch or commit)? 541elif orig_head=$(git rev-parse -q --verify "$branch_name") 542then 543 head_name="detached HEAD" 544 545else 546 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")" 547fi 548;; 5490) 550# Do not need to switch branches, we are already on it. 551if branch_name=$(git symbolic-ref -q HEAD) 552then 553 head_name=$branch_name 554 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)') 555 else 556 head_name="detached HEAD" 557 branch_name=HEAD 558 fi 559 orig_head=$(git rev-parse --verify HEAD)|| exit 560 ;; 561*) 562 die "BUG: unexpected number of arguments left to parse" 563 ;; 564esac 565 566if test "$fork_point" = t 567then 568 new_upstream=$(git merge-base --fork-point "$upstream_name" \ 569 "${switch_to:-HEAD}") 570 if test -n "$new_upstream" 571 then 572 restrict_revision=$new_upstream 573 fi 574fi 575 576if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null 577then 578 stash_sha1=$(git stash create "autostash")|| 579 die "$(gettext 'Cannot autostash')" 580 581 mkdir -p "$state_dir" && 582 echo$stash_sha1>"$state_dir/autostash" && 583 stash_abbrev=$(git rev-parse --short $stash_sha1)&& 584 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" && 585 git reset --hard 586fi 587 588require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")" 589 590# Now we are rebasing commits$upstream..$orig_head(or with --root, 591# everything leading up to$orig_head) on top of$onto 592 593# Check if we are already based on$ontowith linear history, 594# but this should be done only when upstream and onto are the same 595# and if this is not an interactive rebase. 596mb=$(git merge-base "$onto" "$orig_head") 597if test "$type" != interactive && test "$upstream" = "$onto" && 598 test "$mb" = "$onto" && test -z "$restrict_revision" && 599 # linear history? 600 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null 601then 602 if test -z "$force_rebase" 603 then 604 # Lazily switch to the target branch if needed... 605 test -z "$switch_to" || 606 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout$switch_to" \ 607 git checkout -q "$switch_to" -- 608 if test "$branch_name" = "HEAD" && 609 ! git symbolic-ref -q HEAD 610 then 611 say "$(eval_gettext "HEAD is up to date.")" 612 else 613 say "$(eval_gettext "Current branch \$branch_name is up to date.")" 614 fi 615 finish_rebase 616 exit 0 617 else 618 if test "$branch_name" = "HEAD" && 619 ! git symbolic-ref -q HEAD 620 then 621 say "$(eval_gettext "HEAD is up to date, rebase forced.")" 622 else 623 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")" 624 fi 625 fi 626fi 627 628# If a hook exists, give it a chance to interrupt 629run_pre_rebase_hook "$upstream_arg" "$@" 630 631if test -n "$diffstat" 632then 633 if test -n "$verbose" 634 then 635 echo "$(eval_gettext "Changes from \$mb to \$onto:")" 636 fi 637 # We want color (if set), but no pager 638 GIT_PAGER='' git diff --stat --summary "$mb" "$onto" 639fi 640 641test "$type" = interactive && run_specific_rebase 642 643# Detach HEAD and reset the tree 644say "$(gettext "First, rewinding head to replay your work on top of it...")" 645 646GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout$onto_name" \ 647 git checkout -q "$onto^0" || die "could not detach HEAD" 648git update-ref ORIG_HEAD$orig_head 649 650# If the$ontois a proper descendant of the tip of the branch, then 651# we just fast-forwarded. 652if test "$mb" = "$orig_head" 653then 654 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")" 655 move_to_original_branch 656 finish_rebase 657 exit 0 658fi 659 660if test -n "$rebase_root" 661then 662 revisions="$onto..$orig_head" 663else 664 revisions="${restrict_revision-$upstream}..$orig_head" 665fi 666 667run_specific_rebase