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