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".')
62 unset restrict_revision
67 merge_dir
="$GIT_DIR"/rebase-merge
68 apply_dir
="$GIT_DIR"/rebase-apply
71 test "$(git config --bool rebase.stat)" = true
&& diffstat
=t
72 autostash
="$(git config --bool rebase.autostash || echo false)"
77 allow_rerere_autoupdate
=
78 # Non-empty if a rebase was in progress when 'git rebase' was invoked
80 # One of {am, merge, interactive}
82 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
84 # One of {'', continue, skip, abort}, as parsed from command line
89 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
93 test -f "$state_dir/head-name" &&
94 test -f "$state_dir/onto" &&
95 head_name
=$
(cat "$state_dir"/head-name
) &&
96 onto
=$
(cat "$state_dir"/onto
) &&
97 # We always write to orig-head, but interactive rebase used to write to
98 # head. Fall back to reading from head to cover for the case that the
99 # user upgraded git with an ongoing interactive rebase.
100 if test -f "$state_dir"/orig-head
102 orig_head
=$
(cat "$state_dir"/orig-head
)
104 orig_head
=$
(cat "$state_dir"/head)
106 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
107 test -f "$state_dir"/verbose
&& verbose
=t
108 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
109 test -f "$state_dir"/strategy_opts
&&
110 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
111 test -f "$state_dir"/allow_rerere_autoupdate
&&
112 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
113 test -f "$state_dir"/gpg_sign_opt
&&
114 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
117 write_basic_state
() {
118 echo "$head_name" > "$state_dir"/head-name
&&
119 echo "$onto" > "$state_dir"/onto
&&
120 echo "$orig_head" > "$state_dir"/orig-head
&&
121 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
122 test t
= "$verbose" && : > "$state_dir"/verbose
123 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
124 test -n "$strategy_opts" && echo "$strategy_opts" > \
125 "$state_dir"/strategy_opts
126 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
127 "$state_dir"/allow_rerere_autoupdate
128 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
136 test $status != 0 && printf "%s\n" "$output"
145 move_to_original_branch
() {
148 message
="rebase finished: $head_name onto $onto"
149 git update-ref
-m "$message" \
150 $head_name $
(git rev-parse HEAD
) $orig_head &&
152 -m "rebase finished: returning to $head_name" \
154 die
"$(gettext "Could not move back to
$head_name")"
160 if test -f "$state_dir/autostash"
162 stash_sha1
=$
(cat "$state_dir/autostash")
163 if git stash apply
$stash_sha1 2>&1 >/dev
/null
165 echo "$(gettext 'Applied autostash.')"
167 git stash store
-m "autostash" -q $stash_sha1 ||
168 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
169 gettext 'Applying autostash resulted in conflicts.
170 Your changes are safe in the stash.
171 You can run "git stash pop" or "git stash drop" at any time.
183 run_specific_rebase
() {
184 if [ "$interactive_rebase" = implied
]; then
194 elif test $ret -eq 2 # special exit status for rebase -i
197 rm -rf "$state_dir" &&
203 run_pre_rebase_hook
() {
204 if test -z "$ok_to_skip_pre_rebase" &&
205 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
207 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
208 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
212 test -f "$apply_dir"/applying
&&
213 die
"$(gettext "It looks like git-am is
in progress. Cannot rebase.
")"
215 if test -d "$apply_dir"
218 state_dir
="$apply_dir"
219 elif test -d "$merge_dir"
221 if test -f "$merge_dir"/interactive
224 interactive_rebase
=explicit
228 state_dir
="$merge_dir"
230 test -n "$type" && in_progress
=t
237 ok_to_skip_pre_rebase
=yes
240 ok_to_skip_pre_rebase
=
242 --continue|
--skip|
--abort|
--edit-todo)
243 test $total_argc -eq 2 || usage
250 cmd
="${cmd}exec ${1#--exec=}${LF}"
253 interactive_rebase
=explicit
260 test -z "$interactive_rebase" && interactive_rebase
=implied
278 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
280 test -z "$strategy" && strategy
=recursive
283 strategy
="${1#--strategy=}"
305 git_am_opt
="$git_am_opt -q"
310 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
311 case "${1#--whitespace=}" in
318 git_am_opt
="$git_am_opt $1"
320 --committer-date-is-author-date|
--ignore-date)
321 git_am_opt
="$git_am_opt $1"
325 git_am_opt
="$git_am_opt $1"
330 --force-rebase|
--no-ff)
333 --rerere-autoupdate|
--no-rerere-autoupdate)
334 allow_rerere_autoupdate
="$1"
340 gpg_sign_opt
="-S${1#--gpg-sign=}"
349 test $# -gt 2 && usage
352 test "$interactive_rebase" != explicit
354 die
"$(gettext "The
--exec option must be used with the
--interactive option
")"
359 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
360 # Only interactive rebase uses detailed reflog messages
361 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
363 GIT_REFLOG_ACTION
="rebase -i ($action)"
364 export GIT_REFLOG_ACTION
368 if test "$action" = "edit-todo" && test "$type" != "interactive"
370 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
376 git rev-parse
--verify HEAD
>/dev
/null ||
377 die
"$(gettext "Cannot
read HEAD
")"
378 git update-index
--ignore-submodules --refresh &&
379 git diff-files
--quiet --ignore-submodules ||
{
380 echo "$(gettext "You must edit all merge conflicts and
then
381 mark them as resolved using git add
")"
388 output git
reset --hard HEAD ||
exit $?
397 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
398 die
"$(eval_gettext "Could not move back to \
$head_name")"
401 output git
reset --hard $orig_head
410 # Make sure no rebase is in progress
411 if test -n "$in_progress"
413 state_dir_base
=${state_dir##*/}
414 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
415 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
417 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
418 I wonder if you are in the middle of another rebase. If that is the
421 If that is not the case, please
422 $cmd_clear_stale_rebase
423 and run me again. I am stopping in case you still have something
427 if test -n "$rebase_root" && test -z "$onto"
429 test -z "$interactive_rebase" && interactive_rebase
=implied
432 if test -n "$interactive_rebase"
435 state_dir
="$merge_dir"
436 elif test -n "$do_merge"
439 state_dir
="$merge_dir"
442 state_dir
="$apply_dir"
445 if test -z "$rebase_root"
449 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
450 --verify -q @
{upstream
} 2>/dev
/null
)
453 error_on_missing_default_upstream
"rebase" "rebase" \
454 "against" "git rebase <branch>"
457 test "$fork_point" = auto
&& fork_point
=t
459 *) upstream_name
="$1"
460 if test "$upstream_name" = "-"
462 upstream_name
="@{-1}"
467 upstream
=$
(peel_committish
"${upstream_name}") ||
468 die
"$(eval_gettext "invalid upstream \
$upstream_name")"
469 upstream_arg
="$upstream_name"
473 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
474 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
479 test $# -gt 1 && usage
483 # Make sure the branch to rebase onto is valid.
484 onto_name
=${onto-"$upstream_name"}
487 if left
=${onto_name%...*} right
=${onto_name#*...} &&
488 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
492 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
495 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
499 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
503 onto
=$
(peel_committish
"$onto_name") ||
504 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
508 # If the branch to rebase is given, that is the branch we will rebase
509 # $branch_name -- branch being rebased, or HEAD (already detached)
510 # $orig_head -- commit object name of tip of the branch before rebasing
511 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
515 # Is it "rebase other $branchname" or "rebase other $commit"?
519 if git show-ref
--verify --quiet -- "refs/heads/$1" &&
520 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$1")
522 head_name
="refs/heads/$1"
523 elif orig_head
=$
(git rev-parse
-q --verify "$1")
525 head_name
="detached HEAD"
527 die
"$(eval_gettext "fatal
: no such branch
: \
$branch_name")"
531 # Do not need to switch branches, we are already on it.
532 if branch_name
=$
(git symbolic-ref
-q HEAD
)
534 head_name
=$branch_name
535 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
537 head_name
="detached HEAD"
538 branch_name
=HEAD
;# detached
540 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
543 die
"BUG: unexpected number of arguments left to parse"
547 if test "$fork_point" = t
549 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
550 "${switch_to:-HEAD}")
551 if test -n "$new_upstream"
553 restrict_revision
=$new_upstream
557 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
559 stash_sha1
=$
(git stash create
"autostash") ||
560 die
"$(gettext 'Cannot autostash')"
562 mkdir
-p "$state_dir" &&
563 echo $stash_sha1 >"$state_dir/autostash" &&
564 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
565 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
569 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
571 # Now we are rebasing commits $upstream..$orig_head (or with --root,
572 # everything leading up to $orig_head) on top of $onto
574 # Check if we are already based on $onto with linear history,
575 # but this should be done only when upstream and onto are the same
576 # and if this is not an interactive rebase.
577 mb
=$
(git merge-base
"$onto" "$orig_head")
578 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
579 test "$mb" = "$onto" && test -z "$restrict_revision" &&
581 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
583 if test -z "$force_rebase"
585 # Lazily switch to the target branch if needed...
586 test -z "$switch_to" ||
587 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
588 git checkout
-q "$switch_to" --
589 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
593 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
597 # If a hook exists, give it a chance to interrupt
598 run_pre_rebase_hook
"$upstream_arg" "$@"
600 if test -n "$diffstat"
602 if test -n "$verbose"
604 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
606 # We want color (if set), but no pager
607 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
610 test "$type" = interactive
&& run_specific_rebase
612 # Detach HEAD and reset the tree
613 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
615 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
616 git checkout
-q "$onto^0" || die
"could not detach HEAD"
617 git update-ref ORIG_HEAD
$orig_head
619 # If the $onto is a proper descendant of the tip of the branch, then
620 # we just fast-forwarded.
621 if test "$mb" = "$orig_head"
623 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
624 move_to_original_branch
629 if test -n "$rebase_root"
631 revisions
="$onto..$orig_head"
633 revisions
="${restrict_revision-$upstream}..$orig_head"