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