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".')
66 unset restrict_revision
71 merge_dir
="$GIT_DIR"/rebase-merge
72 apply_dir
="$GIT_DIR"/rebase-apply
75 test "$(git config --bool rebase.stat)" = true
&& diffstat
=t
76 autostash
="$(git config --bool rebase.autostash || echo false)"
82 allow_rerere_autoupdate
=
83 # Non-empty if a rebase was in progress when 'git rebase' was invoked
85 # One of {am, merge, interactive}
87 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
89 # One of {'', continue, skip, abort}, as parsed from command line
95 test "$(git config --bool rebase.autosquash)" = "true" && autosquash
=t
96 case "$(git config --bool commit.gpgsign)" in
97 true
) gpg_sign_opt
=-S ;;
101 read_basic_state
() {
102 test -f "$state_dir/head-name" &&
103 test -f "$state_dir/onto" &&
104 head_name
=$
(cat "$state_dir"/head-name
) &&
105 onto
=$
(cat "$state_dir"/onto
) &&
106 # We always write to orig-head, but interactive rebase used to write to
107 # head. Fall back to reading from head to cover for the case that the
108 # user upgraded git with an ongoing interactive rebase.
109 if test -f "$state_dir"/orig-head
111 orig_head
=$
(cat "$state_dir"/orig-head
)
113 orig_head
=$
(cat "$state_dir"/head)
115 GIT_QUIET
=$
(cat "$state_dir"/quiet
) &&
116 test -f "$state_dir"/verbose
&& verbose
=t
117 test -f "$state_dir"/strategy
&& strategy
="$(cat "$state_dir"/strategy)"
118 test -f "$state_dir"/strategy_opts
&&
119 strategy_opts
="$(cat "$state_dir"/strategy_opts)"
120 test -f "$state_dir"/allow_rerere_autoupdate
&&
121 allow_rerere_autoupdate
="$(cat "$state_dir"/allow_rerere_autoupdate)"
122 test -f "$state_dir"/gpg_sign_opt
&&
123 gpg_sign_opt
="$(cat "$state_dir"/gpg_sign_opt)"
126 write_basic_state
() {
127 echo "$head_name" > "$state_dir"/head-name
&&
128 echo "$onto" > "$state_dir"/onto
&&
129 echo "$orig_head" > "$state_dir"/orig-head
&&
130 echo "$GIT_QUIET" > "$state_dir"/quiet
&&
131 test t
= "$verbose" && : > "$state_dir"/verbose
132 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
133 test -n "$strategy_opts" && echo "$strategy_opts" > \
134 "$state_dir"/strategy_opts
135 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
136 "$state_dir"/allow_rerere_autoupdate
137 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
145 test $status != 0 && printf "%s\n" "$output"
154 move_to_original_branch
() {
157 message
="rebase finished: $head_name onto $onto"
158 git update-ref
-m "$message" \
159 $head_name $
(git rev-parse HEAD
) $orig_head &&
161 -m "rebase finished: returning to $head_name" \
163 die
"$(eval_gettext "Could not move back to \
$head_name")"
169 if test -f "$state_dir/autostash"
171 stash_sha1
=$
(cat "$state_dir/autostash")
172 if git stash apply
$stash_sha1 >/dev
/null
2>&1
174 echo "$(gettext 'Applied autostash.')" >&2
176 git stash store
-m "autostash" -q $stash_sha1 ||
177 die
"$(eval_gettext "Cannot store \
$stash_sha1")"
178 gettext 'Applying autostash resulted in conflicts.
179 Your changes are safe in the stash.
180 You can run "git stash pop" or "git stash drop" at any time.
187 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
189 { git gc
--auto || true
; } &&
193 run_specific_rebase
() {
194 if [ "$interactive_rebase" = implied
]; then
200 git_rebase__
$type${preserve_merges:+__preserve_merges}
205 elif test $ret -eq 2 # special exit status for rebase -i
208 rm -rf "$state_dir" &&
214 run_pre_rebase_hook
() {
215 if test -z "$ok_to_skip_pre_rebase" &&
216 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
218 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
219 die
"$(gettext "The pre-rebase hook refused to rebase.
")"
223 test -f "$apply_dir"/applying
&&
224 die
"$(gettext "It looks like
'git am' is
in progress. Cannot rebase.
")"
226 if test -d "$apply_dir"
229 state_dir
="$apply_dir"
230 elif test -d "$merge_dir"
232 if test -f "$merge_dir"/interactive
235 interactive_rebase
=explicit
239 state_dir
="$merge_dir"
241 test -n "$type" && in_progress
=t
248 ok_to_skip_pre_rebase
=yes
251 ok_to_skip_pre_rebase
=
253 --continue|
--skip|
--abort|
--quit|
--edit-todo|
--show-current-patch)
254 test $total_argc -eq 2 || usage
261 cmd
="${cmd}exec ${1#--exec=}${LF}"
262 test -z "$interactive_rebase" && interactive_rebase
=implied
265 interactive_rebase
=explicit
270 --allow-empty-message)
271 allow_empty_message
=--allow-empty-message
275 test -z "$interactive_rebase" && interactive_rebase
=implied
293 strategy_opts
="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
295 test -z "$strategy" && strategy
=recursive
298 strategy
="${1#--strategy=}"
320 git_am_opt
="$git_am_opt -q"
325 git_am_opt
="$git_am_opt --whitespace=${1#--whitespace=}"
326 case "${1#--whitespace=}" in
333 git_am_opt
="$git_am_opt $1"
335 --committer-date-is-author-date|
--ignore-date|
--signoff|
--no-signoff)
336 git_am_opt
="$git_am_opt $1"
340 git_am_opt
="$git_am_opt $1"
345 --force-rebase|
--no-ff)
348 --rerere-autoupdate|
--no-rerere-autoupdate)
349 allow_rerere_autoupdate
="$1"
355 gpg_sign_opt
="-S${1#--gpg-sign=}"
367 test $# -gt 2 && usage
371 test -z "$in_progress" && die
"$(gettext "No rebase
in progress?
")"
372 # Only interactive rebase uses detailed reflog messages
373 if test "$type" = interactive
&& test "$GIT_REFLOG_ACTION" = rebase
375 GIT_REFLOG_ACTION
="rebase -i ($action)"
376 export GIT_REFLOG_ACTION
380 if test "$action" = "edit-todo" && test "$type" != "interactive"
382 die
"$(gettext "The
--edit-todo action can only be used during interactive rebase.
")"
388 git rev-parse
--verify HEAD
>/dev
/null ||
389 die
"$(gettext "Cannot
read HEAD
")"
390 git update-index
--ignore-submodules --refresh &&
391 git diff-files
--quiet --ignore-submodules ||
{
392 echo "$(gettext "You must edit all merge conflicts and
then
393 mark them as resolved using git add
")"
400 output git
reset --hard HEAD ||
exit $?
409 git symbolic-ref
-m "rebase: aborting" HEAD
$head_name ||
410 die
"$(eval_gettext "Could not move back to \
$head_name")"
413 output git
reset --hard $orig_head
418 exec rm -rf "$state_dir"
425 die
"BUG: run_specific_rebase is not supposed to return here"
429 # Make sure no rebase is in progress
430 if test -n "$in_progress"
432 state_dir_base
=${state_dir##*/}
433 cmd_live_rebase
="git rebase (--continue | --abort | --skip)"
434 cmd_clear_stale_rebase
="rm -fr \"$state_dir\""
436 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
437 I wonder if you are in the middle of another rebase. If that is the
440 If that is not the case, please
441 $cmd_clear_stale_rebase
442 and run me again. I am stopping in case you still have something
446 if test -n "$rebase_root" && test -z "$onto"
448 test -z "$interactive_rebase" && interactive_rebase
=implied
451 if test -n "$interactive_rebase"
454 state_dir
="$merge_dir"
455 elif test -n "$do_merge"
458 state_dir
="$merge_dir"
461 state_dir
="$apply_dir"
464 if test -t 2 && test -z "$GIT_QUIET"
466 git_format_patch_opt
="$git_format_patch_opt --progress"
469 if test -z "$rebase_root"
473 if ! upstream_name
=$
(git rev-parse
--symbolic-full-name \
474 --verify -q @
{upstream
} 2>/dev
/null
)
477 error_on_missing_default_upstream
"rebase" "rebase" \
478 "against" "git rebase $(gettext '<branch>')"
481 test "$fork_point" = auto
&& fork_point
=t
483 *) upstream_name
="$1"
484 if test "$upstream_name" = "-"
486 upstream_name
="@{-1}"
491 upstream
=$
(peel_committish
"${upstream_name}") ||
492 die
"$(eval_gettext "invalid upstream
'\$upstream_name'")"
493 upstream_arg
="$upstream_name"
497 empty_tree
=$
(git hash-object
-t tree
/dev
/null
)
498 onto
=$
(git commit-tree
$empty_tree </dev
/null
)
503 test $# -gt 1 && usage
507 # Make sure the branch to rebase onto is valid.
508 onto_name
=${onto-"$upstream_name"}
511 if left
=${onto_name%...*} right
=${onto_name#*...} &&
512 onto
=$
(git merge-base
--all ${left:-HEAD} ${right:-HEAD})
516 die
"$(eval_gettext "\
$onto_name: there are
more than one merge bases
")"
519 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
523 die
"$(eval_gettext "\
$onto_name: there is no merge base
")"
527 onto
=$
(peel_committish
"$onto_name") ||
528 die
"$(eval_gettext "Does not point to a valid commit
: \
$onto_name")"
532 # If the branch to rebase is given, that is the branch we will rebase
533 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
534 # $orig_head -- commit object name of tip of the branch before rebasing
535 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
539 # Is it "rebase other $branchname" or "rebase other $commit"?
543 # Is it a local branch?
544 if git show-ref
--verify --quiet -- "refs/heads/$branch_name" &&
545 orig_head
=$
(git rev-parse
-q --verify "refs/heads/$branch_name")
547 head_name
="refs/heads/$branch_name"
548 # If not is it a valid ref (branch or commit)?
549 elif orig_head
=$
(git rev-parse
-q --verify "$branch_name")
551 head_name
="detached HEAD"
554 die
"$(eval_gettext "fatal
: no such branch
/commit
'\$branch_name'")"
558 # Do not need to switch branches, we are already on it.
559 if branch_name
=$
(git symbolic-ref
-q HEAD
)
561 head_name
=$branch_name
562 branch_name
=$
(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
564 head_name
="detached HEAD"
567 orig_head
=$
(git rev-parse
--verify HEAD
) ||
exit
570 die
"BUG: unexpected number of arguments left to parse"
574 if test "$fork_point" = t
576 new_upstream
=$
(git merge-base
--fork-point "$upstream_name" \
577 "${switch_to:-HEAD}")
578 if test -n "$new_upstream"
580 restrict_revision
=$new_upstream
584 if test "$autostash" = true
&& ! (require_clean_work_tree
) 2>/dev
/null
586 stash_sha1
=$
(git stash create
"autostash") ||
587 die
"$(gettext 'Cannot autostash')"
589 mkdir
-p "$state_dir" &&
590 echo $stash_sha1 >"$state_dir/autostash" &&
591 stash_abbrev
=$
(git rev-parse
--short $stash_sha1) &&
592 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
596 require_clean_work_tree
"rebase" "$(gettext "Please commit or stash them.
")"
598 # Now we are rebasing commits $upstream..$orig_head (or with --root,
599 # everything leading up to $orig_head) on top of $onto
601 # Check if we are already based on $onto with linear history,
602 # but this should be done only when upstream and onto are the same
603 # and if this is not an interactive rebase.
604 mb
=$
(git merge-base
"$onto" "$orig_head")
605 if test "$type" != interactive
&& test "$upstream" = "$onto" &&
606 test "$mb" = "$onto" && test -z "$restrict_revision" &&
608 ! (git rev-list
--parents "$onto"..
"$orig_head" | sane_grep
" .* ") > /dev
/null
610 if test -z "$force_rebase"
612 # Lazily switch to the target branch if needed...
613 test -z "$switch_to" ||
614 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $switch_to" \
615 git checkout
-q "$switch_to" --
616 if test "$branch_name" = "HEAD" &&
617 ! git symbolic-ref
-q HEAD
619 say
"$(eval_gettext "HEAD is up to
date.
")"
621 say
"$(eval_gettext "Current branch \
$branch_name is up to
date.
")"
626 if test "$branch_name" = "HEAD" &&
627 ! git symbolic-ref
-q HEAD
629 say
"$(eval_gettext "HEAD is up to
date, rebase forced.
")"
631 say
"$(eval_gettext "Current branch \
$branch_name is up to
date, rebase forced.
")"
636 # If a hook exists, give it a chance to interrupt
637 run_pre_rebase_hook
"$upstream_arg" "$@"
639 if test -n "$diffstat"
641 if test -n "$verbose"
643 echo "$(eval_gettext "Changes from \
$mb to \
$onto:")"
645 # We want color (if set), but no pager
646 GIT_PAGER
='' git
diff --stat --summary "$mb" "$onto"
649 test "$type" = interactive
&& run_specific_rebase
651 # Detach HEAD and reset the tree
652 say
"$(gettext "First
, rewinding
head to replay your work on top of it...
")"
654 GIT_REFLOG_ACTION
="$GIT_REFLOG_ACTION: checkout $onto_name" \
655 git checkout
-q "$onto^0" || die
"could not detach HEAD"
656 git update-ref ORIG_HEAD
$orig_head
658 # If the $onto is a proper descendant of the tip of the branch, then
659 # we just fast-forwarded.
660 if test "$mb" = "$orig_head"
662 say
"$(eval_gettext "Fast-forwarded \
$branch_name to \
$onto_name.
")"
663 move_to_original_branch
668 if test -n "$rebase_root"
670 revisions
="$onto..$orig_head"
672 revisions
="${restrict_revision-$upstream}..$orig_head"