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 die
"$(gettext "Could not move back to
$head_name")"
153 if test -f "$state_dir/autostash"
155 stash_sha1
=$
(cat "$state_dir/autostash")
156 if git stash apply
$stash_sha1 2>&1 >/dev
/null
158 echo "$(gettext 'Applied autostash.')"
160 git stash store
-m "autostash" -q $stash_sha1 ||
161 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
162 gettext 'Applying autostash resulted in conflicts.
163 Your changes are safe in the stash.
164 You can run "git stash pop" or "git stash drop" at any time.
172 run_specific_rebase
() {
173 if [ "$interactive_rebase" = implied
]; then
187 run_pre_rebase_hook
() {
188 if test -z "$ok_to_skip_pre_rebase" &&
189 test -x "$GIT_DIR/hooks/pre-rebase"
191 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
192 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
196 test -f "$apply_dir"/applying
&&
197 die
"$(gettext "It looks like git-am is
in progress. Cannot rebase.
")"
199 if test -d "$apply_dir"
202 state_dir
="$apply_dir"
203 elif test -d "$merge_dir"
205 if test -f "$merge_dir"/interactive
208 interactive_rebase
=explicit
212 state_dir
="$merge_dir"
214 test -n "$type" && in_progress
=t
221 ok_to_skip_pre_rebase
=yes
224 ok_to_skip_pre_rebase
=
226 --continue|
--skip|
--abort|
--edit-todo)
227 test $total_argc -eq 2 || usage
231 test 2 -le "$#" || usage
236 test 2 -le "$#" || usage
237 cmd
="${cmd}exec $2${LF}"
241 interactive_rebase
=explicit
248 test -z "$interactive_rebase" && interactive_rebase
=implied
267 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--$1")"
269 test -z "$strategy" && strategy
=recursive
292 git_am_opt
="$git_am_opt -q"
298 git_am_opt
="$git_am_opt --whitespace=$1"
306 git_am_opt
="$git_am_opt $1"
308 --committer-date-is-author-date|
--ignore-date)
309 git_am_opt
="$git_am_opt $1"
314 git_am_opt
="$git_am_opt -C$1"
322 --rerere-autoupdate|
--no-rerere-autoupdate)
323 allow_rerere_autoupdate
="$1"
332 test $# -gt 2 && usage
335 test "$interactive_rebase" != explicit
337 die
"$(gettext "The
--exec option must be used with the
--interactive option
")"
342 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
343 # Only interactive rebase uses detailed reflog messages
344 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
346 GIT_REFLOG_ACTION
="rebase -i ($action)"
347 export GIT_REFLOG_ACTION
351 if test "$action" = "edit-todo" && test "$type" != "interactive"
353 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
359 git rev-parse
--verify HEAD
>/dev
/null ||
360 die
"$(gettext "Cannot
read HEAD
")"
361 git update-index
--ignore-submodules --refresh &&
362 git diff-files
--quiet --ignore-submodules ||
{
363 echo "$(gettext "You must edit all merge conflicts and
then
364 mark them as resolved using git add
")"
371 output git
reset --hard HEAD ||
exit $?
380 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
381 die
"$(eval_gettext "Could not move back to \
$head_name")"
384 output git
reset --hard $orig_head
393 # Make sure no rebase is in progress
394 if test -n "$in_progress"
396 state_dir_base
=${state_dir##*/}
397 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
398 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
400 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
401 I wonder if you are in the middle of another rebase. If that is the
404 If that is not the case, please
405 $cmd_clear_stale_rebase
406 and run me again. I am stopping in case you still have something
410 if test -n "$rebase_root" && test -z "$onto"
412 test -z "$interactive_rebase" && interactive_rebase
=implied
415 if test -n "$interactive_rebase"
418 state_dir
="$merge_dir"
419 elif test -n "$do_merge"
422 state_dir
="$merge_dir"
425 state_dir
="$apply_dir"
428 if test -z "$rebase_root"
432 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
433 --verify -q @
{upstream
} 2>/dev
/null
)
436 error_on_missing_default_upstream
"rebase" "rebase" \
437 "against" "git rebase <branch>"
440 test "$fork_point" = auto
&& fork_point
=t
442 *) upstream_name
="$1"
446 upstream
=$
(peel_committish
"${upstream_name}") ||
447 die
"$(eval_gettext "invalid upstream \
$upstream_name")"
448 upstream_arg
="$upstream_name"
452 empty_tree
=`git hash-object -t tree /dev/null`
453 onto
=`git commit-tree $empty_tree </dev/null`
458 test $# -gt 1 && usage
462 # Make sure the branch to rebase onto is valid.
463 onto_name
=${onto-"$upstream_name"}
466 if left
=${onto_name%...*} right
=${onto_name#*...} &&
467 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
471 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
474 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
478 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
482 onto
=$
(peel_committish
"$onto_name") ||
483 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
487 # If the branch to rebase is given, that is the branch we will rebase
488 # $branch_name -- branch being rebased, or HEAD (already detached)
489 # $orig_head -- commit object name of tip of the branch before rebasing
490 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
494 # Is it "rebase other $branchname" or "rebase other $commit"?
498 if git show-ref
--verify --quiet -- "refs/heads/$1" &&
499 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$1")
501 head_name
="refs/heads/$1"
502 elif orig_head
=$
(git rev-parse
-q --verify "$1")
504 head_name
="detached HEAD"
506 die
"$(eval_gettext "fatal
: no such branch
: \
$branch_name")"
510 # Do not need to switch branches, we are already on it.
511 if branch_name
=`git symbolic-ref -q HEAD`
513 head_name
=$branch_name
514 branch_name
=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
516 head_name
="detached HEAD"
517 branch_name
=HEAD
;# detached
519 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
522 die
"BUG: unexpected number of arguments left to parse"
526 if test "$fork_point" = t
528 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
529 "${switch_to:-HEAD}")
530 if test -n "$new_upstream"
532 upstream
=$new_upstream
536 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
538 stash_sha1
=$
(git stash create
"autostash") ||
539 die
"$(gettext 'Cannot autostash')"
541 mkdir
-p "$state_dir" &&
542 echo $stash_sha1 >"$state_dir/autostash" &&
543 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
544 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
548 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
550 # Now we are rebasing commits $upstream..$orig_head (or with --root,
551 # everything leading up to $orig_head) on top of $onto
553 # Check if we are already based on $onto with linear history,
554 # but this should be done only when upstream and onto are the same
555 # and if this is not an interactive rebase.
556 mb
=$
(git merge-base
"$onto" "$orig_head")
557 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
558 test "$mb" = "$onto" &&
560 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
562 if test -z "$force_rebase"
564 # Lazily switch to the target branch if needed...
565 test -z "$switch_to" ||
566 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
567 git checkout
"$switch_to" --
568 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
572 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
576 # If a hook exists, give it a chance to interrupt
577 run_pre_rebase_hook
"$upstream_arg" "$@"
579 if test -n "$diffstat"
581 if test -n "$verbose"
583 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
585 # We want color (if set), but no pager
586 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
589 test "$type" = interactive
&& run_specific_rebase
591 # Detach HEAD and reset the tree
592 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
594 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
595 git checkout
-q "$onto^0" || die
"could not detach HEAD"
596 git update-ref ORIG_HEAD
$orig_head
598 # If the $onto is a proper descendant of the tip of the branch, then
599 # we just fast-forwarded.
600 if test "$mb" = "$orig_head"
602 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
603 move_to_original_branch
608 if test -n "$rebase_root"
610 revisions
="$onto..$orig_head"
612 revisions
="$upstream..$orig_head"