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