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 f,force-rebase! force rebase even if branch is up to date
28 X,strategy-option=! pass the argument through to the merge strategy
29 stat! display a diffstat of what changed upstream
30 n,no-stat! do not show diffstat of what changed upstream
31 verify allow pre-rebase hook to run
32 rerere-autoupdate allow rerere to update index with resolved conflicts
33 root! rebase all reachable commits up to the root(s)
34 autosquash move commits that begin with squash!/fixup! under -i
35 committer-date-is-author-date! passed to 'git am'
36 ignore-date! passed to 'git am'
37 signoff passed to 'git am'
38 whitespace=! passed to 'git apply'
39 ignore-whitespace! passed to 'git apply'
40 C=! passed to 'git apply'
41 S,gpg-sign? GPG-sign commits
44 abort! abort and check out the original branch
45 skip! skip current patch and continue
46 edit-todo! edit the todo list during an interactive rebase
47 quit! abort but keep HEAD where it is
48 show-current-patch! show the patch file being applied or merged
51 set_reflog_action rebase
52 require_work_tree_exists
57 ok_to_skip_pre_rebase=
59 $(gettext 'Resolve all conflicts manually, mark them as resolved with
60 "git add/rm <conflicted_files>", then run "git rebase --continue".
61 You can instead skip this commit: run "git rebase --skip".
62 To abort and get back to the state before "git rebase", run "git rebase --abort".')
65 unset restrict_revision
70 merge_dir="$GIT_DIR"/rebase-merge
71 apply_dir="$GIT_DIR"/rebase-apply
74 test "$(git config --bool rebase.stat)" = true && diffstat=t
75 autostash="$(git config --bool rebase.autostash || echo false)"
81 allow_rerere_autoupdate=
82 # Non-empty if a rebase was in progress when 'git rebase' was invoked
84 # One of {am, merge, interactive}
86 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
88 # One of {'', continue, skip, abort}, as parsed from command line
93 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
94 case "$(git config --bool commit.gpgsign)" in
95 true) gpg_sign_opt=-S ;;
100 test -f "$state_dir/head-name" &&
101 test -f "$state_dir/onto" &&
102 head_name=$(cat "$state_dir"/head-name) &&
103 onto=$(cat "$state_dir"/onto) &&
104 # We always write to orig-head, but interactive rebase used to write to
105 # head. Fall back to reading from head to cover for the case that the
106 # user upgraded git with an ongoing interactive rebase.
107 if test -f "$state_dir"/orig-head
109 orig_head=$(cat "$state_dir"/orig-head)
111 orig_head=$(cat "$state_dir"/head)
113 GIT_QUIET=$(cat "$state_dir"/quiet) &&
114 test -f "$state_dir"/verbose && verbose=t
115 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
116 test -f "$state_dir"/strategy_opts &&
117 strategy_opts="$(cat "$state_dir"/strategy_opts)"
118 test -f "$state_dir"/allow_rerere_autoupdate &&
119 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
120 test -f "$state_dir"/gpg_sign_opt &&
121 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
124 write_basic_state () {
125 echo "$head_name" > "$state_dir"/head-name &&
126 echo "$onto" > "$state_dir"/onto &&
127 echo "$orig_head" > "$state_dir"/orig-head &&
128 echo "$GIT_QUIET" > "$state_dir"/quiet &&
129 test t = "$verbose" && : > "$state_dir"/verbose
130 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
131 test -n "$strategy_opts" && echo "$strategy_opts" > \
132 "$state_dir"/strategy_opts
133 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
134 "$state_dir"/allow_rerere_autoupdate
135 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
143 test $status != 0 && printf "%s\n" "$output"
152 move_to_original_branch () {
155 message="rebase finished: $head_name onto $onto"
156 git update-ref -m "$message" \
157 $head_name $(git rev-parse HEAD) $orig_head &&
159 -m "rebase finished: returning to $head_name" \
161 die "$(eval_gettext "Could not move back to \$head_name")"
167 if test -f "$state_dir/autostash"
169 stash_sha1=$(cat "$state_dir/autostash")
170 if git stash apply $stash_sha1 >/dev/null 2>&1
172 echo "$(gettext 'Applied autostash.')" >&2
174 git stash store -m "autostash" -q $stash_sha1 ||
175 die "$(eval_gettext "Cannot store \$stash_sha1")"
176 gettext 'Applying autostash resulted in conflicts.
177 Your changes are safe in the stash.
178 You can run "git stash pop" or "git stash drop" at any time.
185 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
187 { git gc --auto || true; } &&
191 run_specific_rebase () {
192 if [ "$interactive_rebase" = implied ]; then
202 elif test $ret -eq 2 # special exit status for rebase -i
205 rm -rf "$state_dir" &&
211 run_pre_rebase_hook () {
212 if test -z "$ok_to_skip_pre_rebase" &&
213 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
215 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
216 die "$(gettext "The pre-rebase hook refused to rebase.")"
220 test -f "$apply_dir"/applying &&
221 die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"
223 if test -d "$apply_dir"
226 state_dir="$apply_dir"
227 elif test -d "$merge_dir"
229 if test -f "$merge_dir"/interactive
232 interactive_rebase=explicit
236 state_dir="$merge_dir"
238 test -n "$type" && in_progress=t
245 ok_to_skip_pre_rebase=yes
248 ok_to_skip_pre_rebase=
250 --continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
251 test $total_argc -eq 2 || usage
258 cmd="${cmd}exec ${1#--exec=}${LF}"
259 test -z "$interactive_rebase" && interactive_rebase=implied
262 interactive_rebase=explicit
269 test -z "$interactive_rebase" && interactive_rebase=implied
287 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
289 test -z "$strategy" && strategy=recursive
292 strategy="${1#--strategy=}"
314 git_am_opt="$git_am_opt -q"
319 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
320 case "${1#--whitespace=}" in
327 git_am_opt="$git_am_opt $1"
329 --committer-date-is-author-date|--ignore-date|--signoff|--no-signoff)
330 git_am_opt="$git_am_opt $1"
334 git_am_opt="$git_am_opt $1"
339 --force-rebase|--no-ff)
342 --rerere-autoupdate|--no-rerere-autoupdate)
343 allow_rerere_autoupdate="$1"
349 gpg_sign_opt="-S${1#--gpg-sign=}"
361 test $# -gt 2 && usage
365 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
366 # Only interactive rebase uses detailed reflog messages
367 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
369 GIT_REFLOG_ACTION="rebase -i ($action)"
370 export GIT_REFLOG_ACTION
374 if test "$action" = "edit-todo" && test "$type" != "interactive"
376 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
382 git rev-parse --verify HEAD >/dev/null ||
383 die "$(gettext "Cannot read HEAD")"
384 git update-index --ignore-submodules --refresh &&
385 git diff-files --quiet --ignore-submodules || {
386 echo "$(gettext "You must edit all merge conflicts and then
387 mark them as resolved using git add")"
394 output git reset --hard HEAD || exit $?
403 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
404 die "$(eval_gettext "Could not move back to \$head_name")"
407 output git reset --hard $orig_head
412 exec rm -rf "$state_dir"
419 die "BUG: run_specific_rebase is not supposed to return here"
423 # Make sure no rebase is in progress
424 if test -n "$in_progress"
426 state_dir_base=${state_dir##*/}
427 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
428 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
430 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
431 I wonder if you are in the middle of another rebase. If that is the
434 If that is not the case, please
435 $cmd_clear_stale_rebase
436 and run me again. I am stopping in case you still have something
440 if test -n "$rebase_root" && test -z "$onto"
442 test -z "$interactive_rebase" && interactive_rebase=implied
445 if test -n "$interactive_rebase"
448 state_dir="$merge_dir"
449 elif test -n "$do_merge"
452 state_dir="$merge_dir"
455 state_dir="$apply_dir"
458 if test -t 2 && test -z "$GIT_QUIET"
460 git_format_patch_opt="$git_format_patch_opt --progress"
463 if test -z "$rebase_root"
467 if ! upstream_name=$(git rev-parse --symbolic-full-name \
468 --verify -q @{upstream} 2>/dev/null)
471 error_on_missing_default_upstream "rebase" "rebase" \
472 "against" "git rebase $(gettext '<branch>')"
475 test "$fork_point" = auto && fork_point=t
477 *) upstream_name="$1"
478 if test "$upstream_name" = "-"
480 upstream_name="@{-1}"
485 upstream=$(peel_committish "${upstream_name}") ||
486 die "$(eval_gettext "invalid upstream '\$upstream_name'")"
487 upstream_arg="$upstream_name"
491 empty_tree=$(git hash-object -t tree /dev/null)
492 onto=$(git commit-tree $empty_tree </dev/null)
497 test $# -gt 1 && usage
501 # Make sure the branch to rebase onto is valid.
502 onto_name=${onto-"$upstream_name"}
505 if left=${onto_name%...*} right=${onto_name#*...} &&
506 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
510 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
513 die "$(eval_gettext "\$onto_name: there is no merge base")"
517 die "$(eval_gettext "\$onto_name: there is no merge base")"
521 onto=$(peel_committish "$onto_name") ||
522 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
526 # If the branch to rebase is given, that is the branch we will rebase
527 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
528 # $orig_head -- commit object name of tip of the branch before rebasing
529 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
533 # Is it "rebase other $branchname" or "rebase other $commit"?
537 # Is it a local branch?
538 if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
539 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
541 head_name="refs/heads/$branch_name"
542 # If not is it a valid ref (branch or commit)?
543 elif orig_head=$(git rev-parse -q --verify "$branch_name")
545 head_name="detached HEAD"
548 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
552 # Do not need to switch branches, we are already on it.
553 if branch_name=$(git symbolic-ref -q HEAD)
555 head_name=$branch_name
556 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
558 head_name="detached HEAD"
561 orig_head=$(git rev-parse --verify HEAD) || exit
564 die "BUG: unexpected number of arguments left to parse"
568 if test "$fork_point" = t
570 new_upstream=$(git merge-base --fork-point "$upstream_name" \
571 "${switch_to:-HEAD}")
572 if test -n "$new_upstream"
574 restrict_revision=$new_upstream
578 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
580 stash_sha1=$(git stash create "autostash") ||
581 die "$(gettext 'Cannot autostash')"
583 mkdir -p "$state_dir" &&
584 echo $stash_sha1 >"$state_dir/autostash" &&
585 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
586 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
590 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
592 # Now we are rebasing commits $upstream..$orig_head (or with --root,
593 # everything leading up to $orig_head) on top of $onto
595 # Check if we are already based on $onto with linear history,
596 # but this should be done only when upstream and onto are the same
597 # and if this is not an interactive rebase.
598 mb=$(git merge-base "$onto" "$orig_head")
599 if test "$type" != interactive && test "$upstream" = "$onto" &&
600 test "$mb" = "$onto" && test -z "$restrict_revision" &&
602 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
604 if test -z "$force_rebase"
606 # Lazily switch to the target branch if needed...
607 test -z "$switch_to" ||
608 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
609 git checkout -q "$switch_to" --
610 if test "$branch_name" = "HEAD" &&
611 ! git symbolic-ref -q HEAD
613 say "$(eval_gettext "HEAD is up to date.")"
615 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
620 if test "$branch_name" = "HEAD" &&
621 ! git symbolic-ref -q HEAD
623 say "$(eval_gettext "HEAD is up to date, rebase forced.")"
625 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
630 # If a hook exists, give it a chance to interrupt
631 run_pre_rebase_hook "$upstream_arg" "$@"
633 if test -n "$diffstat"
635 if test -n "$verbose"
637 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
639 # We want color (if set), but no pager
640 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
643 test "$type" = interactive && run_specific_rebase
645 # Detach HEAD and reset the tree
646 say "$(gettext "First, rewinding head to replay your work on top of it...")"
648 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
649 git checkout -q "$onto^0" || die "could not detach HEAD"
650 git update-ref ORIG_HEAD $orig_head
652 # If the $onto is a proper descendant of the tip of the branch, then
653 # we just fast-forwarded.
654 if test "$mb" = "$orig_head"
656 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
657 move_to_original_branch
662 if test -n "$rebase_root"
664 revisions="$onto..$orig_head"
666 revisions="${restrict_revision-$upstream}..$orig_head"