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