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
99 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
100 case "$(git config --bool commit.gpgsign)" in
101 true
) gpg_sign_opt
=-S ;;
105 read_basic_state
() {
106 test -f "$state_dir/head-name" &&
107 test -f "$state_dir/onto" &&
108 head_name
=$
(cat "$state_dir"/head-name
) &&
109 onto
=$
(cat "$state_dir"/onto
) &&
110 # We always write to orig-head, but interactive rebase used to write to
111 # head. Fall back to reading from head to cover for the case that the
112 # user upgraded git with an ongoing interactive rebase.
113 if test -f "$state_dir"/orig-head
115 orig_head
=$
(cat "$state_dir"/orig-head
)
117 orig_head
=$
(cat "$state_dir"/head)
119 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
120 test -f "$state_dir"/verbose
&& verbose
=t
121 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
122 test -f "$state_dir"/strategy_opts
&&
123 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
124 test -f "$state_dir"/allow_rerere_autoupdate
&&
125 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
126 test -f "$state_dir"/gpg_sign_opt
&&
127 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
128 test -f "$state_dir"/signoff
&& {
129 signoff
="$(cat "$state_dir"/signoff)"
134 write_basic_state
() {
135 echo "$head_name" > "$state_dir"/head-name
&&
136 echo "$onto" > "$state_dir"/onto
&&
137 echo "$orig_head" > "$state_dir"/orig-head
&&
138 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
139 test t
= "$verbose" && : > "$state_dir"/verbose
140 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
141 test -n "$strategy_opts" && echo "$strategy_opts" > \
142 "$state_dir"/strategy_opts
143 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
144 "$state_dir"/allow_rerere_autoupdate
145 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
146 test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
154 test $status != 0 && printf "%s\n" "$output"
163 move_to_original_branch
() {
166 message
="rebase finished: $head_name onto $onto"
167 git update-ref
-m "$message" \
168 $head_name $
(git rev-parse HEAD
) $orig_head &&
170 -m "rebase finished: returning to $head_name" \
172 die
"$(eval_gettext "Could not move back to \
$head_name")"
178 if test -f "$state_dir/autostash"
180 stash_sha1
=$
(cat "$state_dir/autostash")
181 if git stash apply
$stash_sha1 >/dev
/null
2>&1
183 echo "$(gettext 'Applied autostash.')" >&2
185 git stash store
-m "autostash" -q $stash_sha1 ||
186 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
187 gettext 'Applying autostash resulted in conflicts.
188 Your changes are safe in the stash.
189 You can run "git stash pop" or "git stash drop" at any time.
196 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
198 { git gc
--auto || true
; } &&
202 run_specific_rebase
() {
203 if [ "$interactive_rebase" = implied
]; then
209 git_rebase__
$type${preserve_merges:+__preserve_merges}
214 elif test $ret -eq 2 # special exit status for rebase -i
217 rm -rf "$state_dir" &&
223 run_pre_rebase_hook
() {
224 if test -z "$ok_to_skip_pre_rebase" &&
225 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
227 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
228 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
232 test -f "$apply_dir"/applying
&&
233 die
"$(gettext "It looks like
'git am' is
in progress. Cannot rebase.
")"
235 if test -d "$apply_dir"
238 state_dir
="$apply_dir"
239 elif test -d "$merge_dir"
241 if test -f "$merge_dir"/interactive
244 interactive_rebase
=explicit
248 state_dir
="$merge_dir"
250 test -n "$type" && in_progress
=t
257 ok_to_skip_pre_rebase
=yes
260 ok_to_skip_pre_rebase
=
262 --continue|
--skip|
--abort|
--quit|
--edit-todo|
--show-current-patch)
263 test $total_argc -eq 2 || usage
270 cmd
="${cmd}exec ${1#--exec=}${LF}"
271 test -z "$interactive_rebase" && interactive_rebase
=implied
274 interactive_rebase
=explicit
279 --allow-empty-message)
280 allow_empty_message
=--allow-empty-message
287 test -z "$interactive_rebase" && interactive_rebase
=implied
291 test -z "$interactive_rebase" && interactive_rebase
=implied
309 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
311 test -z "$strategy" && strategy
=recursive
314 strategy
="${1#--strategy=}"
336 git_am_opt
="$git_am_opt -q"
341 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
342 case "${1#--whitespace=}" in
349 git_am_opt
="$git_am_opt $1"
357 --committer-date-is-author-date|
--ignore-date)
358 git_am_opt
="$git_am_opt $1"
362 git_am_opt
="$git_am_opt $1"
367 --force-rebase|
--no-ff)
370 --rerere-autoupdate|
--no-rerere-autoupdate)
371 allow_rerere_autoupdate
="$1"
377 gpg_sign_opt
="-S${1#--gpg-sign=}"
389 test $# -gt 2 && usage
393 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
394 # Only interactive rebase uses detailed reflog messages
395 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
397 GIT_REFLOG_ACTION
="rebase -i ($action)"
398 export GIT_REFLOG_ACTION
402 if test "$action" = "edit-todo" && test "$type" != "interactive"
404 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
410 git rev-parse
--verify HEAD
>/dev
/null ||
411 die
"$(gettext "Cannot
read HEAD
")"
412 git update-index
--ignore-submodules --refresh &&
413 git diff-files
--quiet --ignore-submodules ||
{
414 echo "$(gettext "You must edit all merge conflicts and
then
415 mark them as resolved using git add
")"
422 output git
reset --hard HEAD ||
exit $?
431 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
432 die
"$(eval_gettext "Could not move back to \
$head_name")"
435 output git
reset --hard $orig_head
440 exec rm -rf "$state_dir"
447 die
"BUG: run_specific_rebase is not supposed to return here"
451 # Make sure no rebase is in progress
452 if test -n "$in_progress"
454 state_dir_base
=${state_dir##*/}
455 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
456 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
458 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
459 I wonder if you are in the middle of another rebase. If that is the
462 If that is not the case, please
463 $cmd_clear_stale_rebase
464 and run me again. I am stopping in case you still have something
468 if test -n "$rebase_root" && test -z "$onto"
470 test -z "$interactive_rebase" && interactive_rebase
=implied
473 if test -n "$keep_empty"
475 test -z "$interactive_rebase" && interactive_rebase
=implied
478 if test -n "$interactive_rebase"
481 state_dir
="$merge_dir"
482 elif test -n "$do_merge"
485 state_dir
="$merge_dir"
488 state_dir
="$apply_dir"
491 if test -t 2 && test -z "$GIT_QUIET"
493 git_format_patch_opt
="$git_format_patch_opt --progress"
496 if test -n "$signoff"
498 test -n "$preserve_merges" &&
499 die
"$(gettext "error
: cannot combine
'--signoff' with
'--preserve-merges'")"
500 git_am_opt
="$git_am_opt $signoff"
504 if test -z "$rebase_root"
508 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
509 --verify -q @
{upstream
} 2>/dev
/null
)
512 error_on_missing_default_upstream
"rebase" "rebase" \
513 "against" "git rebase $(gettext '<branch>')"
516 test "$fork_point" = auto
&& fork_point
=t
518 *) upstream_name
="$1"
519 if test "$upstream_name" = "-"
521 upstream_name
="@{-1}"
526 upstream
=$
(peel_committish
"${upstream_name}") ||
527 die
"$(eval_gettext "invalid upstream
'\$upstream_name'")"
528 upstream_arg
="$upstream_name"
532 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
533 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
538 test $# -gt 1 && usage
542 # Make sure the branch to rebase onto is valid.
543 onto_name
=${onto-"$upstream_name"}
546 if left
=${onto_name%...*} right
=${onto_name#*...} &&
547 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
551 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
554 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
558 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
562 onto
=$
(peel_committish
"$onto_name") ||
563 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
567 # If the branch to rebase is given, that is the branch we will rebase
568 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
569 # $orig_head -- commit object name of tip of the branch before rebasing
570 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
574 # Is it "rebase other $branchname" or "rebase other $commit"?
578 # Is it a local branch?
579 if git show-ref
--verify --quiet -- "refs/heads/$branch_name" &&
580 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$branch_name")
582 head_name
="refs/heads/$branch_name"
583 # If not is it a valid ref (branch or commit)?
584 elif orig_head
=$
(git rev-parse
-q --verify "$branch_name")
586 head_name
="detached HEAD"
589 die
"$(eval_gettext "fatal
: no such branch
/commit
'\$branch_name'")"
593 # Do not need to switch branches, we are already on it.
594 if branch_name
=$
(git symbolic-ref
-q HEAD
)
596 head_name
=$branch_name
597 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
599 head_name
="detached HEAD"
602 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
605 die
"BUG: unexpected number of arguments left to parse"
609 if test "$fork_point" = t
611 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
612 "${switch_to:-HEAD}")
613 if test -n "$new_upstream"
615 restrict_revision
=$new_upstream
619 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
621 stash_sha1
=$
(git stash create
"autostash") ||
622 die
"$(gettext 'Cannot autostash')"
624 mkdir
-p "$state_dir" &&
625 echo $stash_sha1 >"$state_dir/autostash" &&
626 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
627 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
631 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
633 # Now we are rebasing commits $upstream..$orig_head (or with --root,
634 # everything leading up to $orig_head) on top of $onto
636 # Check if we are already based on $onto with linear history,
637 # but this should be done only when upstream and onto are the same
638 # and if this is not an interactive rebase.
639 mb
=$
(git merge-base
"$onto" "$orig_head")
640 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
641 test "$mb" = "$onto" && test -z "$restrict_revision" &&
643 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
645 if test -z "$force_rebase"
647 # Lazily switch to the target branch if needed...
648 test -z "$switch_to" ||
649 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
650 git checkout
-q "$switch_to" --
651 if test "$branch_name" = "HEAD" &&
652 ! git symbolic-ref
-q HEAD
654 say
"$(eval_gettext "HEAD is up to
date.
")"
656 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
661 if test "$branch_name" = "HEAD" &&
662 ! git symbolic-ref
-q HEAD
664 say
"$(eval_gettext "HEAD is up to
date, rebase forced.
")"
666 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
671 # If a hook exists, give it a chance to interrupt
672 run_pre_rebase_hook
"$upstream_arg" "$@"
674 if test -n "$diffstat"
676 if test -n "$verbose"
678 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
680 # We want color (if set), but no pager
681 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
684 test "$type" = interactive
&& run_specific_rebase
686 # Detach HEAD and reset the tree
687 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
689 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
690 git checkout
-q "$onto^0" || die
"could not detach HEAD"
691 git update-ref ORIG_HEAD
$orig_head
693 # If the $onto is a proper descendant of the tip of the branch, then
694 # we just fast-forwarded.
695 if test "$mb" = "$orig_head"
697 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
698 move_to_original_branch
703 if test -n "$rebase_root"
705 revisions
="$onto..$orig_head"
707 revisions
="${restrict_revision-$upstream}..$orig_head"