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