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