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 r,rebase-merges? try to rebase merges instead of skipping them
21 p,preserve-merges! try to recreate merges instead of ignoring them
22 s,strategy=! use the given merge strategy
23 no-ff! cherry-pick all commits, even if unchanged
24 m,merge! use merging strategies to rebase
25 i,interactive! let the user edit the list of commits to rebase
26 x,exec=! add exec lines after each commit of the editable list
27 k,keep-empty preserve empty commits during rebase
28 allow-empty-message allow rebasing commits with empty messages
29 f,force-rebase! force rebase even if branch is up to date
30 X,strategy-option=! pass the argument through to the merge strategy
31 stat! display a diffstat of what changed upstream
32 n,no-stat! do not show diffstat of what changed upstream
33 verify allow pre-rebase hook to run
34 rerere-autoupdate allow rerere to update index with resolved conflicts
35 root! rebase all reachable commits up to the root(s)
36 autosquash move commits that begin with squash!/fixup! under -i
37 committer-date-is-author-date! passed to 'git am'
38 ignore-date! passed to 'git am'
39 signoff passed to 'git am'
40 whitespace=! passed to 'git apply'
41 ignore-whitespace! passed to 'git apply'
42 C=! passed to 'git apply'
43 S,gpg-sign? GPG-sign commits
46 abort! abort and check out the original branch
47 skip! skip current patch and continue
48 edit-todo! edit the todo list during an interactive rebase
49 quit! abort but keep HEAD where it is
50 show-current-patch! show the patch file being applied or merged
53 set_reflog_action rebase
54 require_work_tree_exists
59 ok_to_skip_pre_rebase
=
61 $(gettext 'Resolve all conflicts manually, mark them as resolved with
62 "git add
/rm <conflicted_files
>", then run "git rebase
--continue".
63 You can instead skip this commit: run "git rebase
--skip".
64 To abort and get back to the state before "git rebase
", run "git rebase
--abort".')
68 unset restrict_revision
73 merge_dir
="$GIT_DIR"/rebase-merge
74 apply_dir
="$GIT_DIR"/rebase-apply
77 test "$(git config --bool rebase.stat)" = true
&& diffstat
=t
78 autostash
="$(git config --bool rebase.autostash || echo false)"
84 allow_rerere_autoupdate
=
85 # Non-empty if a rebase was in progress when 'git rebase' was invoked
87 # One of {am, merge, interactive}
89 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
91 # One of {'', continue, skip, abort}, as parsed from command line
100 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
101 case "$(git config --bool commit.gpgsign)" in
102 true
) gpg_sign_opt
=-S ;;
106 read_basic_state
() {
107 test -f "$state_dir/head-name" &&
108 test -f "$state_dir/onto" &&
109 head_name
=$
(cat "$state_dir"/head-name
) &&
110 onto
=$
(cat "$state_dir"/onto
) &&
111 # We always write to orig-head, but interactive rebase used to write to
112 # head. Fall back to reading from head to cover for the case that the
113 # user upgraded git with an ongoing interactive rebase.
114 if test -f "$state_dir"/orig-head
116 orig_head
=$
(cat "$state_dir"/orig-head
)
118 orig_head
=$
(cat "$state_dir"/head)
120 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
121 test -f "$state_dir"/verbose
&& verbose
=t
122 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
123 test -f "$state_dir"/strategy_opts
&&
124 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
125 test -f "$state_dir"/allow_rerere_autoupdate
&&
126 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
127 test -f "$state_dir"/gpg_sign_opt
&&
128 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
129 test -f "$state_dir"/signoff
&& {
130 signoff
="$(cat "$state_dir"/signoff)"
135 write_basic_state
() {
136 echo "$head_name" > "$state_dir"/head-name
&&
137 echo "$onto" > "$state_dir"/onto
&&
138 echo "$orig_head" > "$state_dir"/orig-head
&&
139 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
140 test t
= "$verbose" && : > "$state_dir"/verbose
141 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
142 test -n "$strategy_opts" && echo "$strategy_opts" > \
143 "$state_dir"/strategy_opts
144 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
145 "$state_dir"/allow_rerere_autoupdate
146 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
147 test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
155 test $status != 0 && printf "%s\n" "$output"
164 move_to_original_branch
() {
167 message
="rebase finished: $head_name onto $onto"
168 git update-ref
-m "$message" \
169 $head_name $
(git rev-parse HEAD
) $orig_head &&
171 -m "rebase finished: returning to $head_name" \
173 die
"$(eval_gettext "Could not move back to \
$head_name")"
179 if test -f "$state_dir/autostash"
181 stash_sha1
=$
(cat "$state_dir/autostash")
182 if git stash apply
$stash_sha1 >/dev
/null
2>&1
184 echo "$(gettext 'Applied autostash.')" >&2
186 git stash store
-m "autostash" -q $stash_sha1 ||
187 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
188 gettext 'Applying autostash resulted in conflicts.
189 Your changes are safe in the stash.
190 You can run "git stash pop" or "git stash drop" at any time.
197 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
199 { git gc
--auto || true
; } &&
203 run_specific_rebase
() {
204 if [ "$interactive_rebase" = implied
]; then
211 if test -z "$preserve_merges"
215 git_rebase__preserve_merges
222 elif test $ret -eq 2 # special exit status for rebase -i
225 rm -rf "$state_dir" &&
231 run_pre_rebase_hook
() {
232 if test -z "$ok_to_skip_pre_rebase" &&
233 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
235 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
236 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
240 test -f "$apply_dir"/applying
&&
241 die
"$(gettext "It looks like
'git am' is
in progress. Cannot rebase.
")"
243 if test -d "$apply_dir"
246 state_dir
="$apply_dir"
247 elif test -d "$merge_dir"
249 if test -d "$merge_dir"/rewritten
252 interactive_rebase
=explicit
254 elif test -f "$merge_dir"/interactive
257 interactive_rebase
=explicit
261 state_dir
="$merge_dir"
263 test -n "$type" && in_progress
=t
270 ok_to_skip_pre_rebase
=yes
273 ok_to_skip_pre_rebase
=
275 --continue|
--skip|
--abort|
--quit|
--edit-todo|
--show-current-patch)
276 test $total_argc -eq 2 || usage
283 cmd
="${cmd}exec ${1#--exec=}${LF}"
284 test -z "$interactive_rebase" && interactive_rebase
=implied
287 interactive_rebase
=explicit
292 --allow-empty-message)
293 allow_empty_message
=--allow-empty-message
300 test -z "$interactive_rebase" && interactive_rebase
=implied
305 rebase-cousins
) rebase_cousins
=t
;;
306 no-rebase-cousins
) rebase_cousins
=;;
307 *) die
"Unknown mode: $1";;
309 test -z "$interactive_rebase" && interactive_rebase
=implied
313 test -z "$interactive_rebase" && interactive_rebase
=implied
331 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
333 test -z "$strategy" && strategy
=recursive
336 strategy
="${1#--strategy=}"
358 git_am_opt
="$git_am_opt -q"
363 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
364 case "${1#--whitespace=}" in
371 git_am_opt
="$git_am_opt $1"
379 --committer-date-is-author-date|
--ignore-date)
380 git_am_opt
="$git_am_opt $1"
384 git_am_opt
="$git_am_opt $1"
389 --force-rebase|
--no-ff)
392 --rerere-autoupdate|
--no-rerere-autoupdate)
393 allow_rerere_autoupdate
="$1"
399 gpg_sign_opt
="-S${1#--gpg-sign=}"
411 test $# -gt 2 && usage
415 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
416 # Only interactive rebase uses detailed reflog messages
417 if test -n "$interactive_rebase" && test "$GIT_REFLOG_ACTION" = rebase
419 GIT_REFLOG_ACTION
="rebase -i ($action)"
420 export GIT_REFLOG_ACTION
424 if test "$action" = "edit-todo" && test -z "$interactive_rebase"
426 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
432 git rev-parse
--verify HEAD
>/dev
/null ||
433 die
"$(gettext "Cannot
read HEAD
")"
434 git update-index
--ignore-submodules --refresh &&
435 git diff-files
--quiet --ignore-submodules ||
{
436 echo "$(gettext "You must edit all merge conflicts and
then
437 mark them as resolved using git add
")"
444 output git
reset --hard HEAD ||
exit $?
453 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
454 die
"$(eval_gettext "Could not move back to \
$head_name")"
457 output git
reset --hard $orig_head
462 exec rm -rf "$state_dir"
469 die
"BUG: run_specific_rebase is not supposed to return here"
473 # Make sure no rebase is in progress
474 if test -n "$in_progress"
476 state_dir_base
=${state_dir##*/}
477 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
478 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
480 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
481 I wonder if you are in the middle of another rebase. If that is the
484 If that is not the case, please
485 $cmd_clear_stale_rebase
486 and run me again. I am stopping in case you still have something
490 if test -n "$rebase_root" && test -z "$onto"
492 test -z "$interactive_rebase" && interactive_rebase
=implied
495 if test -n "$keep_empty"
497 test -z "$interactive_rebase" && interactive_rebase
=implied
500 if test -n "$interactive_rebase"
502 if test -z "$preserve_merges"
509 state_dir
="$merge_dir"
510 elif test -n "$do_merge"
513 state_dir
="$merge_dir"
516 state_dir
="$apply_dir"
519 if test -t 2 && test -z "$GIT_QUIET"
521 git_format_patch_opt
="$git_format_patch_opt --progress"
524 if test -n "$signoff"
526 test -n "$preserve_merges" &&
527 die
"$(gettext "error
: cannot combine
'--signoff' with
'--preserve-merges'")"
528 git_am_opt
="$git_am_opt $signoff"
532 if test -z "$rebase_root"
536 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
537 --verify -q @
{upstream
} 2>/dev
/null
)
540 error_on_missing_default_upstream
"rebase" "rebase" \
541 "against" "git rebase $(gettext '<branch>')"
544 test "$fork_point" = auto
&& fork_point
=t
546 *) upstream_name
="$1"
547 if test "$upstream_name" = "-"
549 upstream_name
="@{-1}"
554 upstream
=$
(peel_committish
"${upstream_name}") ||
555 die
"$(eval_gettext "invalid upstream
'\$upstream_name'")"
556 upstream_arg
="$upstream_name"
560 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
561 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
566 test $# -gt 1 && usage
570 # Make sure the branch to rebase onto is valid.
571 onto_name
=${onto-"$upstream_name"}
574 if left
=${onto_name%...*} right
=${onto_name#*...} &&
575 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
579 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
582 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
586 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
590 onto
=$
(peel_committish
"$onto_name") ||
591 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
595 # If the branch to rebase is given, that is the branch we will rebase
596 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
597 # $orig_head -- commit object name of tip of the branch before rebasing
598 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
602 # Is it "rebase other $branchname" or "rebase other $commit"?
606 # Is it a local branch?
607 if git show-ref
--verify --quiet -- "refs/heads/$branch_name" &&
608 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$branch_name")
610 head_name
="refs/heads/$branch_name"
611 # If not is it a valid ref (branch or commit)?
612 elif orig_head
=$
(git rev-parse
-q --verify "$branch_name")
614 head_name
="detached HEAD"
617 die
"$(eval_gettext "fatal
: no such branch
/commit
'\$branch_name'")"
621 # Do not need to switch branches, we are already on it.
622 if branch_name
=$
(git symbolic-ref
-q HEAD
)
624 head_name
=$branch_name
625 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
627 head_name
="detached HEAD"
630 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
633 die
"BUG: unexpected number of arguments left to parse"
637 if test "$fork_point" = t
639 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
640 "${switch_to:-HEAD}")
641 if test -n "$new_upstream"
643 restrict_revision
=$new_upstream
647 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
649 stash_sha1
=$
(git stash create
"autostash") ||
650 die
"$(gettext 'Cannot autostash')"
652 mkdir
-p "$state_dir" &&
653 echo $stash_sha1 >"$state_dir/autostash" &&
654 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
655 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
659 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
661 # Now we are rebasing commits $upstream..$orig_head (or with --root,
662 # everything leading up to $orig_head) on top of $onto
664 # Check if we are already based on $onto with linear history,
665 # but this should be done only when upstream and onto are the same
666 # and if this is not an interactive rebase.
667 mb
=$
(git merge-base
"$onto" "$orig_head")
668 if test -z "$interactive_rebase" && test "$upstream" = "$onto" &&
669 test "$mb" = "$onto" && test -z "$restrict_revision" &&
671 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
673 if test -z "$force_rebase"
675 # Lazily switch to the target branch if needed...
676 test -z "$switch_to" ||
677 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
678 git checkout
-q "$switch_to" --
679 if test "$branch_name" = "HEAD" &&
680 ! git symbolic-ref
-q HEAD
682 say
"$(eval_gettext "HEAD is up to
date.
")"
684 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
689 if test "$branch_name" = "HEAD" &&
690 ! git symbolic-ref
-q HEAD
692 say
"$(eval_gettext "HEAD is up to
date, rebase forced.
")"
694 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
699 # If a hook exists, give it a chance to interrupt
700 run_pre_rebase_hook
"$upstream_arg" "$@"
702 if test -n "$diffstat"
704 if test -n "$verbose"
706 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
708 # We want color (if set), but no pager
709 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
712 test -n "$interactive_rebase" && run_specific_rebase
714 # Detach HEAD and reset the tree
715 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
717 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
718 git checkout
-q "$onto^0" || die
"could not detach HEAD"
719 git update-ref ORIG_HEAD
$orig_head
721 # If the $onto is a proper descendant of the tip of the branch, then
722 # we just fast-forwarded.
723 if test "$mb" = "$orig_head"
725 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
726 move_to_original_branch
731 if test -n "$rebase_root"
733 revisions
="$onto..$orig_head"
735 revisions
="${restrict_revision-$upstream}..$orig_head"