3 # Copyright (c) 2005 Junio C Hamano.
10 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
11 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
12 git rebase --continue | --abort | --skip | --edit-todo
15 v,verbose! display a diffstat of what changed upstream
16 q,quiet! be quiet. implies --no-stat
17 autostash automatically stash/stash pop before and after
18 fork-point use 'merge-base --fork-point' to refine upstream
19 onto=! rebase onto given branch instead of upstream
20 r,rebase-merges? try to rebase merges instead of skipping them
21 p,preserve-merges! try to recreate merges instead of ignoring them
22 s,strategy=! use the given merge strategy
23 X,strategy-option=! pass the argument through to the merge strategy
24 no-ff! cherry-pick all commits, even if unchanged
25 f,force-rebase! cherry-pick all commits, even if unchanged
26 m,merge! use merging strategies to rebase
27 i,interactive! let the user edit the list of commits to rebase
28 x,exec=! add exec lines after each commit of the editable list
29 k,keep-empty preserve empty commits during rebase
30 allow-empty-message allow rebasing commits with empty messages
31 stat! display a diffstat of what changed upstream
32 n,no-stat! do not show diffstat of what changed upstream
33 verify allow pre-rebase hook to run
34 rerere-autoupdate allow rerere to update index with resolved conflicts
35 root! rebase all reachable commits up to the root(s)
36 autosquash move commits that begin with squash!/fixup! under -i
37 signoff add a Signed-off-by: line to each commit
38 committer-date-is-author-date! passed to 'git am'
39 ignore-date! passed to 'git am'
40 whitespace=! passed to 'git apply'
41 ignore-whitespace! passed to 'git apply'
42 C=! passed to 'git apply'
43 S,gpg-sign? GPG-sign commits
46 abort! abort and check out the original branch
47 skip! skip current patch and continue
48 edit-todo! edit the todo list during an interactive rebase
49 quit! abort but keep HEAD where it is
50 show-current-patch! show the patch file being applied or merged
53 set_reflog_action rebase
54 require_work_tree_exists
59 ok_to_skip_pre_rebase=
61 $(gettext 'Resolve all conflicts manually, mark them as resolved with
62 "git add/rm <conflicted_files>", then run "git rebase --continue".
63 You can instead skip this commit: run "git rebase --skip".
64 To abort and get back to the state before "git rebase", run "git rebase --abort".')
68 unset restrict_revision
73 merge_dir="$GIT_DIR"/rebase-merge
74 apply_dir="$GIT_DIR"/rebase-apply
77 test "$(git config --bool rebase.stat)" = true && diffstat=t
78 autostash="$(git config --bool rebase.autostash || echo false)"
84 allow_rerere_autoupdate=
85 # Non-empty if a rebase was in progress when 'git rebase' was invoked
87 # One of {am, merge, interactive}
89 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
91 # One of {'', continue, skip, abort}, as parsed from command line
100 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
101 case "$(git config --bool commit.gpgsign)" in
102 true) gpg_sign_opt=-S ;;
106 read_basic_state () {
107 test -f "$state_dir/head-name" &&
108 test -f "$state_dir/onto" &&
109 head_name=$(cat "$state_dir"/head-name) &&
110 onto=$(cat "$state_dir"/onto) &&
111 # We always write to orig-head, but interactive rebase used to write to
112 # head. Fall back to reading from head to cover for the case that the
113 # user upgraded git with an ongoing interactive rebase.
114 if test -f "$state_dir"/orig-head
116 orig_head=$(cat "$state_dir"/orig-head)
118 orig_head=$(cat "$state_dir"/head)
120 GIT_QUIET=$(cat "$state_dir"/quiet) &&
121 test -f "$state_dir"/verbose && verbose=t
122 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
123 test -f "$state_dir"/strategy_opts &&
124 strategy_opts="$(cat "$state_dir"/strategy_opts)"
125 test -f "$state_dir"/allow_rerere_autoupdate &&
126 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
127 test -f "$state_dir"/gpg_sign_opt &&
128 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
129 test -f "$state_dir"/signoff && {
130 signoff="$(cat "$state_dir"/signoff)"
135 write_basic_state () {
136 echo "$head_name" > "$state_dir"/head-name &&
137 echo "$onto" > "$state_dir"/onto &&
138 echo "$orig_head" > "$state_dir"/orig-head &&
139 echo "$GIT_QUIET" > "$state_dir"/quiet &&
140 test t = "$verbose" && : > "$state_dir"/verbose
141 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
142 test -n "$strategy_opts" && echo "$strategy_opts" > \
143 "$state_dir"/strategy_opts
144 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
145 "$state_dir"/allow_rerere_autoupdate
146 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
147 test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
155 test $status != 0 && printf "%s\n" "$output"
164 move_to_original_branch () {
167 message="rebase finished: $head_name onto $onto"
168 git update-ref -m "$message" \
169 $head_name $(git rev-parse HEAD) $orig_head &&
171 -m "rebase finished: returning to $head_name" \
173 die "$(eval_gettext "Could not move back to \$head_name")"
179 if test -f "$state_dir/autostash"
181 stash_sha1=$(cat "$state_dir/autostash")
182 if git stash apply $stash_sha1 >/dev/null 2>&1
184 echo "$(gettext 'Applied autostash.')" >&2
186 git stash store -m "autostash" -q $stash_sha1 ||
187 die "$(eval_gettext "Cannot store \$stash_sha1")"
188 gettext 'Applying autostash resulted in conflicts.
189 Your changes are safe in the stash.
190 You can run "git stash pop" or "git stash drop" at any time.
197 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
199 { git gc --auto || true; } &&
203 run_specific_rebase () {
204 if [ "$interactive_rebase" = implied ]; then
210 git_rebase__$type${preserve_merges:+__preserve_merges}
215 elif test $ret -eq 2 # special exit status for rebase -i
218 rm -rf "$state_dir" &&
224 run_pre_rebase_hook () {
225 if test -z "$ok_to_skip_pre_rebase" &&
226 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
228 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
229 die "$(gettext "The pre-rebase hook refused to rebase.")"
233 test -f "$apply_dir"/applying &&
234 die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"
236 if test -d "$apply_dir"
239 state_dir="$apply_dir"
240 elif test -d "$merge_dir"
242 if test -f "$merge_dir"/interactive
245 interactive_rebase=explicit
249 state_dir="$merge_dir"
251 test -n "$type" && in_progress=t
258 ok_to_skip_pre_rebase=yes
261 ok_to_skip_pre_rebase=
263 --continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
264 test $total_argc -eq 2 || usage
271 cmd="${cmd}exec ${1#--exec=}${LF}"
272 test -z "$interactive_rebase" && interactive_rebase=implied
275 interactive_rebase=explicit
280 --allow-empty-message)
281 allow_empty_message=--allow-empty-message
288 test -z "$interactive_rebase" && interactive_rebase=implied
293 rebase-cousins) rebase_cousins=t;;
294 no-rebase-cousins) rebase_cousins=;;
295 *) die "Unknown mode: $1";;
297 test -z "$interactive_rebase" && interactive_rebase=implied
301 test -z "$interactive_rebase" && interactive_rebase=implied
319 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
321 test -z "$strategy" && strategy=recursive
324 strategy="${1#--strategy=}"
346 git_am_opt="$git_am_opt -q"
351 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
352 case "${1#--whitespace=}" in
359 git_am_opt="$git_am_opt $1"
367 --committer-date-is-author-date|--ignore-date)
368 git_am_opt="$git_am_opt $1"
372 git_am_opt="$git_am_opt $1"
377 --force-rebase|--no-ff)
380 --rerere-autoupdate|--no-rerere-autoupdate)
381 allow_rerere_autoupdate="$1"
387 gpg_sign_opt="-S${1#--gpg-sign=}"
399 test $# -gt 2 && usage
403 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
404 # Only interactive rebase uses detailed reflog messages
405 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
407 GIT_REFLOG_ACTION="rebase -i ($action)"
408 export GIT_REFLOG_ACTION
412 if test "$action" = "edit-todo" && test "$type" != "interactive"
414 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
420 git rev-parse --verify HEAD >/dev/null ||
421 die "$(gettext "Cannot read HEAD")"
422 git update-index --ignore-submodules --refresh &&
423 git diff-files --quiet --ignore-submodules || {
424 echo "$(gettext "You must edit all merge conflicts and then
425 mark them as resolved using git add")"
432 output git reset --hard HEAD || exit $?
441 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
442 die "$(eval_gettext "Could not move back to \$head_name")"
445 output git reset --hard $orig_head
450 exec rm -rf "$state_dir"
457 die "BUG: run_specific_rebase is not supposed to return here"
461 # Make sure no rebase is in progress
462 if test -n "$in_progress"
464 state_dir_base=${state_dir##*/}
465 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
466 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
468 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
469 I wonder if you are in the middle of another rebase. If that is the
472 If that is not the case, please
473 $cmd_clear_stale_rebase
474 and run me again. I am stopping in case you still have something
478 if test -n "$rebase_root" && test -z "$onto"
480 test -z "$interactive_rebase" && interactive_rebase=implied
483 if test -n "$keep_empty"
485 test -z "$interactive_rebase" && interactive_rebase=implied
488 if test -n "$interactive_rebase"
491 state_dir="$merge_dir"
492 elif test -n "$do_merge"
495 state_dir="$merge_dir"
498 state_dir="$apply_dir"
501 if test -t 2 && test -z "$GIT_QUIET"
503 git_format_patch_opt="$git_format_patch_opt --progress"
506 if test -n "$git_am_opt"; then
507 incompatible_opts=$(echo " $git_am_opt " | \
508 sed -e 's/ -q / /g' -e 's/^ \(.*\) $/\1/')
509 if test -n "$interactive_rebase"
511 if test -n "$incompatible_opts"
513 die "$(gettext "error: cannot combine interactive options (--interactive, --exec, --rebase-merges, --preserve-merges, --keep-empty, --root + --onto) with am options ($incompatible_opts)")"
516 if test -n "$do_merge"; then
517 if test -n "$incompatible_opts"
519 die "$(gettext "error: cannot combine merge options (--merge, --strategy, --strategy-option) with am options ($incompatible_opts)")"
524 if test -n "$signoff"
526 test -n "$preserve_merges" &&
527 die "$(gettext "error: cannot combine '--signoff' with '--preserve-merges'")"
528 git_am_opt="$git_am_opt $signoff"
532 if test -n "$preserve_merges"
534 # Note: incompatibility with --signoff handled in signoff block above
535 # Note: incompatibility with --interactive is just a strong warning;
536 # git-rebase.txt caveats with "unless you know what you are doing"
537 test -n "$rebase_merges" &&
538 die "$(gettext "error: cannot combine '--preserve_merges' with '--rebase-merges'")"
541 if test -n "$rebase_merges"
543 test -n "$strategy_opts" &&
544 die "$(gettext "error: cannot combine '--rebase_merges' with '--strategy-option'")"
545 test -n "$strategy" &&
546 die "$(gettext "error: cannot combine '--rebase_merges' with '--strategy'")"
549 if test -z "$rebase_root"
553 if ! upstream_name=$(git rev-parse --symbolic-full-name \
554 --verify -q @{upstream} 2>/dev/null)
557 error_on_missing_default_upstream "rebase" "rebase" \
558 "against" "git rebase $(gettext '<branch>')"
561 test "$fork_point" = auto && fork_point=t
563 *) upstream_name="$1"
564 if test "$upstream_name" = "-"
566 upstream_name="@{-1}"
571 upstream=$(peel_committish "${upstream_name}") ||
572 die "$(eval_gettext "invalid upstream '\$upstream_name'")"
573 upstream_arg="$upstream_name"
577 empty_tree=$(git hash-object -t tree /dev/null)
578 onto=$(git commit-tree $empty_tree </dev/null)
583 test $# -gt 1 && usage
587 # Make sure the branch to rebase onto is valid.
588 onto_name=${onto-"$upstream_name"}
591 if left=${onto_name%...*} right=${onto_name#*...} &&
592 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
596 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
599 die "$(eval_gettext "\$onto_name: there is no merge base")"
603 die "$(eval_gettext "\$onto_name: there is no merge base")"
607 onto=$(peel_committish "$onto_name") ||
608 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
612 # If the branch to rebase is given, that is the branch we will rebase
613 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
614 # $orig_head -- commit object name of tip of the branch before rebasing
615 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
619 # Is it "rebase other $branchname" or "rebase other $commit"?
623 # Is it a local branch?
624 if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
625 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
627 head_name="refs/heads/$branch_name"
628 # If not is it a valid ref (branch or commit)?
629 elif orig_head=$(git rev-parse -q --verify "$branch_name")
631 head_name="detached HEAD"
634 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
638 # Do not need to switch branches, we are already on it.
639 if branch_name=$(git symbolic-ref -q HEAD)
641 head_name=$branch_name
642 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
644 head_name="detached HEAD"
647 orig_head=$(git rev-parse --verify HEAD) || exit
650 die "BUG: unexpected number of arguments left to parse"
654 if test "$fork_point" = t
656 new_upstream=$(git merge-base --fork-point "$upstream_name" \
657 "${switch_to:-HEAD}")
658 if test -n "$new_upstream"
660 restrict_revision=$new_upstream
664 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
666 stash_sha1=$(git stash create "autostash") ||
667 die "$(gettext 'Cannot autostash')"
669 mkdir -p "$state_dir" &&
670 echo $stash_sha1 >"$state_dir/autostash" &&
671 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
672 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
676 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
678 # Now we are rebasing commits $upstream..$orig_head (or with --root,
679 # everything leading up to $orig_head) on top of $onto
681 # Check if we are already based on $onto with linear history,
682 # but this should be done only when upstream and onto are the same
683 # and if this is not an interactive rebase.
684 mb=$(git merge-base "$onto" "$orig_head")
685 if test "$type" != interactive && test "$upstream" = "$onto" &&
686 test "$mb" = "$onto" && test -z "$restrict_revision" &&
688 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
690 if test -z "$force_rebase"
692 # Lazily switch to the target branch if needed...
693 test -z "$switch_to" ||
694 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
695 git checkout -q "$switch_to" --
696 if test "$branch_name" = "HEAD" &&
697 ! git symbolic-ref -q HEAD
699 say "$(eval_gettext "HEAD is up to date.")"
701 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
706 if test "$branch_name" = "HEAD" &&
707 ! git symbolic-ref -q HEAD
709 say "$(eval_gettext "HEAD is up to date, rebase forced.")"
711 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
716 # If a hook exists, give it a chance to interrupt
717 run_pre_rebase_hook "$upstream_arg" "$@"
719 if test -n "$diffstat"
721 if test -n "$verbose"
723 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
725 # We want color (if set), but no pager
726 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
729 test "$type" = interactive && run_specific_rebase
731 # Detach HEAD and reset the tree
732 say "$(gettext "First, rewinding head to replay your work on top of it...")"
734 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
735 git checkout -q "$onto^0" || die "could not detach HEAD"
736 git update-ref ORIG_HEAD $orig_head
738 # If the $onto is a proper descendant of the tip of the branch, then
739 # we just fast-forwarded.
740 if test "$mb" = "$orig_head"
742 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
743 move_to_original_branch
748 if test -n "$rebase_root"
750 revisions="$onto..$orig_head"
752 revisions="${restrict_revision-$upstream}..$orig_head"