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;; 340esac 341;; 342--ignore-whitespace) 343 git_am_opt="$git_am_opt$1" 344;; 345--signoff) 346 signoff=--signoff 347;; 348--no-signoff) 349 signoff= 350;; 351--committer-date-is-author-date|--ignore-date) 352 git_am_opt="$git_am_opt$1" 353 force_rebase=t 354;; 355-C*) 356 git_am_opt="$git_am_opt$1" 357;; 358--root) 359 rebase_root=t 360;; 361--force-rebase|--no-ff) 362 force_rebase=t 363;; 364--rerere-autoupdate|--no-rerere-autoupdate) 365 allow_rerere_autoupdate="$1" 366;; 367--gpg-sign) 368 gpg_sign_opt=-S 369;; 370--gpg-sign=*) 371 gpg_sign_opt="-S${1#--gpg-sign=}" 372;; 373--) 374shift 375break 376;; 377*) 378 usage 379;; 380esac 381shift 382done 383test$#-gt2&& usage 384 385iftest -n"$action" 386then 387test -z"$in_progress"&& die "$(gettext "No rebase in progress?")" 388# Only interactive rebase uses detailed reflog messages 389iftest -n"$interactive_rebase"&&test"$GIT_REFLOG_ACTION"= rebase 390then 391 GIT_REFLOG_ACTION="rebase -i ($action)" 392export GIT_REFLOG_ACTION 393fi 394fi 395 396iftest"$action"="edit-todo"&&test -z"$interactive_rebase" 397then 398 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")" 399fi 400 401case"$action"in 402continue) 403# Sanity check 404 git rev-parse --verify HEAD >/dev/null || 405 die "$(gettext "Cannot read HEAD")" 406 git update-index --ignore-submodules --refresh&& 407 git diff-files --quiet --ignore-submodules|| { 408echo"$(gettext "You must edit all merge conflicts and then 409mark them as resolved using git add")" 410exit1 411} 412 read_basic_state 413 run_specific_rebase 414;; 415skip) 416 output git reset--hard HEAD ||exit $? 417 read_basic_state 418 run_specific_rebase 419;; 420abort) 421 git rerere clear 422 read_basic_state 423case"$head_name"in 424 refs/*) 425 git symbolic-ref -m"rebase: aborting" HEAD $head_name|| 426 die "$(eval_gettext "Could not move back to \$head_name")" 427;; 428esac 429 output git reset--hard$orig_head 430 finish_rebase 431exit 432;; 433quit) 434execrm-rf"$state_dir" 435;; 436edit-todo) 437 run_specific_rebase 438;; 439show-current-patch) 440 run_specific_rebase 441 die "BUG: run_specific_rebase is not supposed to return here" 442;; 443esac 444 445# Make sure no rebase is in progress 446iftest -n"$in_progress" 447then 448 state_dir_base=${state_dir##*/} 449 cmd_live_rebase="git rebase (--continue | --abort | --skip)" 450 cmd_clear_stale_rebase="rm -fr\"$state_dir\"" 451 die " 452$(eval_gettext 'It seems that there is already a$state_dir_basedirectory, and 453I wonder if you are in the middle of another rebase. If that is the 454case, please try 455$cmd_live_rebase 456If that is not the case, please 457$cmd_clear_stale_rebase 458and run me again. I am stopping in case you still have something 459valuable there.')" 460fi 461 462iftest -n"$rebase_root"&&test -z"$onto" 463then 464test -z"$interactive_rebase"&& interactive_rebase=implied 465fi 466 467iftest -n"$keep_empty" 468then 469test -z"$interactive_rebase"&& interactive_rebase=implied 470fi 471 472iftest -n"$interactive_rebase" 473then 474iftest -z"$preserve_merges" 475then 476type=interactive 477else 478type=preserve-merges 479fi 480 481 state_dir="$merge_dir" 482eliftest -n"$do_merge" 483then 484type=merge 485 state_dir="$merge_dir" 486else 487type=am 488 state_dir="$apply_dir" 489fi 490 491iftest -t2&&test -z"$GIT_QUIET" 492then 493 git_format_patch_opt="$git_format_patch_opt--progress" 494fi 495 496iftest -n"$git_am_opt";then 497 incompatible_opts=$(echo"$git_am_opt"| \ 498sed-e's/ -q / /g'-e's/^ \(.*\) $/\1/') 499iftest -n"$interactive_rebase" 500then 501iftest -n"$incompatible_opts" 502then 503 die "$(gettext "error: cannot combine interactive options (--interactive, --exec, --rebase-merges, --preserve-merges, --keep-empty, --root + --onto)with am options ($incompatible_opts)")" 504 fi 505 fi 506 if test -n "$do_merge"; then 507 if test -n "$incompatible_opts" 508 then 509 die "$(gettext "error: cannot combine merge options (--merge, --strategy, --strategy-option) with am options ($incompatible_opts)")" 510fi 511fi 512fi 513 514iftest -n"$signoff" 515then 516test -n"$preserve_merges"&& 517 die "$(gettext "error: cannot combine '--signoff' with '--preserve-merges'")" 518 git_am_opt="$git_am_opt$signoff" 519 force_rebase=t 520fi 521 522iftest -n"$preserve_merges" 523then 524# Note: incompatibility with --signoff handled in signoff block above 525# Note: incompatibility with --interactive is just a strong warning; 526# git-rebase.txt caveats with "unless you know what you are doing" 527test -n"$rebase_merges"&& 528 die "$(gettext "error: cannot combine '--preserve-merges' with '--rebase-merges'")" 529fi 530 531iftest -n"$rebase_merges" 532then 533test -n"$strategy_opts"&& 534 die "$(gettext "error: cannot combine '--rebase-merges' with '--strategy-option'")" 535test -n"$strategy"&& 536 die "$(gettext "error: cannot combine '--rebase-merges' with '--strategy'")" 537fi 538 539iftest -z"$rebase_root" 540then 541case"$#"in 5420) 543if! upstream_name=$(git rev-parse --symbolic-full-name \ 544--verify -q @{upstream}2>/dev/null) 545then 546 . git-parse-remote 547 error_on_missing_default_upstream "rebase""rebase" \ 548"against""git rebase$(gettext '<branch>')" 549fi 550 551test"$fork_point"= auto && fork_point=t 552;; 553*) upstream_name="$1" 554iftest"$upstream_name"="-" 555then 556 upstream_name="@{-1}" 557fi 558shift 559;; 560esac 561 upstream=$(peel_committish "${upstream_name}")|| 562 die "$(eval_gettext "invalid upstream '\$upstream_name'")" 563 upstream_arg="$upstream_name" 564else 565iftest -z"$onto" 566then 567 empty_tree=$(git hash-object -t tree /dev/null) 568 onto=$(git commit-tree $empty_tree </dev/null) 569 squash_onto="$onto" 570fi 571unset upstream_name 572unset upstream 573test$#-gt1&& usage 574 upstream_arg=--root 575fi 576 577# Make sure the branch to rebase onto is valid. 578onto_name=${onto-"$upstream_name"} 579case"$onto_name"in 580*...*) 581if left=${onto_name%...*} right=${onto_name#*...}&& 582 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD}) 583then 584case"$onto"in 585 ?*"$LF"?*) 586 die "$(eval_gettext "\$onto_name: there are more than one merge bases")" 587;; 588'') 589 die "$(eval_gettext "\$onto_name: there is no merge base")" 590;; 591esac 592else 593 die "$(eval_gettext "\$onto_name: there is no merge base")" 594fi 595;; 596*) 597 onto=$(peel_committish "$onto_name")|| 598 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")" 599;; 600esac 601 602# If the branch to rebase is given, that is the branch we will rebase 603# $branch_name -- branch/commit being rebased, or HEAD (already detached) 604# $orig_head -- commit object name of tip of the branch before rebasing 605# $head_name -- refs/heads/<that-branch> or "detached HEAD" 606switch_to= 607case"$#"in 6081) 609# Is it "rebase other $branchname" or "rebase other $commit"? 610 branch_name="$1" 611 switch_to="$1" 612 613# Is it a local branch? 614if git show-ref --verify --quiet --"refs/heads/$branch_name"&& 615 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name") 616then 617 head_name="refs/heads/$branch_name" 618# If not is it a valid ref (branch or commit)? 619elif orig_head=$(git rev-parse -q --verify "$branch_name") 620then 621 head_name="detached HEAD" 622 623else 624 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")" 625fi 626;; 6270) 628# Do not need to switch branches, we are already on it. 629if branch_name=$(git symbolic-ref -q HEAD) 630then 631 head_name=$branch_name 632 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)') 633 else 634 head_name="detached HEAD" 635 branch_name=HEAD 636 fi 637 orig_head=$(git rev-parse --verify HEAD)|| exit 638 ;; 639*) 640 die "BUG: unexpected number of arguments left to parse" 641 ;; 642esac 643 644if test "$fork_point" = t 645then 646 new_upstream=$(git merge-base --fork-point "$upstream_name" \ 647 "${switch_to:-HEAD}") 648 if test -n "$new_upstream" 649 then 650 restrict_revision=$new_upstream 651 fi 652fi 653 654if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null 655then 656 stash_sha1=$(git stash create "autostash")|| 657 die "$(gettext 'Cannot autostash')" 658 659 mkdir -p "$state_dir" && 660 echo$stash_sha1>"$state_dir/autostash" && 661 stash_abbrev=$(git rev-parse --short $stash_sha1)&& 662 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" && 663 git reset --hard 664fi 665 666require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")" 667 668# Now we are rebasing commits$upstream..$orig_head(or with --root, 669# everything leading up to$orig_head) on top of$onto 670 671# Check if we are already based on$ontowith linear history, 672# but this should be done only when upstream and onto are the same 673# and if this is not an interactive rebase. 674mb=$(git merge-base "$onto" "$orig_head") 675if test -z "$interactive_rebase" && test "$upstream" = "$onto" && 676 test "$mb" = "$onto" && test -z "$restrict_revision" && 677 # linear history? 678 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null 679then 680 if test -z "$force_rebase" 681 then 682 # Lazily switch to the target branch if needed... 683 test -z "$switch_to" || 684 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout$switch_to" \ 685 git checkout -q "$switch_to" -- 686 if test "$branch_name" = "HEAD" && 687 ! git symbolic-ref -q HEAD 688 then 689 say "$(eval_gettext "HEAD is up to date.")" 690 else 691 say "$(eval_gettext "Current branch \$branch_name is up to date.")" 692 fi 693 finish_rebase 694 exit 0 695 else 696 if test "$branch_name" = "HEAD" && 697 ! git symbolic-ref -q HEAD 698 then 699 say "$(eval_gettext "HEAD is up to date, rebase forced.")" 700 else 701 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")" 702 fi 703 fi 704fi 705 706# If a hook exists, give it a chance to interrupt 707run_pre_rebase_hook "$upstream_arg" "$@" 708 709if test -n "$diffstat" 710then 711 if test -n "$verbose" 712 then 713 echo "$(eval_gettext "Changes from \$mb to \$onto:")" 714 fi 715 # We want color (if set), but no pager 716 GIT_PAGER='' git diff --stat --summary "$mb" "$onto" 717fi 718 719test -n "$interactive_rebase" && run_specific_rebase 720 721# Detach HEAD and reset the tree 722say "$(gettext "First, rewinding head to replay your work on top of it...")" 723 724GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout$onto_name" \ 725 git checkout -q "$onto^0" || die "could not detach HEAD" 726git update-ref ORIG_HEAD$orig_head 727 728# If the$ontois a proper descendant of the tip of the branch, then 729# we just fast-forwarded. 730if test "$mb" = "$orig_head" 731then 732 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")" 733 move_to_original_branch 734 finish_rebase 735 exit 0 736fi 737 738if test -n "$rebase_root" 739then 740 revisions="$onto..$orig_head" 741else 742 revisions="${restrict_revision-$upstream}..$orig_head" 743fi 744 745run_specific_rebase