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_internal
() {
173 if [ "$interactive_rebase" = implied
]; then
178 # On FreeBSD, the shell's "return" returns from the current
179 # function, not from the current file inclusion.
180 # run_specific_rebase_internal has the file inclusion as a
181 # last statement, so POSIX and FreeBSD's return will do the
186 run_specific_rebase
() {
187 run_specific_rebase_internal
196 run_pre_rebase_hook
() {
197 if test -z "$ok_to_skip_pre_rebase" &&
198 test -x "$GIT_DIR/hooks/pre-rebase"
200 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
201 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
205 test -f "$apply_dir"/applying
&&
206 die
"$(gettext "It looks like git-am is
in progress. Cannot rebase.
")"
208 if test -d "$apply_dir"
211 state_dir
="$apply_dir"
212 elif test -d "$merge_dir"
214 if test -f "$merge_dir"/interactive
217 interactive_rebase
=explicit
221 state_dir
="$merge_dir"
223 test -n "$type" && in_progress
=t
230 ok_to_skip_pre_rebase
=yes
233 ok_to_skip_pre_rebase
=
235 --continue|
--skip|
--abort|
--edit-todo)
236 test $total_argc -eq 2 || usage
240 test 2 -le "$#" || usage
245 test 2 -le "$#" || usage
246 cmd
="${cmd}exec $2${LF}"
250 interactive_rebase
=explicit
257 test -z "$interactive_rebase" && interactive_rebase
=implied
276 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--$1")"
278 test -z "$strategy" && strategy
=recursive
301 git_am_opt
="$git_am_opt -q"
307 git_am_opt
="$git_am_opt --whitespace=$1"
315 git_am_opt
="$git_am_opt $1"
317 --committer-date-is-author-date|
--ignore-date)
318 git_am_opt
="$git_am_opt $1"
323 git_am_opt
="$git_am_opt -C$1"
331 --rerere-autoupdate|
--no-rerere-autoupdate)
332 allow_rerere_autoupdate
="$1"
341 test $# -gt 2 && usage
344 test "$interactive_rebase" != explicit
346 die
"$(gettext "The
--exec option must be used with the
--interactive option
")"
351 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
352 # Only interactive rebase uses detailed reflog messages
353 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
355 GIT_REFLOG_ACTION
="rebase -i ($action)"
356 export GIT_REFLOG_ACTION
360 if test "$action" = "edit-todo" && test "$type" != "interactive"
362 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
368 git rev-parse
--verify HEAD
>/dev
/null ||
369 die
"$(gettext "Cannot
read HEAD
")"
370 git update-index
--ignore-submodules --refresh &&
371 git diff-files
--quiet --ignore-submodules ||
{
372 echo "$(gettext "You must edit all merge conflicts and
then
373 mark them as resolved using git add
")"
380 output git
reset --hard HEAD ||
exit $?
389 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
390 die
"$(eval_gettext "Could not move back to \
$head_name")"
393 output git
reset --hard $orig_head
402 # Make sure no rebase is in progress
403 if test -n "$in_progress"
405 state_dir_base
=${state_dir##*/}
406 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
407 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
409 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
410 I wonder if you are in the middle of another rebase. If that is the
413 If that is not the case, please
414 $cmd_clear_stale_rebase
415 and run me again. I am stopping in case you still have something
419 if test -n "$rebase_root" && test -z "$onto"
421 test -z "$interactive_rebase" && interactive_rebase
=implied
424 if test -n "$interactive_rebase"
427 state_dir
="$merge_dir"
428 elif test -n "$do_merge"
431 state_dir
="$merge_dir"
434 state_dir
="$apply_dir"
437 if test -z "$rebase_root"
441 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
442 --verify -q @
{upstream
} 2>/dev
/null
)
445 error_on_missing_default_upstream
"rebase" "rebase" \
446 "against" "git rebase <branch>"
449 test "$fork_point" = auto
&& fork_point
=t
451 *) upstream_name
="$1"
455 upstream
=$
(peel_committish
"${upstream_name}") ||
456 die
"$(eval_gettext "invalid upstream \
$upstream_name")"
457 upstream_arg
="$upstream_name"
461 empty_tree
=`git hash-object -t tree /dev/null`
462 onto
=`git commit-tree $empty_tree </dev/null`
467 test $# -gt 1 && usage
471 # Make sure the branch to rebase onto is valid.
472 onto_name
=${onto-"$upstream_name"}
475 if left
=${onto_name%...*} right
=${onto_name#*...} &&
476 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
480 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
483 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
487 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
491 onto
=$
(peel_committish
"$onto_name") ||
492 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
496 # If the branch to rebase is given, that is the branch we will rebase
497 # $branch_name -- branch being rebased, or HEAD (already detached)
498 # $orig_head -- commit object name of tip of the branch before rebasing
499 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
503 # Is it "rebase other $branchname" or "rebase other $commit"?
507 if git show-ref
--verify --quiet -- "refs/heads/$1" &&
508 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$1")
510 head_name
="refs/heads/$1"
511 elif orig_head
=$
(git rev-parse
-q --verify "$1")
513 head_name
="detached HEAD"
515 die
"$(eval_gettext "fatal
: no such branch
: \
$branch_name")"
519 # Do not need to switch branches, we are already on it.
520 if branch_name
=`git symbolic-ref -q HEAD`
522 head_name
=$branch_name
523 branch_name
=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
525 head_name
="detached HEAD"
526 branch_name
=HEAD
;# detached
528 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
531 die
"BUG: unexpected number of arguments left to parse"
535 if test "$fork_point" = t
537 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
538 "${switch_to:-HEAD}")
539 if test -n "$new_upstream"
541 upstream
=$new_upstream
545 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
547 stash_sha1
=$
(git stash create
"autostash") ||
548 die
"$(gettext 'Cannot autostash')"
550 mkdir
-p "$state_dir" &&
551 echo $stash_sha1 >"$state_dir/autostash" &&
552 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
553 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
557 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
559 # Now we are rebasing commits $upstream..$orig_head (or with --root,
560 # everything leading up to $orig_head) on top of $onto
562 # Check if we are already based on $onto with linear history,
563 # but this should be done only when upstream and onto are the same
564 # and if this is not an interactive rebase.
565 mb
=$
(git merge-base
"$onto" "$orig_head")
566 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
567 test "$mb" = "$onto" &&
569 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
571 if test -z "$force_rebase"
573 # Lazily switch to the target branch if needed...
574 test -z "$switch_to" ||
575 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
576 git checkout
"$switch_to" --
577 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
581 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
585 # If a hook exists, give it a chance to interrupt
586 run_pre_rebase_hook
"$upstream_arg" "$@"
588 if test -n "$diffstat"
590 if test -n "$verbose"
592 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
594 # We want color (if set), but no pager
595 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
598 test "$type" = interactive
&& run_specific_rebase
600 # Detach HEAD and reset the tree
601 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
603 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
604 git checkout
-q "$onto^0" || die
"could not detach HEAD"
605 git update-ref ORIG_HEAD
$orig_head
607 # If the $onto is a proper descendant of the tip of the branch, then
608 # we just fast-forwarded.
609 if test "$mb" = "$orig_head"
611 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
612 move_to_original_branch
617 if test -n "$rebase_root"
619 revisions
="$onto..$orig_head"
621 revisions
="$upstream..$orig_head"