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
98 allow_empty_message=--allow-empty-message
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
211 if test -z "$preserve_merges"
215 git_rebase__preserve_merges
222 elif test $ret -eq 2 # special exit status for rebase -i
225 rm -rf "$state_dir" &&
231 run_pre_rebase_hook () {
232 if test -z "$ok_to_skip_pre_rebase" &&
233 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
235 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
236 die "$(gettext "The pre-rebase hook refused to rebase.")"
240 test -f "$apply_dir"/applying &&
241 die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"
243 if test -d "$apply_dir"
246 state_dir="$apply_dir"
247 elif test -d "$merge_dir"
249 if test -d "$merge_dir"/rewritten
252 interactive_rebase=explicit
254 elif test -f "$merge_dir"/interactive
257 interactive_rebase=explicit
261 state_dir="$merge_dir"
263 test -n "$type" && in_progress=t
270 ok_to_skip_pre_rebase=yes
273 ok_to_skip_pre_rebase=
275 --continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
276 test $total_argc -eq 2 || usage
283 cmd="${cmd}exec ${1#--exec=}${LF}"
284 test -z "$interactive_rebase" && interactive_rebase=implied
287 interactive_rebase=explicit
292 --allow-empty-message)
293 allow_empty_message=--allow-empty-message
300 test -z "$interactive_rebase" && interactive_rebase=implied
305 rebase-cousins) rebase_cousins=t;;
306 no-rebase-cousins) rebase_cousins=;;
307 *) die "Unknown mode: $1";;
309 test -z "$interactive_rebase" && interactive_rebase=implied
313 test -z "$interactive_rebase" && interactive_rebase=implied
331 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}" | sed -e s/^.//)"
333 test -z "$strategy" && strategy=recursive
336 strategy="${1#--strategy=}"
358 git_am_opt="$git_am_opt -q"
363 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
364 case "${1#--whitespace=}" in
371 git_am_opt="$git_am_opt $1"
379 --committer-date-is-author-date|--ignore-date)
380 git_am_opt="$git_am_opt $1"
384 git_am_opt="$git_am_opt $1"
389 --force-rebase|--no-ff)
392 --rerere-autoupdate|--no-rerere-autoupdate)
393 allow_rerere_autoupdate="$1"
399 gpg_sign_opt="-S${1#--gpg-sign=}"
411 test $# -gt 2 && usage
415 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
416 # Only interactive rebase uses detailed reflog messages
417 if test -n "$interactive_rebase" && test "$GIT_REFLOG_ACTION" = rebase
419 GIT_REFLOG_ACTION="rebase -i ($action)"
420 export GIT_REFLOG_ACTION
424 if test "$action" = "edit-todo" && test -z "$interactive_rebase"
426 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
432 git rev-parse --verify HEAD >/dev/null ||
433 die "$(gettext "Cannot read HEAD")"
434 git update-index --ignore-submodules --refresh &&
435 git diff-files --quiet --ignore-submodules || {
436 echo "$(gettext "You must edit all merge conflicts and then
437 mark them as resolved using git add")"
444 output git reset --hard HEAD || exit $?
453 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
454 die "$(eval_gettext "Could not move back to \$head_name")"
457 output git reset --hard $orig_head
462 exec rm -rf "$state_dir"
469 die "BUG: run_specific_rebase is not supposed to return here"
473 # Make sure no rebase is in progress
474 if test -n "$in_progress"
476 state_dir_base=${state_dir##*/}
477 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
478 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
480 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
481 I wonder if you are in the middle of another rebase. If that is the
484 If that is not the case, please
485 $cmd_clear_stale_rebase
486 and run me again. I am stopping in case you still have something
490 if test -n "$rebase_root" && test -z "$onto"
492 test -z "$interactive_rebase" && interactive_rebase=implied
495 if test -n "$keep_empty"
497 test -z "$interactive_rebase" && interactive_rebase=implied
500 if test -n "$interactive_rebase"
502 if test -z "$preserve_merges"
509 state_dir="$merge_dir"
510 elif test -n "$do_merge"
513 state_dir="$merge_dir"
516 state_dir="$apply_dir"
519 if test -t 2 && test -z "$GIT_QUIET"
521 git_format_patch_opt="$git_format_patch_opt --progress"
524 if test -n "$git_am_opt"; then
525 incompatible_opts=$(echo " $git_am_opt " | \
526 sed -e 's/ -q / /g' -e 's/^ \(.*\) $/\1/')
527 if test -n "$interactive_rebase"
529 if test -n "$incompatible_opts"
531 die "$(gettext "error: cannot combine interactive options (--interactive, --exec, --rebase-merges, --preserve-merges, --keep-empty, --root + --onto) with am options ($incompatible_opts)")"
534 if test -n "$do_merge"; then
535 if test -n "$incompatible_opts"
537 die "$(gettext "error: cannot combine merge options (--merge, --strategy, --strategy-option) with am options ($incompatible_opts)")"
542 if test -n "$signoff"
544 test -n "$preserve_merges" &&
545 die "$(gettext "error: cannot combine '--signoff' with '--preserve-merges'")"
546 git_am_opt="$git_am_opt $signoff"
550 if test -n "$preserve_merges"
552 # Note: incompatibility with --signoff handled in signoff block above
553 # Note: incompatibility with --interactive is just a strong warning;
554 # git-rebase.txt caveats with "unless you know what you are doing"
555 test -n "$rebase_merges" &&
556 die "$(gettext "error: cannot combine '--preserve_merges' with '--rebase-merges'")"
559 if test -n "$rebase_merges"
561 test -n "$strategy_opts" &&
562 die "$(gettext "error: cannot combine '--rebase_merges' with '--strategy-option'")"
563 test -n "$strategy" &&
564 die "$(gettext "error: cannot combine '--rebase_merges' with '--strategy'")"
567 if test -z "$rebase_root"
571 if ! upstream_name=$(git rev-parse --symbolic-full-name \
572 --verify -q @{upstream} 2>/dev/null)
575 error_on_missing_default_upstream "rebase" "rebase" \
576 "against" "git rebase $(gettext '<branch>')"
579 test "$fork_point" = auto && fork_point=t
581 *) upstream_name="$1"
582 if test "$upstream_name" = "-"
584 upstream_name="@{-1}"
589 upstream=$(peel_committish "${upstream_name}") ||
590 die "$(eval_gettext "invalid upstream '\$upstream_name'")"
591 upstream_arg="$upstream_name"
595 empty_tree=$(git hash-object -t tree /dev/null)
596 onto=$(git commit-tree $empty_tree </dev/null)
601 test $# -gt 1 && usage
605 # Make sure the branch to rebase onto is valid.
606 onto_name=${onto-"$upstream_name"}
609 if left=${onto_name%...*} right=${onto_name#*...} &&
610 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
614 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
617 die "$(eval_gettext "\$onto_name: there is no merge base")"
621 die "$(eval_gettext "\$onto_name: there is no merge base")"
625 onto=$(peel_committish "$onto_name") ||
626 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
630 # If the branch to rebase is given, that is the branch we will rebase
631 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
632 # $orig_head -- commit object name of tip of the branch before rebasing
633 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
637 # Is it "rebase other $branchname" or "rebase other $commit"?
641 # Is it a local branch?
642 if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
643 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
645 head_name="refs/heads/$branch_name"
646 # If not is it a valid ref (branch or commit)?
647 elif orig_head=$(git rev-parse -q --verify "$branch_name")
649 head_name="detached HEAD"
652 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
656 # Do not need to switch branches, we are already on it.
657 if branch_name=$(git symbolic-ref -q HEAD)
659 head_name=$branch_name
660 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
662 head_name="detached HEAD"
665 orig_head=$(git rev-parse --verify HEAD) || exit
668 die "BUG: unexpected number of arguments left to parse"
672 if test "$fork_point" = t
674 new_upstream=$(git merge-base --fork-point "$upstream_name" \
675 "${switch_to:-HEAD}")
676 if test -n "$new_upstream"
678 restrict_revision=$new_upstream
682 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
684 stash_sha1=$(git stash create "autostash") ||
685 die "$(gettext 'Cannot autostash')"
687 mkdir -p "$state_dir" &&
688 echo $stash_sha1 >"$state_dir/autostash" &&
689 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
690 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
694 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
696 # Now we are rebasing commits $upstream..$orig_head (or with --root,
697 # everything leading up to $orig_head) on top of $onto
699 # Check if we are already based on $onto with linear history,
700 # but this should be done only when upstream and onto are the same
701 # and if this is not an interactive rebase.
702 mb=$(git merge-base "$onto" "$orig_head")
703 if test -z "$interactive_rebase" && test "$upstream" = "$onto" &&
704 test "$mb" = "$onto" && test -z "$restrict_revision" &&
706 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
708 if test -z "$force_rebase"
710 # Lazily switch to the target branch if needed...
711 test -z "$switch_to" ||
712 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
713 git checkout -q "$switch_to" --
714 if test "$branch_name" = "HEAD" &&
715 ! git symbolic-ref -q HEAD
717 say "$(eval_gettext "HEAD is up to date.")"
719 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
724 if test "$branch_name" = "HEAD" &&
725 ! git symbolic-ref -q HEAD
727 say "$(eval_gettext "HEAD is up to date, rebase forced.")"
729 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
734 # If a hook exists, give it a chance to interrupt
735 run_pre_rebase_hook "$upstream_arg" "$@"
737 if test -n "$diffstat"
739 if test -n "$verbose"
741 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
743 # We want color (if set), but no pager
744 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
747 test -n "$interactive_rebase" && run_specific_rebase
749 # Detach HEAD and reset the tree
750 say "$(gettext "First, rewinding head to replay your work on top of it...")"
752 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
753 git checkout -q "$onto^0" || die "could not detach HEAD"
754 git update-ref ORIG_HEAD $orig_head
756 # If the $onto is a proper descendant of the tip of the branch, then
757 # we just fast-forwarded.
758 if test "$mb" = "$orig_head"
760 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
761 move_to_original_branch
766 if test -n "$rebase_root"
768 revisions="$onto..$orig_head"
770 revisions="${restrict_revision-$upstream}..$orig_head"