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 git stash store
-m "autostash" -q $stash_sha1 ||
159 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
160 gettext 'Applying autostash resulted in conflicts.
161 Your changes are safe in the stash.
162 You can run "git stash pop" or "git stash drop" at any time.
170 run_specific_rebase_internal
() {
171 if [ "$interactive_rebase" = implied
]; then
176 # On FreeBSD, the shell's "return" returns from the current
177 # function, not from the current file inclusion.
178 # run_specific_rebase_internal has the file inclusion as a
179 # last statement, so POSIX and FreeBSD's return will do the
184 run_specific_rebase
() {
185 run_specific_rebase_internal
194 run_pre_rebase_hook
() {
195 if test -z "$ok_to_skip_pre_rebase" &&
196 test -x "$GIT_DIR/hooks/pre-rebase"
198 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
199 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
203 test -f "$apply_dir"/applying
&&
204 die
"$(gettext "It looks like git-am is
in progress. Cannot rebase.
")"
206 if test -d "$apply_dir"
209 state_dir
="$apply_dir"
210 elif test -d "$merge_dir"
212 if test -f "$merge_dir"/interactive
215 interactive_rebase
=explicit
219 state_dir
="$merge_dir"
221 test -n "$type" && in_progress
=t
228 ok_to_skip_pre_rebase
=yes
231 ok_to_skip_pre_rebase
=
233 --continue|
--skip|
--abort|
--edit-todo)
234 test $total_argc -eq 2 || usage
238 test 2 -le "$#" || usage
243 test 2 -le "$#" || usage
244 cmd
="${cmd}exec $2${LF}"
248 interactive_rebase
=explicit
255 test -z "$interactive_rebase" && interactive_rebase
=implied
268 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--$1")"
270 test -z "$strategy" && strategy
=recursive
293 git_am_opt
="$git_am_opt -q"
299 git_am_opt
="$git_am_opt --whitespace=$1"
307 git_am_opt
="$git_am_opt $1"
309 --committer-date-is-author-date|
--ignore-date)
310 git_am_opt
="$git_am_opt $1"
315 git_am_opt
="$git_am_opt -C$1"
323 --rerere-autoupdate|
--no-rerere-autoupdate)
324 allow_rerere_autoupdate
="$1"
333 test $# -gt 2 && usage
336 test "$interactive_rebase" != explicit
338 die
"$(gettext "The
--exec option must be used with the
--interactive option
")"
343 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
344 # Only interactive rebase uses detailed reflog messages
345 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
347 GIT_REFLOG_ACTION
="rebase -i ($action)"
348 export GIT_REFLOG_ACTION
352 if test "$action" = "edit-todo" && test "$type" != "interactive"
354 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
360 git rev-parse
--verify HEAD
>/dev
/null ||
361 die
"$(gettext "Cannot
read HEAD
")"
362 git update-index
--ignore-submodules --refresh &&
363 git diff-files
--quiet --ignore-submodules ||
{
364 echo "$(gettext "You must edit all merge conflicts and
then
365 mark them as resolved using git add
")"
372 output git
reset --hard HEAD ||
exit $?
381 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
382 die
"$(eval_gettext "Could not move back to \
$head_name")"
385 output git
reset --hard $orig_head
394 # Make sure no rebase is in progress
395 if test -n "$in_progress"
397 state_dir_base
=${state_dir##*/}
398 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
399 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
401 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
402 I wonder if you are in the middle of another rebase. If that is the
405 If that is not the case, please
406 $cmd_clear_stale_rebase
407 and run me again. I am stopping in case you still have something
411 if test -n "$rebase_root" && test -z "$onto"
413 test -z "$interactive_rebase" && interactive_rebase
=implied
416 if test -n "$interactive_rebase"
419 state_dir
="$merge_dir"
420 elif test -n "$do_merge"
423 state_dir
="$merge_dir"
426 state_dir
="$apply_dir"
429 if test -z "$rebase_root"
433 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
434 --verify -q @
{upstream
} 2>/dev
/null
)
437 error_on_missing_default_upstream
"rebase" "rebase" \
438 "against" "git rebase <branch>"
441 *) upstream_name
="$1"
445 upstream
=$
(peel_committish
"${upstream_name}") ||
446 die
"$(eval_gettext "invalid upstream \
$upstream_name")"
447 upstream_arg
="$upstream_name"
451 empty_tree
=`git hash-object -t tree /dev/null`
452 onto
=`git commit-tree $empty_tree </dev/null`
457 test $# -gt 1 && usage
461 # Make sure the branch to rebase onto is valid.
462 onto_name
=${onto-"$upstream_name"}
465 if left
=${onto_name%...*} right
=${onto_name#*...} &&
466 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
470 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
473 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
477 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
481 onto
=$
(peel_committish
"$onto_name") ||
482 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
486 # If the branch to rebase is given, that is the branch we will rebase
487 # $branch_name -- branch being rebased, or HEAD (already detached)
488 # $orig_head -- commit object name of tip of the branch before rebasing
489 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
493 # Is it "rebase other $branchname" or "rebase other $commit"?
497 if git show-ref
--verify --quiet -- "refs/heads/$1" &&
498 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$1")
500 head_name
="refs/heads/$1"
501 elif orig_head
=$
(git rev-parse
-q --verify "$1")
503 head_name
="detached HEAD"
505 die
"$(eval_gettext "fatal
: no such branch
: \
$branch_name")"
509 # Do not need to switch branches, we are already on it.
510 if branch_name
=`git symbolic-ref -q HEAD`
512 head_name
=$branch_name
513 branch_name
=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
515 head_name
="detached HEAD"
516 branch_name
=HEAD
;# detached
518 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
521 die
"BUG: unexpected number of arguments left to parse"
525 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
527 stash_sha1
=$
(git stash create
"autostash") ||
528 die
"$(gettext 'Cannot autostash')"
530 mkdir
-p "$state_dir" &&
531 echo $stash_sha1 >"$state_dir/autostash" &&
532 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
533 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
537 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
539 # Now we are rebasing commits $upstream..$orig_head (or with --root,
540 # everything leading up to $orig_head) on top of $onto
542 # Check if we are already based on $onto with linear history,
543 # but this should be done only when upstream and onto are the same
544 # and if this is not an interactive rebase.
545 mb
=$
(git merge-base
"$onto" "$orig_head")
546 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
547 test "$mb" = "$onto" &&
549 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
551 if test -z "$force_rebase"
553 # Lazily switch to the target branch if needed...
554 test -z "$switch_to" ||
555 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
556 git checkout
"$switch_to" --
557 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
561 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
565 # If a hook exists, give it a chance to interrupt
566 run_pre_rebase_hook
"$upstream_arg" "$@"
568 if test -n "$diffstat"
570 if test -n "$verbose"
572 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
574 # We want color (if set), but no pager
575 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
578 test "$type" = interactive
&& run_specific_rebase
580 # Detach HEAD and reset the tree
581 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
583 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
584 git checkout
-q "$onto^0" || die
"could not detach HEAD"
585 git update-ref ORIG_HEAD
$orig_head
587 # If the $onto is a proper descendant of the tip of the branch, then
588 # we just fast-forwarded.
589 if test "$mb" = "$orig_head"
591 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
592 move_to_original_branch
597 if test -n "$rebase_root"
599 revisions
="$onto..$orig_head"
601 revisions
="$upstream..$orig_head"