3 # Copyright (c) 2005 Junio C Hamano.
9 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
10 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
11 git-rebase --continue | --abort | --skip | --edit-todo
14 v,verbose! display a diffstat of what changed upstream
15 q,quiet! be quiet. implies --no-stat
16 autostash! automatically stash/stash pop before and after
17 fork-point use 'merge-base --fork-point' to refine upstream
18 onto=! rebase onto given branch instead of upstream
19 p,preserve-merges! try to recreate merges instead of ignoring them
20 s,strategy=! use the given merge strategy
21 no-ff! cherry-pick all commits, even if unchanged
22 m,merge! use merging strategies to rebase
23 i,interactive! let the user edit the list of commits to rebase
24 x,exec=! add exec lines after each commit of the editable list
25 k,keep-empty preserve empty commits during rebase
26 f,force-rebase! force rebase even if branch is up to date
27 X,strategy-option=! pass the argument through to the merge strategy
28 stat! display a diffstat of what changed upstream
29 n,no-stat! do not show diffstat of what changed upstream
30 verify allow pre-rebase hook to run
31 rerere-autoupdate allow rerere to update index with resolved conflicts
32 root! rebase all reachable commits up to the root(s)
33 autosquash move commits that begin with squash!/fixup! under -i
34 committer-date-is-author-date! passed to 'git am'
35 ignore-date! passed to 'git am'
36 whitespace=! passed to 'git apply'
37 ignore-whitespace! passed to 'git apply'
38 C=! passed to 'git apply'
41 abort! abort and check out the original branch
42 skip! skip current patch and continue
43 edit-todo! edit the todo list during an interactive rebase
47 set_reflog_action rebase
48 require_work_tree_exists
53 ok_to_skip_pre_rebase=
55 $(gettext 'When you have resolved this problem, run "git rebase --continue".
56 If you prefer to skip this patch, run "git rebase --skip" instead.
57 To check out the original branch and stop rebasing, run "git rebase --abort".')
64 merge_dir="$GIT_DIR"/rebase-merge
65 apply_dir="$GIT_DIR"/rebase-apply
68 test "$(git config --bool rebase.stat)" = true && diffstat=t
69 autostash="$(git config --bool rebase.autostash || echo false)"
74 allow_rerere_autoupdate=
75 # Non-empty if a rebase was in progress when 'git rebase' was invoked
77 # One of {am, merge, interactive}
79 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
81 # One of {'', continue, skip, abort}, as parsed from command line
86 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
89 test -f "$state_dir/head-name" &&
90 test -f "$state_dir/onto" &&
91 head_name=$(cat "$state_dir"/head-name) &&
92 onto=$(cat "$state_dir"/onto) &&
93 # We always write to orig-head, but interactive rebase used to write to
94 # head. Fall back to reading from head to cover for the case that the
95 # user upgraded git with an ongoing interactive rebase.
96 if test -f "$state_dir"/orig-head
98 orig_head=$(cat "$state_dir"/orig-head)
100 orig_head=$(cat "$state_dir"/head)
102 GIT_QUIET=$(cat "$state_dir"/quiet) &&
103 test -f "$state_dir"/verbose && verbose=t
104 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
105 test -f "$state_dir"/strategy_opts &&
106 strategy_opts="$(cat "$state_dir"/strategy_opts)"
107 test -f "$state_dir"/allow_rerere_autoupdate &&
108 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
111 write_basic_state () {
112 echo "$head_name" > "$state_dir"/head-name &&
113 echo "$onto" > "$state_dir"/onto &&
114 echo "$orig_head" > "$state_dir"/orig-head &&
115 echo "$GIT_QUIET" > "$state_dir"/quiet &&
116 test t = "$verbose" && : > "$state_dir"/verbose
117 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
118 test -n "$strategy_opts" && echo "$strategy_opts" > \
119 "$state_dir"/strategy_opts
120 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
121 "$state_dir"/allow_rerere_autoupdate
129 test $status != 0 && printf "%s\n" "$output"
138 move_to_original_branch () {
141 message="rebase finished: $head_name onto $onto"
142 git update-ref -m "$message" \
143 $head_name $(git rev-parse HEAD) $orig_head &&
145 -m "rebase finished: returning to $head_name" \
147 git update-ref refs/tails/${branch_name} $(git rev-parse $onto) ||
148 die "$(gettext "Could not move back to $head_name")"
154 if test -f "$state_dir/autostash"
156 stash_sha1=$(cat "$state_dir/autostash")
157 if git stash apply $stash_sha1 2>&1 >/dev/null
159 echo "$(gettext 'Applied autostash.')"
161 git stash store -m "autostash" -q $stash_sha1 ||
162 die "$(eval_gettext "Cannot store \$stash_sha1")"
163 gettext 'Applying autostash resulted in conflicts.
164 Your changes are safe in the stash.
165 You can run "git stash pop" or "git stash drop" at any time.
173 run_specific_rebase_internal () {
174 if [ "$interactive_rebase" = implied ]; then
179 # On FreeBSD, the shell's "return" returns from the current
180 # function, not from the current file inclusion.
181 # run_specific_rebase_internal has the file inclusion as a
182 # last statement, so POSIX and FreeBSD's return will do the
187 run_specific_rebase () {
188 run_specific_rebase_internal
197 run_pre_rebase_hook () {
198 if test -z "$ok_to_skip_pre_rebase" &&
199 test -x "$GIT_DIR/hooks/pre-rebase"
201 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
202 die "$(gettext "The pre-rebase hook refused to rebase.")"
206 test -f "$apply_dir"/applying &&
207 die "$(gettext "It looks like git-am is in progress. Cannot rebase.")"
209 if test -d "$apply_dir"
212 state_dir="$apply_dir"
213 elif test -d "$merge_dir"
215 if test -f "$merge_dir"/interactive
218 interactive_rebase=explicit
222 state_dir="$merge_dir"
224 test -n "$type" && in_progress=t
231 ok_to_skip_pre_rebase=yes
234 ok_to_skip_pre_rebase=
236 --continue|--skip|--abort|--edit-todo)
237 test $total_argc -eq 2 || usage
241 test 2 -le "$#" || usage
246 test 2 -le "$#" || usage
247 cmd="${cmd}exec $2${LF}"
251 interactive_rebase=explicit
258 test -z "$interactive_rebase" && interactive_rebase=implied
277 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")"
279 test -z "$strategy" && strategy=recursive
302 git_am_opt="$git_am_opt -q"
308 git_am_opt="$git_am_opt --whitespace=$1"
316 git_am_opt="$git_am_opt $1"
318 --committer-date-is-author-date|--ignore-date)
319 git_am_opt="$git_am_opt $1"
324 git_am_opt="$git_am_opt -C$1"
332 --rerere-autoupdate|--no-rerere-autoupdate)
333 allow_rerere_autoupdate="$1"
342 test $# -gt 2 && usage
345 test "$interactive_rebase" != explicit
347 die "$(gettext "The --exec option must be used with the --interactive option")"
352 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
353 # Only interactive rebase uses detailed reflog messages
354 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
356 GIT_REFLOG_ACTION="rebase -i ($action)"
357 export GIT_REFLOG_ACTION
361 if test "$action" = "edit-todo" && test "$type" != "interactive"
363 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
369 git rev-parse --verify HEAD >/dev/null ||
370 die "$(gettext "Cannot read HEAD")"
371 git update-index --ignore-submodules --refresh &&
372 git diff-files --quiet --ignore-submodules || {
373 echo "$(gettext "You must edit all merge conflicts and then
374 mark them as resolved using git add")"
381 output git reset --hard HEAD || exit $?
390 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
391 die "$(eval_gettext "Could not move back to \$head_name")"
394 output git reset --hard $orig_head
403 # Make sure no rebase is in progress
404 if test -n "$in_progress"
406 state_dir_base=${state_dir##*/}
407 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
408 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
410 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
411 I wonder if you are in the middle of another rebase. If that is the
414 If that is not the case, please
415 $cmd_clear_stale_rebase
416 and run me again. I am stopping in case you still have something
420 if test -n "$rebase_root" && test -z "$onto"
422 test -z "$interactive_rebase" && interactive_rebase=implied
425 if test -n "$interactive_rebase"
428 state_dir="$merge_dir"
429 elif test -n "$do_merge"
432 state_dir="$merge_dir"
435 state_dir="$apply_dir"
438 if test -z "$rebase_root"
442 if ! upstream_name=$(git rev-parse --symbolic-full-name \
443 --verify -q @{upstream} 2>/dev/null)
446 error_on_missing_default_upstream "rebase" "rebase" \
447 "against" "git rebase <branch>"
450 test "$fork_point" = auto && fork_point=t
452 *) upstream_name="$1"
456 upstream=$(peel_committish "${upstream_name}") ||
457 die "$(eval_gettext "invalid upstream \$upstream_name")"
458 upstream_arg="$upstream_name"
462 empty_tree=`git hash-object -t tree /dev/null`
463 onto=`git commit-tree $empty_tree </dev/null`
468 test $# -gt 1 && usage
472 # Make sure the branch to rebase onto is valid.
473 onto_name=${onto-"$upstream_name"}
476 if left=${onto_name%...*} right=${onto_name#*...} &&
477 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
481 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
484 die "$(eval_gettext "\$onto_name: there is no merge base")"
488 die "$(eval_gettext "\$onto_name: there is no merge base")"
492 onto=$(peel_committish "$onto_name") ||
493 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
497 # If the branch to rebase is given, that is the branch we will rebase
498 # $branch_name -- branch being rebased, or HEAD (already detached)
499 # $orig_head -- commit object name of tip of the branch before rebasing
500 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
504 # Is it "rebase other $branchname" or "rebase other $commit"?
508 if git show-ref --verify --quiet -- "refs/heads/$1" &&
509 orig_head=$(git rev-parse -q --verify "refs/heads/$1")
511 head_name="refs/heads/$1"
512 elif orig_head=$(git rev-parse -q --verify "$1")
514 head_name="detached HEAD"
516 die "$(eval_gettext "fatal: no such branch: \$branch_name")"
520 # Do not need to switch branches, we are already on it.
521 if branch_name=`git symbolic-ref -q HEAD`
523 head_name=$branch_name
524 branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
526 head_name="detached HEAD"
527 branch_name=HEAD ;# detached
529 orig_head=$(git rev-parse --verify HEAD) || exit
532 die "BUG: unexpected number of arguments left to parse"
536 if test "$fork_point" = t
538 new_upstream=$(git merge-base --fork-point "$upstream_name" \
539 "${switch_to:-HEAD}")
540 if test -n "$new_upstream"
542 upstream=$new_upstream
546 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
548 stash_sha1=$(git stash create "autostash") ||
549 die "$(gettext 'Cannot autostash')"
551 mkdir -p "$state_dir" &&
552 echo $stash_sha1 >"$state_dir/autostash" &&
553 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
554 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
558 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
560 # Now we are rebasing commits $upstream..$orig_head (or with --root,
561 # everything leading up to $orig_head) on top of $onto
563 # Check if we are already based on $onto with linear history,
564 # but this should be done only when upstream and onto are the same
565 # and if this is not an interactive rebase.
566 mb=$(git merge-base "$onto" "$orig_head")
567 if test "$type" != interactive && test "$upstream" = "$onto" &&
568 test "$mb" = "$onto" &&
570 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
572 if test -z "$force_rebase"
574 # Lazily switch to the target branch if needed...
575 test -z "$switch_to" ||
576 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
577 git checkout "$switch_to" --
578 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
582 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
586 # If a hook exists, give it a chance to interrupt
587 run_pre_rebase_hook "$upstream_arg" "$@"
589 if test -n "$diffstat"
591 if test -n "$verbose"
593 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
595 # We want color (if set), but no pager
596 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
599 test "$type" = interactive && run_specific_rebase
601 # Detach HEAD and reset the tree
602 say "$(gettext "First, rewinding head to replay your work on top of it...")"
604 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
605 git checkout -q "$onto^0" || die "could not detach HEAD"
606 git update-ref ORIG_HEAD $orig_head
608 # If the $onto is a proper descendant of the tip of the branch, then
609 # we just fast-forwarded.
610 if test "$mb" = "$orig_head"
612 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
613 move_to_original_branch
618 if test -n "$rebase_root"
620 revisions="$onto..$orig_head"
622 revisions="$upstream..$orig_head"