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