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
; } &&
204 GIT_CHERRY_PICK_HELP
="$resolvemsg"
205 export GIT_CHERRY_PICK_HELP
207 test -n "$keep_empty" && keep_empty
="--keep-empty"
208 test -n "$rebase_merges" && rebase_merges
="--rebase-merges"
209 test -n "$rebase_cousins" && rebase_cousins
="--rebase-cousins"
210 test -n "$autosquash" && autosquash
="--autosquash"
211 test -n "$verbose" && verbose
="--verbose"
212 test -n "$force_rebase" && force_rebase
="--no-ff"
213 test -n "$restrict_revision" && \
214 restrict_revision
="--restrict-revision=^$restrict_revision"
215 test -n "$upstream" && upstream
="--upstream=$upstream"
216 test -n "$onto" && onto
="--onto=$onto"
217 test -n "$squash_onto" && squash_onto
="--squash-onto=$squash_onto"
218 test -n "$onto_name" && onto_name
="--onto-name=$onto_name"
219 test -n "$head_name" && head_name
="--head-name=$head_name"
220 test -n "$strategy" && strategy
="--strategy=$strategy"
221 test -n "$strategy_opts" && strategy_opts
="--strategy-opts=$strategy_opts"
222 test -n "$switch_to" && switch_to
="--switch-to=$switch_to"
223 test -n "$cmd" && cmd
="--cmd=$cmd"
224 test -n "$action" && action
="--$action"
226 exec git rebase--interactive
"$action" "$keep_empty" "$rebase_merges" "$rebase_cousins" \
227 "$upstream" "$onto" "$squash_onto" "$restrict_revision" \
228 "$allow_empty_message" "$autosquash" "$verbose" \
229 "$force_rebase" "$onto_name" "$head_name" "$strategy" \
230 "$strategy_opts" "$cmd" "$switch_to" \
231 "$allow_rerere_autoupdate" "$gpg_sign_opt" "$signoff"
234 run_specific_rebase
() {
235 if [ "$interactive_rebase" = implied
]; then
241 if test -n "$interactive_rebase" -a -z "$preserve_merges"
247 if test -z "$preserve_merges"
251 git_rebase__preserve_merges
259 elif test $ret -eq 2 # special exit status for rebase -p
262 rm -rf "$state_dir" &&
268 run_pre_rebase_hook
() {
269 if test -z "$ok_to_skip_pre_rebase" &&
270 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
272 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
273 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
277 test -f "$apply_dir"/applying
&&
278 die
"$(gettext "It looks like
'git am' is
in progress. Cannot rebase.
")"
280 if test -d "$apply_dir"
283 state_dir
="$apply_dir"
284 elif test -d "$merge_dir"
286 if test -d "$merge_dir"/rewritten
289 interactive_rebase
=explicit
291 elif test -f "$merge_dir"/interactive
294 interactive_rebase
=explicit
298 state_dir
="$merge_dir"
300 test -n "$type" && in_progress
=t
307 ok_to_skip_pre_rebase
=yes
310 ok_to_skip_pre_rebase
=
312 --continue|
--skip|
--abort|
--quit|
--edit-todo|
--show-current-patch)
313 test $total_argc -eq 2 || usage
320 cmd
="${cmd}exec ${1#--exec=}${LF}"
321 test -z "$interactive_rebase" && interactive_rebase
=implied
324 interactive_rebase
=explicit
329 --allow-empty-message)
330 allow_empty_message
=--allow-empty-message
337 test -z "$interactive_rebase" && interactive_rebase
=implied
342 rebase-cousins
) rebase_cousins
=t
;;
343 no-rebase-cousins
) rebase_cousins
=;;
344 *) die
"Unknown mode: $1";;
346 test -z "$interactive_rebase" && interactive_rebase
=implied
350 test -z "$interactive_rebase" && interactive_rebase
=implied
368 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}" | sed -e s/^.//)"
370 test -z "$strategy" && strategy
=recursive
373 strategy
="${1#--strategy=}"
395 git_am_opt
="$git_am_opt -q"
400 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
401 case "${1#--whitespace=}" in
408 git_am_opt
="$git_am_opt $1"
416 --committer-date-is-author-date|
--ignore-date)
417 git_am_opt
="$git_am_opt $1"
421 git_am_opt
="$git_am_opt $1"
426 --force-rebase|
--no-ff)
429 --rerere-autoupdate|
--no-rerere-autoupdate)
430 allow_rerere_autoupdate
="$1"
436 gpg_sign_opt
="-S${1#--gpg-sign=}"
448 test $# -gt 2 && usage
452 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
453 # Only interactive rebase uses detailed reflog messages
454 if test -n "$interactive_rebase" && test "$GIT_REFLOG_ACTION" = rebase
456 GIT_REFLOG_ACTION
="rebase -i ($action)"
457 export GIT_REFLOG_ACTION
461 if test "$action" = "edit-todo" && test -z "$interactive_rebase"
463 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
469 git rev-parse
--verify HEAD
>/dev
/null ||
470 die
"$(gettext "Cannot
read HEAD
")"
471 git update-index
--ignore-submodules --refresh &&
472 git diff-files
--quiet --ignore-submodules ||
{
473 echo "$(gettext "You must edit all merge conflicts and
then
474 mark them as resolved using git add
")"
481 output git
reset --hard HEAD ||
exit $?
490 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
491 die
"$(eval_gettext "Could not move back to \
$head_name")"
494 output git
reset --hard $orig_head
499 exec rm -rf "$state_dir"
506 die
"BUG: run_specific_rebase is not supposed to return here"
510 # Make sure no rebase is in progress
511 if test -n "$in_progress"
513 state_dir_base
=${state_dir##*/}
514 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
515 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
517 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
518 I wonder if you are in the middle of another rebase. If that is the
521 If that is not the case, please
522 $cmd_clear_stale_rebase
523 and run me again. I am stopping in case you still have something
527 if test -n "$rebase_root" && test -z "$onto"
529 test -z "$interactive_rebase" && interactive_rebase
=implied
532 if test -n "$keep_empty"
534 test -z "$interactive_rebase" && interactive_rebase
=implied
537 if test -n "$interactive_rebase"
539 if test -z "$preserve_merges"
546 state_dir
="$merge_dir"
547 elif test -n "$do_merge"
550 state_dir
="$merge_dir"
553 state_dir
="$apply_dir"
556 if test -t 2 && test -z "$GIT_QUIET"
558 git_format_patch_opt
="$git_format_patch_opt --progress"
561 if test -n "$signoff"
563 test -n "$preserve_merges" &&
564 die
"$(gettext "error
: cannot combine
'--signoff' with
'--preserve-merges'")"
565 git_am_opt
="$git_am_opt $signoff"
569 if test -z "$rebase_root"
573 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
574 --verify -q @
{upstream
} 2>/dev
/null
)
577 error_on_missing_default_upstream
"rebase" "rebase" \
578 "against" "git rebase $(gettext '<branch>')"
581 test "$fork_point" = auto
&& fork_point
=t
583 *) upstream_name
="$1"
584 if test "$upstream_name" = "-"
586 upstream_name
="@{-1}"
591 upstream
=$
(peel_committish
"${upstream_name}") ||
592 die
"$(eval_gettext "invalid upstream
'\$upstream_name'")"
593 upstream_arg
="$upstream_name"
597 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
598 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
603 test $# -gt 1 && usage
607 # Make sure the branch to rebase onto is valid.
608 onto_name
=${onto-"$upstream_name"}
611 if left
=${onto_name%...*} right
=${onto_name#*...} &&
612 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
616 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
619 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
623 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
627 onto
=$
(peel_committish
"$onto_name") ||
628 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
632 # If the branch to rebase is given, that is the branch we will rebase
633 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
634 # $orig_head -- commit object name of tip of the branch before rebasing
635 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
639 # Is it "rebase other $branchname" or "rebase other $commit"?
643 # Is it a local branch?
644 if git show-ref
--verify --quiet -- "refs/heads/$branch_name" &&
645 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$branch_name")
647 head_name
="refs/heads/$branch_name"
648 # If not is it a valid ref (branch or commit)?
649 elif orig_head
=$
(git rev-parse
-q --verify "$branch_name")
651 head_name
="detached HEAD"
654 die
"$(eval_gettext "fatal
: no such branch
/commit
'\$branch_name'")"
658 # Do not need to switch branches, we are already on it.
659 if branch_name
=$
(git symbolic-ref
-q HEAD
)
661 head_name
=$branch_name
662 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
664 head_name
="detached HEAD"
667 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
670 die
"BUG: unexpected number of arguments left to parse"
674 if test "$fork_point" = t
676 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
677 "${switch_to:-HEAD}")
678 if test -n "$new_upstream"
680 restrict_revision
=$new_upstream
684 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
686 stash_sha1
=$
(git stash create
"autostash") ||
687 die
"$(gettext 'Cannot autostash')"
689 mkdir
-p "$state_dir" &&
690 echo $stash_sha1 >"$state_dir/autostash" &&
691 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
692 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
696 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
698 # Now we are rebasing commits $upstream..$orig_head (or with --root,
699 # everything leading up to $orig_head) on top of $onto
701 # Check if we are already based on $onto with linear history,
702 # but this should be done only when upstream and onto are the same
703 # and if this is not an interactive rebase.
704 mb
=$
(git merge-base
"$onto" "$orig_head")
705 if test -z "$interactive_rebase" && test "$upstream" = "$onto" &&
706 test "$mb" = "$onto" && test -z "$restrict_revision" &&
708 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
710 if test -z "$force_rebase"
712 # Lazily switch to the target branch if needed...
713 test -z "$switch_to" ||
714 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
715 git checkout
-q "$switch_to" --
716 if test "$branch_name" = "HEAD" &&
717 ! git symbolic-ref
-q HEAD
719 say
"$(eval_gettext "HEAD is up to
date.
")"
721 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
726 if test "$branch_name" = "HEAD" &&
727 ! git symbolic-ref
-q HEAD
729 say
"$(eval_gettext "HEAD is up to
date, rebase forced.
")"
731 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
736 # If a hook exists, give it a chance to interrupt
737 run_pre_rebase_hook
"$upstream_arg" "$@"
739 if test -n "$diffstat"
741 if test -n "$verbose"
743 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
745 # We want color (if set), but no pager
746 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
749 test -n "$interactive_rebase" && run_specific_rebase
751 # Detach HEAD and reset the tree
752 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
754 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
755 git checkout
-q "$onto^0" || die
"could not detach HEAD"
756 git update-ref ORIG_HEAD
$orig_head
758 # If the $onto is a proper descendant of the tip of the branch, then
759 # we just fast-forwarded.
760 if test "$mb" = "$orig_head"
762 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
763 move_to_original_branch
768 if test -n "$rebase_root"
770 revisions
="$onto..$orig_head"
772 revisions
="${restrict_revision-$upstream}..$orig_head"