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