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".')
63 merge_dir="$GIT_DIR"/rebase-merge
64 apply_dir="$GIT_DIR"/rebase-apply
67 test "$(git config --bool rebase.stat)" = true && diffstat=t
68 autostash="$(git config --bool rebase.autostash || echo false)"
73 allow_rerere_autoupdate=
74 # Non-empty if a rebase was in progress when 'git rebase' was invoked
76 # One of {am, merge, interactive}
78 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
80 # One of {'', continue, skip, abort}, as parsed from command line
85 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
88 test -f "$state_dir/head-name" &&
89 test -f "$state_dir/onto" &&
90 head_name=$(cat "$state_dir"/head-name) &&
91 onto=$(cat "$state_dir"/onto) &&
92 # We always write to orig-head, but interactive rebase used to write to
93 # head. Fall back to reading from head to cover for the case that the
94 # user upgraded git with an ongoing interactive rebase.
95 if test -f "$state_dir"/orig-head
97 orig_head=$(cat "$state_dir"/orig-head)
99 orig_head=$(cat "$state_dir"/head)
101 GIT_QUIET=$(cat "$state_dir"/quiet) &&
102 test -f "$state_dir"/verbose && verbose=t
103 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
104 test -f "$state_dir"/strategy_opts &&
105 strategy_opts="$(cat "$state_dir"/strategy_opts)"
106 test -f "$state_dir"/allow_rerere_autoupdate &&
107 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
110 write_basic_state () {
111 echo "$head_name" > "$state_dir"/head-name &&
112 echo "$onto" > "$state_dir"/onto &&
113 echo "$orig_head" > "$state_dir"/orig-head &&
114 echo "$GIT_QUIET" > "$state_dir"/quiet &&
115 test t = "$verbose" && : > "$state_dir"/verbose
116 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
117 test -n "$strategy_opts" && echo "$strategy_opts" > \
118 "$state_dir"/strategy_opts
119 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
120 "$state_dir"/allow_rerere_autoupdate
128 test $status != 0 && printf "%s\n" "$output"
137 move_to_original_branch () {
140 message="rebase finished: $head_name onto $onto"
141 git update-ref -m "$message" \
142 $head_name $(git rev-parse HEAD) $orig_head &&
144 -m "rebase finished: returning to $head_name" \
146 die "$(gettext "Could not move back to $head_name")"
152 if test -f "$state_dir/autostash"
154 stash_sha1=$(cat "$state_dir/autostash")
155 if git stash apply $stash_sha1 2>&1 >/dev/null
157 echo "$(gettext 'Applied autostash.')"
159 git stash store -m "autostash" -q $stash_sha1 ||
160 die "$(eval_gettext "Cannot store \$stash_sha1")"
161 gettext 'Applying autostash resulted in conflicts.
162 Your changes are safe in the stash.
163 You can run "git stash pop" or "git stash drop" at any time.
171 run_specific_rebase_internal () {
172 if [ "$interactive_rebase" = implied ]; then
177 # On FreeBSD, the shell's "return" returns from the current
178 # function, not from the current file inclusion.
179 # run_specific_rebase_internal has the file inclusion as a
180 # last statement, so POSIX and FreeBSD's return will do the
185 run_specific_rebase () {
186 run_specific_rebase_internal
195 run_pre_rebase_hook () {
196 if test -z "$ok_to_skip_pre_rebase" &&
197 test -x "$GIT_DIR/hooks/pre-rebase"
199 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
200 die "$(gettext "The pre-rebase hook refused to rebase.")"
204 test -f "$apply_dir"/applying &&
205 die "$(gettext "It looks like git-am is in progress. Cannot rebase.")"
207 if test -d "$apply_dir"
210 state_dir="$apply_dir"
211 elif test -d "$merge_dir"
213 if test -f "$merge_dir"/interactive
216 interactive_rebase=explicit
220 state_dir="$merge_dir"
222 test -n "$type" && in_progress=t
229 ok_to_skip_pre_rebase=yes
232 ok_to_skip_pre_rebase=
234 --continue|--skip|--abort|--edit-todo)
235 test $total_argc -eq 2 || usage
239 test 2 -le "$#" || usage
244 test 2 -le "$#" || usage
245 cmd="${cmd}exec $2${LF}"
249 interactive_rebase=explicit
256 test -z "$interactive_rebase" && interactive_rebase=implied
274 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")"
275 test -z "$strategy" && strategy=recursive
302 git_am_opt="$git_am_opt --whitespace=$1"
310 git_am_opt="$git_am_opt $1"
312 --committer-date-is-author-date|--ignore-date)
313 git_am_opt="$git_am_opt $1"
318 git_am_opt="$git_am_opt -C$1"
326 --rerere-autoupdate|--no-rerere-autoupdate)
327 allow_rerere_autoupdate="$1"
336 test $# -gt 2 && usage
339 test "$interactive_rebase" != explicit
341 die "$(gettext "The --exec option must be used with the --interactive option")"
346 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
347 # Only interactive rebase uses detailed reflog messages
348 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
350 GIT_REFLOG_ACTION="rebase -i ($action)"
351 export GIT_REFLOG_ACTION
355 if test "$action" = "edit-todo" && test "$type" != "interactive"
357 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
363 git rev-parse --verify HEAD >/dev/null ||
364 die "$(gettext "Cannot read HEAD")"
365 git update-index --ignore-submodules --refresh &&
366 git diff-files --quiet --ignore-submodules || {
367 echo "$(gettext "You must edit all merge conflicts and then
368 mark them as resolved using git add")"
375 output git reset --hard HEAD || exit $?
380 test "$type" == "cherrypick" && git cherry-pick --abort
385 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
386 die "$(eval_gettext "Could not move back to \$head_name")"
389 output git reset --hard $orig_head
398 # Make sure no rebase is in progress
399 if test -n "$in_progress"
401 state_dir_base=${state_dir##*/}
402 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
403 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
405 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
406 I wonder if you are in the middle of another rebase. If that is the
409 If that is not the case, please
410 $cmd_clear_stale_rebase
411 and run me again. I am stopping in case you still have something
415 if test -n "$rebase_root" && test -z "$onto"
417 test -z "$interactive_rebase" && interactive_rebase=implied
420 if test -n "$interactive_rebase"
423 state_dir="$merge_dir"
424 elif test -n "$git_am_opt"
427 state_dir="$apply_dir"
430 state_dir="$merge_dir"
433 if test -z "$rebase_root"
437 if ! upstream_name=$(git rev-parse --symbolic-full-name \
438 --verify -q @{upstream} 2>/dev/null)
441 error_on_missing_default_upstream "rebase" "rebase" \
442 "against" "git rebase <branch>"
445 test "$fork_point" = auto && fork_point=t
447 *) upstream_name="$1"
451 upstream=$(peel_committish "${upstream_name}") ||
452 die "$(eval_gettext "invalid upstream \$upstream_name")"
453 upstream_arg="$upstream_name"
457 empty_tree=`git hash-object -t tree /dev/null`
458 onto=`git commit-tree $empty_tree </dev/null`
463 test $# -gt 1 && usage
467 # Make sure the branch to rebase onto is valid.
468 onto_name=${onto-"$upstream_name"}
471 if left=${onto_name%...*} right=${onto_name#*...} &&
472 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
476 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
479 die "$(eval_gettext "\$onto_name: there is no merge base")"
483 die "$(eval_gettext "\$onto_name: there is no merge base")"
487 onto=$(peel_committish "$onto_name") ||
488 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
492 # If the branch to rebase is given, that is the branch we will rebase
493 # $branch_name -- branch being rebased, or HEAD (already detached)
494 # $orig_head -- commit object name of tip of the branch before rebasing
495 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
499 # Is it "rebase other $branchname" or "rebase other $commit"?
503 if git show-ref --verify --quiet -- "refs/heads/$1" &&
504 orig_head=$(git rev-parse -q --verify "refs/heads/$1")
506 head_name="refs/heads/$1"
507 elif orig_head=$(git rev-parse -q --verify "$1")
509 head_name="detached HEAD"
511 die "$(eval_gettext "fatal: no such branch: \$branch_name")"
515 # Do not need to switch branches, we are already on it.
516 if branch_name=`git symbolic-ref -q HEAD`
518 head_name=$branch_name
519 branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
521 head_name="detached HEAD"
522 branch_name=HEAD ;# detached
524 orig_head=$(git rev-parse --verify HEAD) || exit
527 die "BUG: unexpected number of arguments left to parse"
531 if test "$fork_point" = t
533 new_upstream=$(git merge-base --fork-point "$upstream_name" \
534 "${switch_to:-HEAD}")
535 if test -n "$new_upstream"
537 upstream=$new_upstream
541 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
543 stash_sha1=$(git stash create "autostash") ||
544 die "$(gettext 'Cannot autostash')"
546 mkdir -p "$state_dir" &&
547 echo $stash_sha1 >"$state_dir/autostash" &&
548 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
549 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
553 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
555 # Now we are rebasing commits $upstream..$orig_head (or with --root,
556 # everything leading up to $orig_head) on top of $onto
558 # Check if we are already based on $onto with linear history,
559 # but this should be done only when upstream and onto are the same
560 # and if this is not an interactive rebase.
561 mb=$(git merge-base "$onto" "$orig_head")
562 if test "$type" != interactive && test "$upstream" = "$onto" &&
563 test "$mb" = "$onto" &&
565 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
567 if test -z "$force_rebase"
569 # Lazily switch to the target branch if needed...
570 test -z "$switch_to" ||
571 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
572 git checkout "$switch_to" --
573 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
577 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
581 # If a hook exists, give it a chance to interrupt
582 run_pre_rebase_hook "$upstream_arg" "$@"
584 if test -n "$diffstat"
586 if test -n "$verbose"
588 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
590 # We want color (if set), but no pager
591 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
594 test "$type" = interactive && run_specific_rebase
596 # Detach HEAD and reset the tree
597 say "$(gettext "First, rewinding head to replay your work on top of it...")"
599 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
600 git checkout -q "$onto^0" || die "could not detach HEAD"
601 git update-ref ORIG_HEAD $orig_head
603 # If the $onto is a proper descendant of the tip of the branch, then
604 # we just fast-forwarded.
605 if test "$mb" = "$orig_head"
607 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
608 move_to_original_branch
613 if test -n "$rebase_root"
615 revisions="$onto..$orig_head"
617 revisions="$upstream..$orig_head"