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