3 # Copyright (c) 2005 Junio C Hamano.
10 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
11 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
12 git-rebase --continue | --abort | --skip | --edit-todo
15 v,verbose! display a diffstat of what changed upstream
16 q,quiet! be quiet. implies --no-stat
17 autostash! automatically stash/stash pop before and after
18 fork-point use 'merge-base --fork-point' to refine upstream
19 onto=! rebase onto given branch instead of upstream
20 p,preserve-merges! try to recreate merges instead of ignoring them
21 s,strategy=! use the given merge strategy
22 no-ff! cherry-pick all commits, even if unchanged
23 m,merge! use merging strategies to rebase
24 i,interactive! let the user edit the list of commits to rebase
25 x,exec=! add exec lines after each commit of the editable list
26 k,keep-empty preserve empty commits during rebase
27 f,force-rebase! force rebase even if branch is up to date
28 X,strategy-option=! pass the argument through to the merge strategy
29 stat! display a diffstat of what changed upstream
30 n,no-stat! do not show diffstat of what changed upstream
31 verify allow pre-rebase hook to run
32 rerere-autoupdate allow rerere to update index with resolved conflicts
33 root! rebase all reachable commits up to the root(s)
34 autosquash move commits that begin with squash!/fixup! under -i
35 committer-date-is-author-date! passed to 'git am'
36 ignore-date! passed to 'git am'
37 whitespace=! passed to 'git apply'
38 ignore-whitespace! passed to 'git apply'
39 C=! passed to 'git apply'
40 S,gpg-sign? GPG-sign commits
43 abort! abort and check out the original branch
44 skip! skip current patch and continue
45 edit-todo! edit the todo list during an interactive rebase
49 set_reflog_action rebase
50 require_work_tree_exists
55 ok_to_skip_pre_rebase
=
57 $(gettext 'When you have resolved this problem, run "git rebase
--continue".
58 If you prefer to skip this patch, run "git rebase
--skip" instead.
59 To check out the original branch and stop rebasing, run "git rebase
--abort".')
66 merge_dir
="$GIT_DIR"/rebase-merge
67 apply_dir
="$GIT_DIR"/rebase-apply
70 test "$(git config --bool rebase.stat)" = true
&& diffstat
=t
71 autostash
="$(git config --bool rebase.autostash || echo false)"
76 allow_rerere_autoupdate
=
77 # Non-empty if a rebase was in progress when 'git rebase' was invoked
79 # One of {am, merge, interactive}
81 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
83 # One of {'', continue, skip, abort}, as parsed from command line
88 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
92 test -f "$state_dir/head-name" &&
93 test -f "$state_dir/onto" &&
94 head_name
=$
(cat "$state_dir"/head-name
) &&
95 onto
=$
(cat "$state_dir"/onto
) &&
96 # We always write to orig-head, but interactive rebase used to write to
97 # head. Fall back to reading from head to cover for the case that the
98 # user upgraded git with an ongoing interactive rebase.
99 if test -f "$state_dir"/orig-head
101 orig_head
=$
(cat "$state_dir"/orig-head
)
103 orig_head
=$
(cat "$state_dir"/head)
105 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
106 test -f "$state_dir"/verbose
&& verbose
=t
107 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
108 test -f "$state_dir"/strategy_opts
&&
109 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
110 test -f "$state_dir"/allow_rerere_autoupdate
&&
111 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
112 test -f "$state_dir"/gpg_sign_opt
&&
113 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
116 write_basic_state
() {
117 echo "$head_name" > "$state_dir"/head-name
&&
118 echo "$onto" > "$state_dir"/onto
&&
119 echo "$orig_head" > "$state_dir"/orig-head
&&
120 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
121 test t
= "$verbose" && : > "$state_dir"/verbose
122 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
123 test -n "$strategy_opts" && echo "$strategy_opts" > \
124 "$state_dir"/strategy_opts
125 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
126 "$state_dir"/allow_rerere_autoupdate
127 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
135 test $status != 0 && printf "%s\n" "$output"
144 move_to_original_branch
() {
147 message
="rebase finished: $head_name onto $onto"
148 git update-ref
-m "$message" \
149 $head_name $
(git rev-parse HEAD
) $orig_head &&
151 -m "rebase finished: returning to $head_name" \
153 die
"$(gettext "Could not move back to
$head_name")"
159 if test -f "$state_dir/autostash"
161 stash_sha1
=$
(cat "$state_dir/autostash")
162 if git stash apply
$stash_sha1 2>&1 >/dev
/null
164 echo "$(gettext 'Applied autostash.')"
166 git stash store
-m "autostash" -q $stash_sha1 ||
167 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
168 gettext 'Applying autostash resulted in conflicts.
169 Your changes are safe in the stash.
170 You can run "git stash pop" or "git stash drop" at any time.
182 run_specific_rebase
() {
183 if [ "$interactive_rebase" = implied
]; then
193 elif test $ret -eq 2 # special exit status for rebase -i
196 rm -rf "$state_dir" &&
202 run_pre_rebase_hook
() {
203 if test -z "$ok_to_skip_pre_rebase" &&
204 test -x "$GIT_DIR/hooks/pre-rebase"
206 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
207 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
211 test -f "$apply_dir"/applying
&&
212 die
"$(gettext "It looks like git-am is
in progress. Cannot rebase.
")"
214 if test -d "$apply_dir"
217 state_dir
="$apply_dir"
218 elif test -d "$merge_dir"
220 if test -f "$merge_dir"/interactive
223 interactive_rebase
=explicit
227 state_dir
="$merge_dir"
229 test -n "$type" && in_progress
=t
236 ok_to_skip_pre_rebase
=yes
239 ok_to_skip_pre_rebase
=
241 --continue|
--skip|
--abort|
--edit-todo)
242 test $total_argc -eq 2 || usage
249 cmd
="${cmd}exec ${1#--exec=}${LF}"
252 interactive_rebase
=explicit
259 test -z "$interactive_rebase" && interactive_rebase
=implied
277 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
279 test -z "$strategy" && strategy
=recursive
282 strategy
="${1#--strategy=}"
301 git_am_opt
="$git_am_opt -q"
306 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
307 case "${1#--whitespace=}" in
314 git_am_opt
="$git_am_opt $1"
316 --committer-date-is-author-date|
--ignore-date)
317 git_am_opt
="$git_am_opt $1"
321 git_am_opt
="$git_am_opt $1"
326 --force-rebase|
--no-ff)
329 --rerere-autoupdate|
--no-rerere-autoupdate)
330 allow_rerere_autoupdate
="$1"
336 gpg_sign_opt
="-S${1#--gpg-sign=}"
345 test $# -gt 2 && usage
348 test "$interactive_rebase" != explicit
350 die
"$(gettext "The
--exec option must be used with the
--interactive option
")"
355 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
356 # Only interactive rebase uses detailed reflog messages
357 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
359 GIT_REFLOG_ACTION
="rebase -i ($action)"
360 export GIT_REFLOG_ACTION
364 if test "$action" = "edit-todo" && test "$type" != "interactive"
366 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
372 git rev-parse
--verify HEAD
>/dev
/null ||
373 die
"$(gettext "Cannot
read HEAD
")"
374 git update-index
--ignore-submodules --refresh &&
375 git diff-files
--quiet --ignore-submodules ||
{
376 echo "$(gettext "You must edit all merge conflicts and
then
377 mark them as resolved using git add
")"
384 output git
reset --hard HEAD ||
exit $?
393 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
394 die
"$(eval_gettext "Could not move back to \
$head_name")"
397 output git
reset --hard $orig_head
406 # Make sure no rebase is in progress
407 if test -n "$in_progress"
409 state_dir_base
=${state_dir##*/}
410 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
411 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
413 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
414 I wonder if you are in the middle of another rebase. If that is the
417 If that is not the case, please
418 $cmd_clear_stale_rebase
419 and run me again. I am stopping in case you still have something
423 if test -n "$rebase_root" && test -z "$onto"
425 test -z "$interactive_rebase" && interactive_rebase
=implied
428 if test -n "$interactive_rebase"
431 state_dir
="$merge_dir"
432 elif test -n "$do_merge"
435 state_dir
="$merge_dir"
438 state_dir
="$apply_dir"
441 if test -z "$rebase_root"
445 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
446 --verify -q @
{upstream
} 2>/dev
/null
)
449 error_on_missing_default_upstream
"rebase" "rebase" \
450 "against" "git rebase <branch>"
453 test "$fork_point" = auto
&& fork_point
=t
455 *) upstream_name
="$1"
456 if test "$upstream_name" = "-"
458 upstream_name
="@{-1}"
463 upstream
=$
(peel_committish
"${upstream_name}") ||
464 die
"$(eval_gettext "invalid upstream \
$upstream_name")"
465 upstream_arg
="$upstream_name"
469 empty_tree
=`git hash-object -t tree /dev/null`
470 onto
=`git commit-tree $empty_tree </dev/null`
475 test $# -gt 1 && usage
479 # Make sure the branch to rebase onto is valid.
480 onto_name
=${onto-"$upstream_name"}
483 if left
=${onto_name%...*} right
=${onto_name#*...} &&
484 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
488 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
491 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
495 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
499 onto
=$
(peel_committish
"$onto_name") ||
500 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
504 # If the branch to rebase is given, that is the branch we will rebase
505 # $branch_name -- branch being rebased, or HEAD (already detached)
506 # $orig_head -- commit object name of tip of the branch before rebasing
507 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
511 # Is it "rebase other $branchname" or "rebase other $commit"?
515 if git show-ref
--verify --quiet -- "refs/heads/$1" &&
516 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$1")
518 head_name
="refs/heads/$1"
519 elif orig_head
=$
(git rev-parse
-q --verify "$1")
521 head_name
="detached HEAD"
523 die
"$(eval_gettext "fatal
: no such branch
: \
$branch_name")"
527 # Do not need to switch branches, we are already on it.
528 if branch_name
=`git symbolic-ref -q HEAD`
530 head_name
=$branch_name
531 branch_name
=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
533 head_name
="detached HEAD"
534 branch_name
=HEAD
;# detached
536 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
539 die
"BUG: unexpected number of arguments left to parse"
543 if test "$fork_point" = t
545 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
546 "${switch_to:-HEAD}")
547 if test -n "$new_upstream"
549 upstream
=$new_upstream
553 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
555 stash_sha1
=$
(git stash create
"autostash") ||
556 die
"$(gettext 'Cannot autostash')"
558 mkdir
-p "$state_dir" &&
559 echo $stash_sha1 >"$state_dir/autostash" &&
560 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
561 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
565 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
567 # Now we are rebasing commits $upstream..$orig_head (or with --root,
568 # everything leading up to $orig_head) on top of $onto
570 # Check if we are already based on $onto with linear history,
571 # but this should be done only when upstream and onto are the same
572 # and if this is not an interactive rebase.
573 mb
=$
(git merge-base
"$onto" "$orig_head")
574 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
575 test "$mb" = "$onto" &&
577 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
579 if test -z "$force_rebase"
581 # Lazily switch to the target branch if needed...
582 test -z "$switch_to" ||
583 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
584 git checkout
"$switch_to" --
585 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
589 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
593 # If a hook exists, give it a chance to interrupt
594 run_pre_rebase_hook
"$upstream_arg" "$@"
596 if test -n "$diffstat"
598 if test -n "$verbose"
600 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
602 # We want color (if set), but no pager
603 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
606 test "$type" = interactive
&& run_specific_rebase
608 # Detach HEAD and reset the tree
609 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
611 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
612 git checkout
-q "$onto^0" || die
"could not detach HEAD"
613 git update-ref ORIG_HEAD
$orig_head
615 # If the $onto is a proper descendant of the tip of the branch, then
616 # we just fast-forwarded.
617 if test "$mb" = "$orig_head"
619 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
620 move_to_original_branch
625 if test -n "$rebase_root"
627 revisions
="$onto..$orig_head"
629 revisions
="$upstream..$orig_head"