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 recreate-merges? try to recreate 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 no-ff! cherry-pick all commits, even if unchanged
24 m,merge! use merging strategies to rebase
25 i,interactive! let the user edit the list of commits to rebase
26 x,exec=! add exec lines after each commit of the editable list
27 k,keep-empty preserve empty commits during rebase
28 allow-empty-message allow rebasing commits with empty messages
29 f,force-rebase! force rebase even if branch is up to date
30 X,strategy-option=! pass the argument through to the merge strategy
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 committer-date-is-author-date! passed to 'git am'
38 ignore-date! passed to 'git am'
39 signoff 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".')
67 unset restrict_revision
72 merge_dir="$GIT_DIR"/rebase-merge
73 apply_dir="$GIT_DIR"/rebase-apply
76 test "$(git config --bool rebase.stat)" = true && diffstat=t
77 autostash="$(git config --bool rebase.autostash || echo false)"
83 allow_rerere_autoupdate=
84 # Non-empty if a rebase was in progress when 'git rebase' was invoked
86 # One of {am, merge, interactive}
88 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
90 # One of {'', continue, skip, abort}, as parsed from command line
98 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
99 case "$(git config --bool commit.gpgsign)" in
100 true) gpg_sign_opt=-S ;;
104 read_basic_state () {
105 test -f "$state_dir/head-name" &&
106 test -f "$state_dir/onto" &&
107 head_name=$(cat "$state_dir"/head-name) &&
108 onto=$(cat "$state_dir"/onto) &&
109 # We always write to orig-head, but interactive rebase used to write to
110 # head. Fall back to reading from head to cover for the case that the
111 # user upgraded git with an ongoing interactive rebase.
112 if test -f "$state_dir"/orig-head
114 orig_head=$(cat "$state_dir"/orig-head)
116 orig_head=$(cat "$state_dir"/head)
118 GIT_QUIET=$(cat "$state_dir"/quiet) &&
119 test -f "$state_dir"/verbose && verbose=t
120 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
121 test -f "$state_dir"/strategy_opts &&
122 strategy_opts="$(cat "$state_dir"/strategy_opts)"
123 test -f "$state_dir"/allow_rerere_autoupdate &&
124 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
125 test -f "$state_dir"/gpg_sign_opt &&
126 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
129 write_basic_state () {
130 echo "$head_name" > "$state_dir"/head-name &&
131 echo "$onto" > "$state_dir"/onto &&
132 echo "$orig_head" > "$state_dir"/orig-head &&
133 echo "$GIT_QUIET" > "$state_dir"/quiet &&
134 test t = "$verbose" && : > "$state_dir"/verbose
135 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
136 test -n "$strategy_opts" && echo "$strategy_opts" > \
137 "$state_dir"/strategy_opts
138 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
139 "$state_dir"/allow_rerere_autoupdate
140 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
148 test $status != 0 && printf "%s\n" "$output"
157 move_to_original_branch () {
160 message="rebase finished: $head_name onto $onto"
161 git update-ref -m "$message" \
162 $head_name $(git rev-parse HEAD) $orig_head &&
164 -m "rebase finished: returning to $head_name" \
166 die "$(eval_gettext "Could not move back to \$head_name")"
172 if test -f "$state_dir/autostash"
174 stash_sha1=$(cat "$state_dir/autostash")
175 if git stash apply $stash_sha1 >/dev/null 2>&1
177 echo "$(gettext 'Applied autostash.')" >&2
179 git stash store -m "autostash" -q $stash_sha1 ||
180 die "$(eval_gettext "Cannot store \$stash_sha1")"
181 gettext 'Applying autostash resulted in conflicts.
182 Your changes are safe in the stash.
183 You can run "git stash pop" or "git stash drop" at any time.
190 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
192 { git gc --auto || true; } &&
196 run_specific_rebase () {
197 if [ "$interactive_rebase" = implied ]; then
207 elif test $ret -eq 2 # special exit status for rebase -i
210 rm -rf "$state_dir" &&
216 run_pre_rebase_hook () {
217 if test -z "$ok_to_skip_pre_rebase" &&
218 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
220 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
221 die "$(gettext "The pre-rebase hook refused to rebase.")"
225 test -f "$apply_dir"/applying &&
226 die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"
228 if test -d "$apply_dir"
231 state_dir="$apply_dir"
232 elif test -d "$merge_dir"
234 if test -f "$merge_dir"/interactive
237 interactive_rebase=explicit
241 state_dir="$merge_dir"
243 test -n "$type" && in_progress=t
250 ok_to_skip_pre_rebase=yes
253 ok_to_skip_pre_rebase=
255 --continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
256 test $total_argc -eq 2 || usage
263 cmd="${cmd}exec ${1#--exec=}${LF}"
264 test -z "$interactive_rebase" && interactive_rebase=implied
267 interactive_rebase=explicit
272 --allow-empty-message)
273 allow_empty_message=--allow-empty-message
277 test -z "$interactive_rebase" && interactive_rebase=implied
282 rebase-cousins) rebase_cousins=t;;
283 no-rebase-cousins) rebase_cousins=;;
284 *) die "Unknown mode: $1";;
286 test -z "$interactive_rebase" && interactive_rebase=implied
290 test -z "$interactive_rebase" && interactive_rebase=implied
308 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
310 test -z "$strategy" && strategy=recursive
313 strategy="${1#--strategy=}"
335 git_am_opt="$git_am_opt -q"
340 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
341 case "${1#--whitespace=}" in
348 git_am_opt="$git_am_opt $1"
350 --committer-date-is-author-date|--ignore-date|--signoff|--no-signoff)
351 git_am_opt="$git_am_opt $1"
355 git_am_opt="$git_am_opt $1"
360 --force-rebase|--no-ff)
363 --rerere-autoupdate|--no-rerere-autoupdate)
364 allow_rerere_autoupdate="$1"
370 gpg_sign_opt="-S${1#--gpg-sign=}"
382 test $# -gt 2 && usage
386 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
387 # Only interactive rebase uses detailed reflog messages
388 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
390 GIT_REFLOG_ACTION="rebase -i ($action)"
391 export GIT_REFLOG_ACTION
395 if test "$action" = "edit-todo" && test "$type" != "interactive"
397 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
403 git rev-parse --verify HEAD >/dev/null ||
404 die "$(gettext "Cannot read HEAD")"
405 git update-index --ignore-submodules --refresh &&
406 git diff-files --quiet --ignore-submodules || {
407 echo "$(gettext "You must edit all merge conflicts and then
408 mark them as resolved using git add")"
415 output git reset --hard HEAD || exit $?
424 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
425 die "$(eval_gettext "Could not move back to \$head_name")"
428 output git reset --hard $orig_head
433 exec rm -rf "$state_dir"
440 die "BUG: run_specific_rebase is not supposed to return here"
444 # Make sure no rebase is in progress
445 if test -n "$in_progress"
447 state_dir_base=${state_dir##*/}
448 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
449 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
451 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
452 I wonder if you are in the middle of another rebase. If that is the
455 If that is not the case, please
456 $cmd_clear_stale_rebase
457 and run me again. I am stopping in case you still have something
461 if test -n "$rebase_root" && test -z "$onto"
463 test -z "$interactive_rebase" && interactive_rebase=implied
466 if test -n "$interactive_rebase"
469 state_dir="$merge_dir"
470 elif test -n "$do_merge"
473 state_dir="$merge_dir"
476 state_dir="$apply_dir"
479 if test -t 2 && test -z "$GIT_QUIET"
481 git_format_patch_opt="$git_format_patch_opt --progress"
484 if test -z "$rebase_root"
488 if ! upstream_name=$(git rev-parse --symbolic-full-name \
489 --verify -q @{upstream} 2>/dev/null)
492 error_on_missing_default_upstream "rebase" "rebase" \
493 "against" "git rebase $(gettext '<branch>')"
496 test "$fork_point" = auto && fork_point=t
498 *) upstream_name="$1"
499 if test "$upstream_name" = "-"
501 upstream_name="@{-1}"
506 upstream=$(peel_committish "${upstream_name}") ||
507 die "$(eval_gettext "invalid upstream '\$upstream_name'")"
508 upstream_arg="$upstream_name"
512 empty_tree=$(git hash-object -t tree /dev/null)
513 onto=$(git commit-tree $empty_tree </dev/null)
518 test $# -gt 1 && usage
522 # Make sure the branch to rebase onto is valid.
523 onto_name=${onto-"$upstream_name"}
526 if left=${onto_name%...*} right=${onto_name#*...} &&
527 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
531 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
534 die "$(eval_gettext "\$onto_name: there is no merge base")"
538 die "$(eval_gettext "\$onto_name: there is no merge base")"
542 onto=$(peel_committish "$onto_name") ||
543 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
547 # If the branch to rebase is given, that is the branch we will rebase
548 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
549 # $orig_head -- commit object name of tip of the branch before rebasing
550 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
554 # Is it "rebase other $branchname" or "rebase other $commit"?
558 # Is it a local branch?
559 if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
560 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
562 head_name="refs/heads/$branch_name"
563 # If not is it a valid ref (branch or commit)?
564 elif orig_head=$(git rev-parse -q --verify "$branch_name")
566 head_name="detached HEAD"
569 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
573 # Do not need to switch branches, we are already on it.
574 if branch_name=$(git symbolic-ref -q HEAD)
576 head_name=$branch_name
577 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
579 head_name="detached HEAD"
582 orig_head=$(git rev-parse --verify HEAD) || exit
585 die "BUG: unexpected number of arguments left to parse"
589 if test "$fork_point" = t
591 new_upstream=$(git merge-base --fork-point "$upstream_name" \
592 "${switch_to:-HEAD}")
593 if test -n "$new_upstream"
595 restrict_revision=$new_upstream
599 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
601 stash_sha1=$(git stash create "autostash") ||
602 die "$(gettext 'Cannot autostash')"
604 mkdir -p "$state_dir" &&
605 echo $stash_sha1 >"$state_dir/autostash" &&
606 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
607 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
611 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
613 # Now we are rebasing commits $upstream..$orig_head (or with --root,
614 # everything leading up to $orig_head) on top of $onto
616 # Check if we are already based on $onto with linear history,
617 # but this should be done only when upstream and onto are the same
618 # and if this is not an interactive rebase.
619 mb=$(git merge-base "$onto" "$orig_head")
620 if test "$type" != interactive && test "$upstream" = "$onto" &&
621 test "$mb" = "$onto" && test -z "$restrict_revision" &&
623 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
625 if test -z "$force_rebase"
627 # Lazily switch to the target branch if needed...
628 test -z "$switch_to" ||
629 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
630 git checkout -q "$switch_to" --
631 if test "$branch_name" = "HEAD" &&
632 ! git symbolic-ref -q HEAD
634 say "$(eval_gettext "HEAD is up to date.")"
636 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
641 if test "$branch_name" = "HEAD" &&
642 ! git symbolic-ref -q HEAD
644 say "$(eval_gettext "HEAD is up to date, rebase forced.")"
646 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
651 # If a hook exists, give it a chance to interrupt
652 run_pre_rebase_hook "$upstream_arg" "$@"
654 if test -n "$diffstat"
656 if test -n "$verbose"
658 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
660 # We want color (if set), but no pager
661 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
664 test "$type" = interactive && run_specific_rebase
666 # Detach HEAD and reset the tree
667 say "$(gettext "First, rewinding head to replay your work on top of it...")"
669 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
670 git checkout -q "$onto^0" || die "could not detach HEAD"
671 git update-ref ORIG_HEAD $orig_head
673 # If the $onto is a proper descendant of the tip of the branch, then
674 # we just fast-forwarded.
675 if test "$mb" = "$orig_head"
677 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
678 move_to_original_branch
683 if test -n "$rebase_root"
685 revisions="$onto..$orig_head"
687 revisions="${restrict_revision-$upstream}..$orig_head"