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 onto=! rebase onto given branch instead of upstream
18 p,preserve-merges! try to recreate merges instead of ignoring them
19 s,strategy=! use the given merge strategy
20 no-ff! cherry-pick all commits, even if unchanged
21 m,merge! use merging strategies to rebase
22 i,interactive! let the user edit the list of commits to rebase
23 x,exec=! add exec lines after each commit of the editable list
24 k,keep-empty preserve empty commits during rebase
25 f,force-rebase! force rebase even if branch is up to date
26 X,strategy-option=! pass the argument through to the merge strategy
27 stat! display a diffstat of what changed upstream
28 n,no-stat! do not show diffstat of what changed upstream
29 verify allow pre-rebase hook to run
30 rerere-autoupdate allow rerere to update index with resolved conflicts
31 root! rebase all reachable commits up to the root(s)
32 autosquash move commits that begin with squash!/fixup! under -i
33 committer-date-is-author-date! passed to 'git am'
34 ignore-date! passed to 'git am'
35 whitespace=! passed to 'git apply'
36 ignore-whitespace! passed to 'git apply'
37 C=! passed to 'git apply'
40 abort! abort and check out the original branch
41 skip! skip current patch and continue
42 edit-todo! edit the todo list during an interactive rebase
46 set_reflog_action rebase
47 require_work_tree_exists
52 ok_to_skip_pre_rebase=
54 $(gettext 'When you have resolved this problem, run "git rebase --continue".
55 If you prefer to skip this patch, run "git rebase --skip" instead.
56 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)"
72 allow_rerere_autoupdate=
73 # Non-empty if a rebase was in progress when 'git rebase' was invoked
75 # One of {am, merge, interactive}
77 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
79 # One of {'', continue, skip, abort}, as parsed from command line
84 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
87 test -f "$state_dir/head-name" &&
88 test -f "$state_dir/onto" &&
89 head_name=$(cat "$state_dir"/head-name) &&
90 onto=$(cat "$state_dir"/onto) &&
91 # We always write to orig-head, but interactive rebase used to write to
92 # head. Fall back to reading from head to cover for the case that the
93 # user upgraded git with an ongoing interactive rebase.
94 if test -f "$state_dir"/orig-head
96 orig_head=$(cat "$state_dir"/orig-head)
98 orig_head=$(cat "$state_dir"/head)
100 GIT_QUIET=$(cat "$state_dir"/quiet) &&
101 test -f "$state_dir"/verbose && verbose=t
102 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
103 test -f "$state_dir"/strategy_opts &&
104 strategy_opts="$(cat "$state_dir"/strategy_opts)"
105 test -f "$state_dir"/allow_rerere_autoupdate &&
106 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
109 write_basic_state () {
110 echo "$head_name" > "$state_dir"/head-name &&
111 echo "$onto" > "$state_dir"/onto &&
112 echo "$orig_head" > "$state_dir"/orig-head &&
113 echo "$GIT_QUIET" > "$state_dir"/quiet &&
114 test t = "$verbose" && : > "$state_dir"/verbose
115 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
116 test -n "$strategy_opts" && echo "$strategy_opts" > \
117 "$state_dir"/strategy_opts
118 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
119 "$state_dir"/allow_rerere_autoupdate
127 test $status != 0 && printf "%s\n" "$output"
136 move_to_original_branch () {
139 message="rebase finished: $head_name onto $onto"
140 git update-ref -m "$message" \
141 $head_name $(git rev-parse HEAD) $orig_head &&
143 -m "rebase finished: returning to $head_name" \
145 die "$(gettext "Could not move back to $head_name")"
151 if test -f "$state_dir/autostash"
153 stash_sha1=$(cat "$state_dir/autostash")
154 if git stash apply $stash_sha1 2>&1 >/dev/null
156 echo "$(gettext 'Applied autostash.')"
158 ref_stash=refs/stash &&
159 >>"$GIT_DIR/logs/$ref_stash" &&
160 git update-ref -m "autostash" $ref_stash $stash_sha1 ||
161 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" it at any time.
173 run_specific_rebase () {
174 if [ "$interactive_rebase" = implied ]; then
188 run_pre_rebase_hook () {
189 if test -z "$ok_to_skip_pre_rebase" &&
190 test -x "$GIT_DIR/hooks/pre-rebase"
192 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
193 die "$(gettext "The pre-rebase hook refused to rebase.")"
197 test -f "$apply_dir"/applying &&
198 die "$(gettext "It looks like git-am is in progress. Cannot rebase.")"
200 if test -d "$apply_dir"
203 state_dir="$apply_dir"
204 elif test -d "$merge_dir"
206 if test -f "$merge_dir"/interactive
209 interactive_rebase=explicit
213 state_dir="$merge_dir"
215 test -n "$type" && in_progress=t
222 ok_to_skip_pre_rebase=yes
225 ok_to_skip_pre_rebase=
227 --continue|--skip|--abort|--edit-todo)
228 test $total_argc -eq 2 || usage
232 test 2 -le "$#" || usage
237 test 2 -le "$#" || usage
238 cmd="${cmd}exec $2${LF}"
242 interactive_rebase=explicit
249 test -z "$interactive_rebase" && interactive_rebase=implied
262 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")"
264 test -z "$strategy" && strategy=recursive
287 git_am_opt="$git_am_opt -q"
293 git_am_opt="$git_am_opt --whitespace=$1"
301 git_am_opt="$git_am_opt $1"
303 --committer-date-is-author-date|--ignore-date)
304 git_am_opt="$git_am_opt $1"
309 git_am_opt="$git_am_opt -C$1"
317 --rerere-autoupdate|--no-rerere-autoupdate)
318 allow_rerere_autoupdate="$1"
327 test $# -gt 2 && usage
330 test "$interactive_rebase" != explicit
332 die "$(gettext "The --exec option must be used with the --interactive option")"
337 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
338 # Only interactive rebase uses detailed reflog messages
339 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
341 GIT_REFLOG_ACTION="rebase -i ($action)"
342 export GIT_REFLOG_ACTION
346 if test "$action" = "edit-todo" && test "$type" != "interactive"
348 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
354 git rev-parse --verify HEAD >/dev/null ||
355 die "$(gettext "Cannot read HEAD")"
356 git update-index --ignore-submodules --refresh &&
357 git diff-files --quiet --ignore-submodules || {
358 echo "$(gettext "You must edit all merge conflicts and then
359 mark them as resolved using git add")"
366 output git reset --hard HEAD || exit $?
375 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
376 die "$(eval_gettext "Could not move back to \$head_name")"
379 output git reset --hard $orig_head
388 # Make sure no rebase is in progress
389 if test -n "$in_progress"
391 state_dir_base=${state_dir##*/}
392 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
393 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
395 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
396 I wonder if you are in the middle of another rebase. If that is the
399 If that is not the case, please
400 $cmd_clear_stale_rebase
401 and run me again. I am stopping in case you still have something
405 if test -n "$rebase_root" && test -z "$onto"
407 test -z "$interactive_rebase" && interactive_rebase=implied
410 if test -n "$interactive_rebase"
413 state_dir="$merge_dir"
414 elif test -n "$do_merge"
417 state_dir="$merge_dir"
420 state_dir="$apply_dir"
423 if test -z "$rebase_root"
427 if ! upstream_name=$(git rev-parse --symbolic-full-name \
428 --verify -q @{upstream} 2>/dev/null)
431 error_on_missing_default_upstream "rebase" "rebase" \
432 "against" "git rebase <branch>"
435 *) upstream_name="$1"
439 upstream=$(peel_committish "${upstream_name}") ||
440 die "$(eval_gettext "invalid upstream \$upstream_name")"
441 upstream_arg="$upstream_name"
445 empty_tree=`git hash-object -t tree /dev/null`
446 onto=`git commit-tree $empty_tree </dev/null`
451 test $# -gt 1 && usage
455 # Make sure the branch to rebase onto is valid.
456 onto_name=${onto-"$upstream_name"}
459 if left=${onto_name%...*} right=${onto_name#*...} &&
460 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
464 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
467 die "$(eval_gettext "\$onto_name: there is no merge base")"
471 die "$(eval_gettext "\$onto_name: there is no merge base")"
475 onto=$(peel_committish "$onto_name") ||
476 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
480 # If the branch to rebase is given, that is the branch we will rebase
481 # $branch_name -- branch being rebased, or HEAD (already detached)
482 # $orig_head -- commit object name of tip of the branch before rebasing
483 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
487 # Is it "rebase other $branchname" or "rebase other $commit"?
491 if git show-ref --verify --quiet -- "refs/heads/$1" &&
492 orig_head=$(git rev-parse -q --verify "refs/heads/$1")
494 head_name="refs/heads/$1"
495 elif orig_head=$(git rev-parse -q --verify "$1")
497 head_name="detached HEAD"
499 die "$(eval_gettext "fatal: no such branch: \$branch_name")"
503 # Do not need to switch branches, we are already on it.
504 if branch_name=`git symbolic-ref -q HEAD`
506 head_name=$branch_name
507 branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
509 head_name="detached HEAD"
510 branch_name=HEAD ;# detached
512 orig_head=$(git rev-parse --verify HEAD) || exit
515 die "BUG: unexpected number of arguments left to parse"
519 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
521 stash_sha1=$(git stash create "autostash") ||
522 die "$(gettext 'Cannot autostash')"
524 mkdir -p "$state_dir" &&
525 echo $stash_sha1 >"$state_dir/autostash" &&
526 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
527 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
531 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
533 # Now we are rebasing commits $upstream..$orig_head (or with --root,
534 # everything leading up to $orig_head) on top of $onto
536 # Check if we are already based on $onto with linear history,
537 # but this should be done only when upstream and onto are the same
538 # and if this is not an interactive rebase.
539 mb=$(git merge-base "$onto" "$orig_head")
540 if test "$type" != interactive && test "$upstream" = "$onto" &&
541 test "$mb" = "$onto" &&
543 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
545 if test -z "$force_rebase"
547 # Lazily switch to the target branch if needed...
548 test -z "$switch_to" || git checkout "$switch_to" --
549 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
553 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
557 # If a hook exists, give it a chance to interrupt
558 run_pre_rebase_hook "$upstream_arg" "$@"
560 if test -n "$diffstat"
562 if test -n "$verbose"
564 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
566 # We want color (if set), but no pager
567 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
570 test "$type" = interactive && run_specific_rebase
572 # Detach HEAD and reset the tree
573 say "$(gettext "First, rewinding head to replay your work on top of it...")"
574 git checkout -q "$onto^0" || die "could not detach HEAD"
575 git update-ref ORIG_HEAD $orig_head
577 # If the $onto is a proper descendant of the tip of the branch, then
578 # we just fast-forwarded.
579 if test "$mb" = "$orig_head"
581 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
582 move_to_original_branch
587 if test -n "$rebase_root"
589 revisions="$onto..$orig_head"
591 revisions="$upstream..$orig_head"