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 allow-empty-message allow rebasing commits with empty messages
28 f,force-rebase! force rebase even if branch is up to date
29 X,strategy-option=! pass the argument through to the merge strategy
30 stat! display a diffstat of what changed upstream
31 n,no-stat! do not show diffstat of what changed upstream
32 verify allow pre-rebase hook to run
33 rerere-autoupdate allow rerere to update index with resolved conflicts
34 root! rebase all reachable commits up to the root(s)
35 autosquash move commits that begin with squash!/fixup! under -i
36 committer-date-is-author-date! passed to 'git am'
37 ignore-date! passed to 'git am'
38 signoff passed to 'git am'
39 whitespace=! passed to 'git apply'
40 ignore-whitespace! passed to 'git apply'
41 C=! passed to 'git apply'
42 S,gpg-sign? GPG-sign commits
45 abort! abort and check out the original branch
46 skip! skip current patch and continue
47 edit-todo! edit the todo list during an interactive rebase
48 quit! abort but keep HEAD where it is
49 show-current-patch! show the patch file being applied or merged
52 set_reflog_action rebase
53 require_work_tree_exists
58 ok_to_skip_pre_rebase
=
60 $(gettext 'Resolve all conflicts manually, mark them as resolved with
61 "git add
/rm <conflicted_files
>", then run "git rebase
--continue".
62 You can instead skip this commit: run "git rebase
--skip".
63 To abort and get back to the state before "git rebase
", run "git rebase
--abort".')
67 unset restrict_revision
72 merge_dir
="$GIT_DIR"/rebase-merge
73 apply_dir
="$GIT_DIR"/rebase-apply
76 test "$(git config --bool rebase.stat)" = true
&& diffstat
=t
77 autostash
="$(git config --bool rebase.autostash || echo false)"
83 allow_rerere_autoupdate
=
84 # Non-empty if a rebase was in progress when 'git rebase' was invoked
86 # One of {am, merge, interactive}
88 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
90 # One of {'', continue, skip, abort}, as parsed from command line
96 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
97 case "$(git config --bool commit.gpgsign)" in
98 true
) gpg_sign_opt
=-S ;;
102 read_basic_state
() {
103 test -f "$state_dir/head-name" &&
104 test -f "$state_dir/onto" &&
105 head_name
=$
(cat "$state_dir"/head-name
) &&
106 onto
=$
(cat "$state_dir"/onto
) &&
107 # We always write to orig-head, but interactive rebase used to write to
108 # head. Fall back to reading from head to cover for the case that the
109 # user upgraded git with an ongoing interactive rebase.
110 if test -f "$state_dir"/orig-head
112 orig_head
=$
(cat "$state_dir"/orig-head
)
114 orig_head
=$
(cat "$state_dir"/head)
116 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
117 test -f "$state_dir"/verbose
&& verbose
=t
118 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
119 test -f "$state_dir"/strategy_opts
&&
120 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
121 test -f "$state_dir"/allow_rerere_autoupdate
&&
122 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
123 test -f "$state_dir"/gpg_sign_opt
&&
124 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
127 write_basic_state
() {
128 echo "$head_name" > "$state_dir"/head-name
&&
129 echo "$onto" > "$state_dir"/onto
&&
130 echo "$orig_head" > "$state_dir"/orig-head
&&
131 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
132 test t
= "$verbose" && : > "$state_dir"/verbose
133 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
134 test -n "$strategy_opts" && echo "$strategy_opts" > \
135 "$state_dir"/strategy_opts
136 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
137 "$state_dir"/allow_rerere_autoupdate
138 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
146 test $status != 0 && printf "%s\n" "$output"
155 move_to_original_branch
() {
158 message
="rebase finished: $head_name onto $onto"
159 git update-ref
-m "$message" \
160 $head_name $
(git rev-parse HEAD
) $orig_head &&
162 -m "rebase finished: returning to $head_name" \
164 die
"$(eval_gettext "Could not move back to \
$head_name")"
170 if test -f "$state_dir/autostash"
172 stash_sha1
=$
(cat "$state_dir/autostash")
173 if git stash apply
$stash_sha1 >/dev
/null
2>&1
175 echo "$(gettext 'Applied autostash.')" >&2
177 git stash store
-m "autostash" -q $stash_sha1 ||
178 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
179 gettext 'Applying autostash resulted in conflicts.
180 Your changes are safe in the stash.
181 You can run "git stash pop" or "git stash drop" at any time.
188 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
190 { git gc
--auto || true
; } &&
194 run_specific_rebase
() {
195 if [ "$interactive_rebase" = implied
]; then
201 git_rebase__
$type${preserve_merges:+__preserve_merges}
206 elif test $ret -eq 2 # special exit status for rebase -i
209 rm -rf "$state_dir" &&
215 run_pre_rebase_hook
() {
216 if test -z "$ok_to_skip_pre_rebase" &&
217 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
219 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
220 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
224 test -f "$apply_dir"/applying
&&
225 die
"$(gettext "It looks like
'git am' is
in progress. Cannot rebase.
")"
227 if test -d "$apply_dir"
230 state_dir
="$apply_dir"
231 elif test -d "$merge_dir"
233 if test -f "$merge_dir"/interactive
236 interactive_rebase
=explicit
240 state_dir
="$merge_dir"
242 test -n "$type" && in_progress
=t
249 ok_to_skip_pre_rebase
=yes
252 ok_to_skip_pre_rebase
=
254 --continue|
--skip|
--abort|
--quit|
--edit-todo|
--show-current-patch)
255 test $total_argc -eq 2 || usage
262 cmd
="${cmd}exec ${1#--exec=}${LF}"
263 test -z "$interactive_rebase" && interactive_rebase
=implied
266 interactive_rebase
=explicit
271 --allow-empty-message)
272 allow_empty_message
=--allow-empty-message
279 test -z "$interactive_rebase" && interactive_rebase
=implied
297 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
299 test -z "$strategy" && strategy
=recursive
302 strategy
="${1#--strategy=}"
324 git_am_opt
="$git_am_opt -q"
329 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
330 case "${1#--whitespace=}" in
337 git_am_opt
="$git_am_opt $1"
339 --committer-date-is-author-date|
--ignore-date|
--signoff|
--no-signoff)
340 git_am_opt
="$git_am_opt $1"
344 git_am_opt
="$git_am_opt $1"
349 --force-rebase|
--no-ff)
352 --rerere-autoupdate|
--no-rerere-autoupdate)
353 allow_rerere_autoupdate
="$1"
359 gpg_sign_opt
="-S${1#--gpg-sign=}"
371 test $# -gt 2 && usage
375 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
376 # Only interactive rebase uses detailed reflog messages
377 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
379 GIT_REFLOG_ACTION
="rebase -i ($action)"
380 export GIT_REFLOG_ACTION
384 if test "$action" = "edit-todo" && test "$type" != "interactive"
386 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
392 git rev-parse
--verify HEAD
>/dev
/null ||
393 die
"$(gettext "Cannot
read HEAD
")"
394 git update-index
--ignore-submodules --refresh &&
395 git diff-files
--quiet --ignore-submodules ||
{
396 echo "$(gettext "You must edit all merge conflicts and
then
397 mark them as resolved using git add
")"
404 output git
reset --hard HEAD ||
exit $?
413 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
414 die
"$(eval_gettext "Could not move back to \
$head_name")"
417 output git
reset --hard $orig_head
422 exec rm -rf "$state_dir"
429 die
"BUG: run_specific_rebase is not supposed to return here"
433 # Make sure no rebase is in progress
434 if test -n "$in_progress"
436 state_dir_base
=${state_dir##*/}
437 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
438 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
440 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
441 I wonder if you are in the middle of another rebase. If that is the
444 If that is not the case, please
445 $cmd_clear_stale_rebase
446 and run me again. I am stopping in case you still have something
450 if test -n "$rebase_root" && test -z "$onto"
452 test -z "$interactive_rebase" && interactive_rebase
=implied
455 if test -n "$interactive_rebase"
458 state_dir
="$merge_dir"
459 elif test -n "$do_merge"
462 state_dir
="$merge_dir"
465 state_dir
="$apply_dir"
468 if test -t 2 && test -z "$GIT_QUIET"
470 git_format_patch_opt
="$git_format_patch_opt --progress"
473 if test -z "$rebase_root"
477 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
478 --verify -q @
{upstream
} 2>/dev
/null
)
481 error_on_missing_default_upstream
"rebase" "rebase" \
482 "against" "git rebase $(gettext '<branch>')"
485 test "$fork_point" = auto
&& fork_point
=t
487 *) upstream_name
="$1"
488 if test "$upstream_name" = "-"
490 upstream_name
="@{-1}"
495 upstream
=$
(peel_committish
"${upstream_name}") ||
496 die
"$(eval_gettext "invalid upstream
'\$upstream_name'")"
497 upstream_arg
="$upstream_name"
501 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
502 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
507 test $# -gt 1 && usage
511 # Make sure the branch to rebase onto is valid.
512 onto_name
=${onto-"$upstream_name"}
515 if left
=${onto_name%...*} right
=${onto_name#*...} &&
516 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
520 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
523 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
527 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
531 onto
=$
(peel_committish
"$onto_name") ||
532 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
536 # If the branch to rebase is given, that is the branch we will rebase
537 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
538 # $orig_head -- commit object name of tip of the branch before rebasing
539 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
543 # Is it "rebase other $branchname" or "rebase other $commit"?
547 # Is it a local branch?
548 if git show-ref
--verify --quiet -- "refs/heads/$branch_name" &&
549 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$branch_name")
551 head_name
="refs/heads/$branch_name"
552 # If not is it a valid ref (branch or commit)?
553 elif orig_head
=$
(git rev-parse
-q --verify "$branch_name")
555 head_name
="detached HEAD"
558 die
"$(eval_gettext "fatal
: no such branch
/commit
'\$branch_name'")"
562 # Do not need to switch branches, we are already on it.
563 if branch_name
=$
(git symbolic-ref
-q HEAD
)
565 head_name
=$branch_name
566 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
568 head_name
="detached HEAD"
571 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
574 die
"BUG: unexpected number of arguments left to parse"
578 if test "$fork_point" = t
580 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
581 "${switch_to:-HEAD}")
582 if test -n "$new_upstream"
584 restrict_revision
=$new_upstream
588 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
590 stash_sha1
=$
(git stash create
"autostash") ||
591 die
"$(gettext 'Cannot autostash')"
593 mkdir
-p "$state_dir" &&
594 echo $stash_sha1 >"$state_dir/autostash" &&
595 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
596 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
600 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
602 # Now we are rebasing commits $upstream..$orig_head (or with --root,
603 # everything leading up to $orig_head) on top of $onto
605 # Check if we are already based on $onto with linear history,
606 # but this should be done only when upstream and onto are the same
607 # and if this is not an interactive rebase.
608 mb
=$
(git merge-base
"$onto" "$orig_head")
609 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
610 test "$mb" = "$onto" && test -z "$restrict_revision" &&
612 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
614 if test -z "$force_rebase"
616 # Lazily switch to the target branch if needed...
617 test -z "$switch_to" ||
618 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
619 git checkout
-q "$switch_to" --
620 if test "$branch_name" = "HEAD" &&
621 ! git symbolic-ref
-q HEAD
623 say
"$(eval_gettext "HEAD is up to
date.
")"
625 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
630 if test "$branch_name" = "HEAD" &&
631 ! git symbolic-ref
-q HEAD
633 say
"$(eval_gettext "HEAD is up to
date, rebase forced.
")"
635 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
640 # If a hook exists, give it a chance to interrupt
641 run_pre_rebase_hook
"$upstream_arg" "$@"
643 if test -n "$diffstat"
645 if test -n "$verbose"
647 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
649 # We want color (if set), but no pager
650 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
653 test "$type" = interactive
&& run_specific_rebase
655 # Detach HEAD and reset the tree
656 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
658 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
659 git checkout
-q "$onto^0" || die
"could not detach HEAD"
660 git update-ref ORIG_HEAD
$orig_head
662 # If the $onto is a proper descendant of the tip of the branch, then
663 # we just fast-forwarded.
664 if test "$mb" = "$orig_head"
666 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
667 move_to_original_branch
672 if test -n "$rebase_root"
674 revisions
="$onto..$orig_head"
676 revisions
="${restrict_revision-$upstream}..$orig_head"