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
97 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
98 case "$(git config --bool commit.gpgsign)" in
99 true
) gpg_sign_opt
=-S ;;
103 read_basic_state
() {
104 test -f "$state_dir/head-name" &&
105 test -f "$state_dir/onto" &&
106 head_name
=$
(cat "$state_dir"/head-name
) &&
107 onto
=$
(cat "$state_dir"/onto
) &&
108 # We always write to orig-head, but interactive rebase used to write to
109 # head. Fall back to reading from head to cover for the case that the
110 # user upgraded git with an ongoing interactive rebase.
111 if test -f "$state_dir"/orig-head
113 orig_head
=$
(cat "$state_dir"/orig-head
)
115 orig_head
=$
(cat "$state_dir"/head)
117 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
118 test -f "$state_dir"/verbose
&& verbose
=t
119 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
120 test -f "$state_dir"/strategy_opts
&&
121 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
122 test -f "$state_dir"/allow_rerere_autoupdate
&&
123 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
124 test -f "$state_dir"/gpg_sign_opt
&&
125 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
126 test -f "$state_dir"/signoff
&& {
127 signoff
="$(cat "$state_dir"/signoff)"
132 write_basic_state
() {
133 echo "$head_name" > "$state_dir"/head-name
&&
134 echo "$onto" > "$state_dir"/onto
&&
135 echo "$orig_head" > "$state_dir"/orig-head
&&
136 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
137 test t
= "$verbose" && : > "$state_dir"/verbose
138 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
139 test -n "$strategy_opts" && echo "$strategy_opts" > \
140 "$state_dir"/strategy_opts
141 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
142 "$state_dir"/allow_rerere_autoupdate
143 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
144 test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
152 test $status != 0 && printf "%s\n" "$output"
161 move_to_original_branch
() {
164 message
="rebase finished: $head_name onto $onto"
165 git update-ref
-m "$message" \
166 $head_name $
(git rev-parse HEAD
) $orig_head &&
168 -m "rebase finished: returning to $head_name" \
170 die
"$(eval_gettext "Could not move back to \
$head_name")"
176 if test -f "$state_dir/autostash"
178 stash_sha1
=$
(cat "$state_dir/autostash")
179 if git stash apply
$stash_sha1 >/dev
/null
2>&1
181 echo "$(gettext 'Applied autostash.')" >&2
183 git stash store
-m "autostash" -q $stash_sha1 ||
184 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
185 gettext 'Applying autostash resulted in conflicts.
186 Your changes are safe in the stash.
187 You can run "git stash pop" or "git stash drop" at any time.
194 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
196 { git gc
--auto || true
; } &&
200 run_specific_rebase
() {
201 if [ "$interactive_rebase" = implied
]; then
207 git_rebase__
$type${preserve_merges:+__preserve_merges}
212 elif test $ret -eq 2 # special exit status for rebase -i
215 rm -rf "$state_dir" &&
221 run_pre_rebase_hook
() {
222 if test -z "$ok_to_skip_pre_rebase" &&
223 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
225 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
226 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
230 test -f "$apply_dir"/applying
&&
231 die
"$(gettext "It looks like
'git am' is
in progress. Cannot rebase.
")"
233 if test -d "$apply_dir"
236 state_dir
="$apply_dir"
237 elif test -d "$merge_dir"
239 if test -f "$merge_dir"/interactive
242 interactive_rebase
=explicit
246 state_dir
="$merge_dir"
248 test -n "$type" && in_progress
=t
255 ok_to_skip_pre_rebase
=yes
258 ok_to_skip_pre_rebase
=
260 --continue|
--skip|
--abort|
--quit|
--edit-todo|
--show-current-patch)
261 test $total_argc -eq 2 || usage
268 cmd
="${cmd}exec ${1#--exec=}${LF}"
269 test -z "$interactive_rebase" && interactive_rebase
=implied
272 interactive_rebase
=explicit
277 --allow-empty-message)
278 allow_empty_message
=--allow-empty-message
285 test -z "$interactive_rebase" && interactive_rebase
=implied
303 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
305 test -z "$strategy" && strategy
=recursive
308 strategy
="${1#--strategy=}"
330 git_am_opt
="$git_am_opt -q"
335 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
336 case "${1#--whitespace=}" in
343 git_am_opt
="$git_am_opt $1"
351 --committer-date-is-author-date|
--ignore-date)
352 git_am_opt
="$git_am_opt $1"
356 git_am_opt
="$git_am_opt $1"
361 --force-rebase|
--no-ff)
364 --rerere-autoupdate|
--no-rerere-autoupdate)
365 allow_rerere_autoupdate
="$1"
371 gpg_sign_opt
="-S${1#--gpg-sign=}"
383 test $# -gt 2 && usage
387 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
388 # Only interactive rebase uses detailed reflog messages
389 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
391 GIT_REFLOG_ACTION
="rebase -i ($action)"
392 export GIT_REFLOG_ACTION
396 if test "$action" = "edit-todo" && test "$type" != "interactive"
398 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
404 git rev-parse
--verify HEAD
>/dev
/null ||
405 die
"$(gettext "Cannot
read HEAD
")"
406 git update-index
--ignore-submodules --refresh &&
407 git diff-files
--quiet --ignore-submodules ||
{
408 echo "$(gettext "You must edit all merge conflicts and
then
409 mark them as resolved using git add
")"
416 output git
reset --hard HEAD ||
exit $?
425 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
426 die
"$(eval_gettext "Could not move back to \
$head_name")"
429 output git
reset --hard $orig_head
434 exec rm -rf "$state_dir"
441 die
"BUG: run_specific_rebase is not supposed to return here"
445 # Make sure no rebase is in progress
446 if test -n "$in_progress"
448 state_dir_base
=${state_dir##*/}
449 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
450 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
452 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
453 I wonder if you are in the middle of another rebase. If that is the
456 If that is not the case, please
457 $cmd_clear_stale_rebase
458 and run me again. I am stopping in case you still have something
462 if test -n "$rebase_root" && test -z "$onto"
464 test -z "$interactive_rebase" && interactive_rebase
=implied
467 if test -n "$keep_empty"
469 test -z "$interactive_rebase" && interactive_rebase
=implied
472 if test -n "$interactive_rebase"
475 state_dir
="$merge_dir"
476 elif test -n "$do_merge"
479 state_dir
="$merge_dir"
482 state_dir
="$apply_dir"
485 if test -t 2 && test -z "$GIT_QUIET"
487 git_format_patch_opt
="$git_format_patch_opt --progress"
490 if test -n "$signoff"
492 test -n "$preserve_merges" &&
493 die
"$(gettext "error
: cannot combine
'--signoff' with
'--preserve-merges'")"
494 git_am_opt
="$git_am_opt $signoff"
498 if test -z "$rebase_root"
502 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
503 --verify -q @
{upstream
} 2>/dev
/null
)
506 error_on_missing_default_upstream
"rebase" "rebase" \
507 "against" "git rebase $(gettext '<branch>')"
510 test "$fork_point" = auto
&& fork_point
=t
512 *) upstream_name
="$1"
513 if test "$upstream_name" = "-"
515 upstream_name
="@{-1}"
520 upstream
=$
(peel_committish
"${upstream_name}") ||
521 die
"$(eval_gettext "invalid upstream
'\$upstream_name'")"
522 upstream_arg
="$upstream_name"
526 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
527 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
532 test $# -gt 1 && usage
536 # Make sure the branch to rebase onto is valid.
537 onto_name
=${onto-"$upstream_name"}
540 if left
=${onto_name%...*} right
=${onto_name#*...} &&
541 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
545 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
548 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
552 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
556 onto
=$
(peel_committish
"$onto_name") ||
557 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
561 # If the branch to rebase is given, that is the branch we will rebase
562 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
563 # $orig_head -- commit object name of tip of the branch before rebasing
564 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
568 # Is it "rebase other $branchname" or "rebase other $commit"?
572 # Is it a local branch?
573 if git show-ref
--verify --quiet -- "refs/heads/$branch_name" &&
574 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$branch_name")
576 head_name
="refs/heads/$branch_name"
577 # If not is it a valid ref (branch or commit)?
578 elif orig_head
=$
(git rev-parse
-q --verify "$branch_name")
580 head_name
="detached HEAD"
583 die
"$(eval_gettext "fatal
: no such branch
/commit
'\$branch_name'")"
587 # Do not need to switch branches, we are already on it.
588 if branch_name
=$
(git symbolic-ref
-q HEAD
)
590 head_name
=$branch_name
591 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
593 head_name
="detached HEAD"
596 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
599 die
"BUG: unexpected number of arguments left to parse"
603 if test "$fork_point" = t
605 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
606 "${switch_to:-HEAD}")
607 if test -n "$new_upstream"
609 restrict_revision
=$new_upstream
613 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
615 stash_sha1
=$
(git stash create
"autostash") ||
616 die
"$(gettext 'Cannot autostash')"
618 mkdir
-p "$state_dir" &&
619 echo $stash_sha1 >"$state_dir/autostash" &&
620 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
621 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
625 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
627 # Now we are rebasing commits $upstream..$orig_head (or with --root,
628 # everything leading up to $orig_head) on top of $onto
630 # Check if we are already based on $onto with linear history,
631 # but this should be done only when upstream and onto are the same
632 # and if this is not an interactive rebase.
633 mb
=$
(git merge-base
"$onto" "$orig_head")
634 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
635 test "$mb" = "$onto" && test -z "$restrict_revision" &&
637 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
639 if test -z "$force_rebase"
641 # Lazily switch to the target branch if needed...
642 test -z "$switch_to" ||
643 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
644 git checkout
-q "$switch_to" --
645 if test "$branch_name" = "HEAD" &&
646 ! git symbolic-ref
-q HEAD
648 say
"$(eval_gettext "HEAD is up to
date.
")"
650 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
655 if test "$branch_name" = "HEAD" &&
656 ! git symbolic-ref
-q HEAD
658 say
"$(eval_gettext "HEAD is up to
date, rebase forced.
")"
660 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
665 # If a hook exists, give it a chance to interrupt
666 run_pre_rebase_hook
"$upstream_arg" "$@"
668 if test -n "$diffstat"
670 if test -n "$verbose"
672 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
674 # We want color (if set), but no pager
675 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
678 test "$type" = interactive
&& run_specific_rebase
680 # Detach HEAD and reset the tree
681 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
683 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
684 git checkout
-q "$onto^0" || die
"could not detach HEAD"
685 git update-ref ORIG_HEAD
$orig_head
687 # If the $onto is a proper descendant of the tip of the branch, then
688 # we just fast-forwarded.
689 if test "$mb" = "$orig_head"
691 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
692 move_to_original_branch
697 if test -n "$rebase_root"
699 revisions
="$onto..$orig_head"
701 revisions
="${restrict_revision-$upstream}..$orig_head"