Merge branch 'mh/attr-macro-doc'
[alt-git.git] / git-rebase.sh
blob8a3efa2983d08e38d40ae8b6dcecd82b0901ffa1
1 #!/bin/sh
3 # Copyright (c) 2005 Junio C Hamano.
6 SUBDIRECTORY_OK=Yes
7 OPTIONS_KEEPDASHDASH=
8 OPTIONS_SPEC="\
9 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
10 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
11 git-rebase --continue | --abort | --skip | --edit-todo
13 Available options are
14 v,verbose! display a diffstat of what changed upstream
15 q,quiet! be quiet. implies --no-stat
16 autostash! automatically stash/stash pop before and after
17 fork-point use 'merge-base --fork-point' to refine upstream
18 onto=! rebase onto given branch instead of upstream
19 p,preserve-merges! try to recreate merges instead of ignoring them
20 s,strategy=! use the given merge strategy
21 no-ff! cherry-pick all commits, even if unchanged
22 m,merge! use merging strategies to rebase
23 i,interactive! let the user edit the list of commits to rebase
24 x,exec=! add exec lines after each commit of the editable list
25 k,keep-empty preserve empty commits during rebase
26 f,force-rebase! force rebase even if branch is up to date
27 X,strategy-option=! pass the argument through to the merge strategy
28 stat! display a diffstat of what changed upstream
29 n,no-stat! do not show diffstat of what changed upstream
30 verify allow pre-rebase hook to run
31 rerere-autoupdate allow rerere to update index with resolved conflicts
32 root! rebase all reachable commits up to the root(s)
33 autosquash move commits that begin with squash!/fixup! under -i
34 committer-date-is-author-date! passed to 'git am'
35 ignore-date! passed to 'git am'
36 whitespace=! passed to 'git apply'
37 ignore-whitespace! passed to 'git apply'
38 C=! passed to 'git apply'
39 Actions:
40 continue! continue
41 abort! abort and check out the original branch
42 skip! skip current patch and continue
43 edit-todo! edit the todo list during an interactive rebase
45 . git-sh-setup
46 . git-sh-i18n
47 set_reflog_action rebase
48 require_work_tree_exists
49 cd_to_toplevel
51 LF='
53 ok_to_skip_pre_rebase=
54 resolvemsg="
55 $(gettext 'When you have resolved this problem, run "git rebase --continue".
56 If you prefer to skip this patch, run "git rebase --skip" instead.
57 To check out the original branch and stop rebasing, run "git rebase --abort".')
59 unset onto
60 cmd=
61 strategy=
62 strategy_opts=
63 do_merge=
64 merge_dir="$GIT_DIR"/rebase-merge
65 apply_dir="$GIT_DIR"/rebase-apply
66 verbose=
67 diffstat=
68 test "$(git config --bool rebase.stat)" = true && diffstat=t
69 autostash="$(git config --bool rebase.autostash || echo false)"
70 fork_point=auto
71 git_am_opt=
72 rebase_root=
73 force_rebase=
74 allow_rerere_autoupdate=
75 # Non-empty if a rebase was in progress when 'git rebase' was invoked
76 in_progress=
77 # One of {am, merge, interactive}
78 type=
79 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
80 state_dir=
81 # One of {'', continue, skip, abort}, as parsed from command line
82 action=
83 preserve_merges=
84 autosquash=
85 keep_empty=
86 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
88 read_basic_state () {
89 test -f "$state_dir/head-name" &&
90 test -f "$state_dir/onto" &&
91 head_name=$(cat "$state_dir"/head-name) &&
92 onto=$(cat "$state_dir"/onto) &&
93 # We always write to orig-head, but interactive rebase used to write to
94 # head. Fall back to reading from head to cover for the case that the
95 # user upgraded git with an ongoing interactive rebase.
96 if test -f "$state_dir"/orig-head
97 then
98 orig_head=$(cat "$state_dir"/orig-head)
99 else
100 orig_head=$(cat "$state_dir"/head)
101 fi &&
102 GIT_QUIET=$(cat "$state_dir"/quiet) &&
103 test -f "$state_dir"/verbose && verbose=t
104 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
105 test -f "$state_dir"/strategy_opts &&
106 strategy_opts="$(cat "$state_dir"/strategy_opts)"
107 test -f "$state_dir"/allow_rerere_autoupdate &&
108 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
111 write_basic_state () {
112 echo "$head_name" > "$state_dir"/head-name &&
113 echo "$onto" > "$state_dir"/onto &&
114 echo "$orig_head" > "$state_dir"/orig-head &&
115 echo "$GIT_QUIET" > "$state_dir"/quiet &&
116 test t = "$verbose" && : > "$state_dir"/verbose
117 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
118 test -n "$strategy_opts" && echo "$strategy_opts" > \
119 "$state_dir"/strategy_opts
120 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
121 "$state_dir"/allow_rerere_autoupdate
124 output () {
125 case "$verbose" in
127 output=$("$@" 2>&1 )
128 status=$?
129 test $status != 0 && printf "%s\n" "$output"
130 return $status
133 "$@"
135 esac
138 move_to_original_branch () {
139 case "$head_name" in
140 refs/*)
141 message="rebase finished: $head_name onto $onto"
142 git update-ref -m "$message" \
143 $head_name $(git rev-parse HEAD) $orig_head &&
144 git symbolic-ref \
145 -m "rebase finished: returning to $head_name" \
146 HEAD $head_name ||
147 die "$(gettext "Could not move back to $head_name")"
149 esac
152 finish_rebase () {
153 if test -f "$state_dir/autostash"
154 then
155 stash_sha1=$(cat "$state_dir/autostash")
156 if git stash apply $stash_sha1 2>&1 >/dev/null
157 then
158 echo "$(gettext 'Applied autostash.')"
159 else
160 git stash store -m "autostash" -q $stash_sha1 ||
161 die "$(eval_gettext "Cannot store \$stash_sha1")"
162 gettext 'Applying autostash resulted in conflicts.
163 Your changes are safe in the stash.
164 You can run "git stash pop" or "git stash drop" at any time.
168 git gc --auto &&
169 rm -rf "$state_dir"
172 run_specific_rebase_internal () {
173 if [ "$interactive_rebase" = implied ]; then
174 GIT_EDITOR=:
175 export GIT_EDITOR
176 autosquash=
178 # On FreeBSD, the shell's "return" returns from the current
179 # function, not from the current file inclusion.
180 # run_specific_rebase_internal has the file inclusion as a
181 # last statement, so POSIX and FreeBSD's return will do the
182 # same thing.
183 . git-rebase--$type
186 run_specific_rebase () {
187 run_specific_rebase_internal
188 ret=$?
189 if test $ret -eq 0
190 then
191 finish_rebase
193 exit $ret
196 run_pre_rebase_hook () {
197 if test -z "$ok_to_skip_pre_rebase" &&
198 test -x "$GIT_DIR/hooks/pre-rebase"
199 then
200 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
201 die "$(gettext "The pre-rebase hook refused to rebase.")"
205 test -f "$apply_dir"/applying &&
206 die "$(gettext "It looks like git-am is in progress. Cannot rebase.")"
208 if test -d "$apply_dir"
209 then
210 type=am
211 state_dir="$apply_dir"
212 elif test -d "$merge_dir"
213 then
214 if test -f "$merge_dir"/interactive
215 then
216 type=interactive
217 interactive_rebase=explicit
218 else
219 type=merge
221 state_dir="$merge_dir"
223 test -n "$type" && in_progress=t
225 total_argc=$#
226 while test $# != 0
228 case "$1" in
229 --no-verify)
230 ok_to_skip_pre_rebase=yes
232 --verify)
233 ok_to_skip_pre_rebase=
235 --continue|--skip|--abort|--edit-todo)
236 test $total_argc -eq 2 || usage
237 action=${1##--}
239 --onto)
240 test 2 -le "$#" || usage
241 onto="$2"
242 shift
245 test 2 -le "$#" || usage
246 cmd="${cmd}exec $2${LF}"
247 shift
250 interactive_rebase=explicit
253 keep_empty=yes
256 preserve_merges=t
257 test -z "$interactive_rebase" && interactive_rebase=implied
259 --autosquash)
260 autosquash=t
262 --no-autosquash)
263 autosquash=
265 --fork-point)
266 fork_point=t
268 --no-fork-point)
269 fork_point=
271 -M|-m)
272 do_merge=t
275 shift
276 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")"
277 do_merge=t
278 test -z "$strategy" && strategy=recursive
281 shift
282 strategy="$1"
283 do_merge=t
286 diffstat=
288 --stat)
289 diffstat=t
291 --autostash)
292 autostash=true
295 verbose=t
296 diffstat=t
297 GIT_QUIET=
300 GIT_QUIET=t
301 git_am_opt="$git_am_opt -q"
302 verbose=
303 diffstat=
305 --whitespace)
306 shift
307 git_am_opt="$git_am_opt --whitespace=$1"
308 case "$1" in
309 fix|strip)
310 force_rebase=t
312 esac
314 --ignore-whitespace)
315 git_am_opt="$git_am_opt $1"
317 --committer-date-is-author-date|--ignore-date)
318 git_am_opt="$git_am_opt $1"
319 force_rebase=t
322 shift
323 git_am_opt="$git_am_opt -C$1"
325 --root)
326 rebase_root=t
328 -f|--no-ff)
329 force_rebase=t
331 --rerere-autoupdate|--no-rerere-autoupdate)
332 allow_rerere_autoupdate="$1"
335 shift
336 break
338 esac
339 shift
340 done
341 test $# -gt 2 && usage
343 if test -n "$cmd" &&
344 test "$interactive_rebase" != explicit
345 then
346 die "$(gettext "The --exec option must be used with the --interactive option")"
349 if test -n "$action"
350 then
351 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
352 # Only interactive rebase uses detailed reflog messages
353 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
354 then
355 GIT_REFLOG_ACTION="rebase -i ($action)"
356 export GIT_REFLOG_ACTION
360 if test "$action" = "edit-todo" && test "$type" != "interactive"
361 then
362 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
365 case "$action" in
366 continue)
367 # Sanity check
368 git rev-parse --verify HEAD >/dev/null ||
369 die "$(gettext "Cannot read HEAD")"
370 git update-index --ignore-submodules --refresh &&
371 git diff-files --quiet --ignore-submodules || {
372 echo "$(gettext "You must edit all merge conflicts and then
373 mark them as resolved using git add")"
374 exit 1
376 read_basic_state
377 run_specific_rebase
379 skip)
380 output git reset --hard HEAD || exit $?
381 read_basic_state
382 run_specific_rebase
384 abort)
385 git rerere clear
386 read_basic_state
387 case "$head_name" in
388 refs/*)
389 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
390 die "$(eval_gettext "Could not move back to \$head_name")"
392 esac
393 output git reset --hard $orig_head
394 finish_rebase
395 exit
397 edit-todo)
398 run_specific_rebase
400 esac
402 # Make sure no rebase is in progress
403 if test -n "$in_progress"
404 then
405 state_dir_base=${state_dir##*/}
406 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
407 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
408 die "
409 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
410 I wonder if you are in the middle of another rebase. If that is the
411 case, please try
412 $cmd_live_rebase
413 If that is not the case, please
414 $cmd_clear_stale_rebase
415 and run me again. I am stopping in case you still have something
416 valuable there.')"
419 if test -n "$rebase_root" && test -z "$onto"
420 then
421 test -z "$interactive_rebase" && interactive_rebase=implied
424 if test -n "$interactive_rebase"
425 then
426 type=interactive
427 state_dir="$merge_dir"
428 elif test -n "$do_merge"
429 then
430 type=merge
431 state_dir="$merge_dir"
432 else
433 type=am
434 state_dir="$apply_dir"
437 if test -z "$rebase_root"
438 then
439 case "$#" in
441 if ! upstream_name=$(git rev-parse --symbolic-full-name \
442 --verify -q @{upstream} 2>/dev/null)
443 then
444 . git-parse-remote
445 error_on_missing_default_upstream "rebase" "rebase" \
446 "against" "git rebase <branch>"
449 test "$fork_point" = auto && fork_point=t
451 *) upstream_name="$1"
452 shift
454 esac
455 upstream=$(peel_committish "${upstream_name}") ||
456 die "$(eval_gettext "invalid upstream \$upstream_name")"
457 upstream_arg="$upstream_name"
458 else
459 if test -z "$onto"
460 then
461 empty_tree=`git hash-object -t tree /dev/null`
462 onto=`git commit-tree $empty_tree </dev/null`
463 squash_onto="$onto"
465 unset upstream_name
466 unset upstream
467 test $# -gt 1 && usage
468 upstream_arg=--root
471 # Make sure the branch to rebase onto is valid.
472 onto_name=${onto-"$upstream_name"}
473 case "$onto_name" in
474 *...*)
475 if left=${onto_name%...*} right=${onto_name#*...} &&
476 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
477 then
478 case "$onto" in
479 ?*"$LF"?*)
480 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
483 die "$(eval_gettext "\$onto_name: there is no merge base")"
485 esac
486 else
487 die "$(eval_gettext "\$onto_name: there is no merge base")"
491 onto=$(peel_committish "$onto_name") ||
492 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
494 esac
496 # If the branch to rebase is given, that is the branch we will rebase
497 # $branch_name -- branch being rebased, or HEAD (already detached)
498 # $orig_head -- commit object name of tip of the branch before rebasing
499 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
500 switch_to=
501 case "$#" in
503 # Is it "rebase other $branchname" or "rebase other $commit"?
504 branch_name="$1"
505 switch_to="$1"
507 if git show-ref --verify --quiet -- "refs/heads/$1" &&
508 orig_head=$(git rev-parse -q --verify "refs/heads/$1")
509 then
510 head_name="refs/heads/$1"
511 elif orig_head=$(git rev-parse -q --verify "$1")
512 then
513 head_name="detached HEAD"
514 else
515 die "$(eval_gettext "fatal: no such branch: \$branch_name")"
519 # Do not need to switch branches, we are already on it.
520 if branch_name=`git symbolic-ref -q HEAD`
521 then
522 head_name=$branch_name
523 branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
524 else
525 head_name="detached HEAD"
526 branch_name=HEAD ;# detached
528 orig_head=$(git rev-parse --verify HEAD) || exit
531 die "BUG: unexpected number of arguments left to parse"
533 esac
535 if test "$fork_point" = t
536 then
537 new_upstream=$(git merge-base --fork-point "$upstream_name" \
538 "${switch_to:-HEAD}")
539 if test -n "$new_upstream"
540 then
541 upstream=$new_upstream
545 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
546 then
547 stash_sha1=$(git stash create "autostash") ||
548 die "$(gettext 'Cannot autostash')"
550 mkdir -p "$state_dir" &&
551 echo $stash_sha1 >"$state_dir/autostash" &&
552 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
553 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
554 git reset --hard
557 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
559 # Now we are rebasing commits $upstream..$orig_head (or with --root,
560 # everything leading up to $orig_head) on top of $onto
562 # Check if we are already based on $onto with linear history,
563 # but this should be done only when upstream and onto are the same
564 # and if this is not an interactive rebase.
565 mb=$(git merge-base "$onto" "$orig_head")
566 if test "$type" != interactive && test "$upstream" = "$onto" &&
567 test "$mb" = "$onto" &&
568 # linear history?
569 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
570 then
571 if test -z "$force_rebase"
572 then
573 # Lazily switch to the target branch if needed...
574 test -z "$switch_to" ||
575 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
576 git checkout "$switch_to" --
577 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
578 finish_rebase
579 exit 0
580 else
581 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
585 # If a hook exists, give it a chance to interrupt
586 run_pre_rebase_hook "$upstream_arg" "$@"
588 if test -n "$diffstat"
589 then
590 if test -n "$verbose"
591 then
592 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
594 # We want color (if set), but no pager
595 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
598 test "$type" = interactive && run_specific_rebase
600 # Detach HEAD and reset the tree
601 say "$(gettext "First, rewinding head to replay your work on top of it...")"
603 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
604 git checkout -q "$onto^0" || die "could not detach HEAD"
605 git update-ref ORIG_HEAD $orig_head
607 # If the $onto is a proper descendant of the tip of the branch, then
608 # we just fast-forwarded.
609 if test "$mb" = "$orig_head"
610 then
611 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
612 move_to_original_branch
613 finish_rebase
614 exit 0
617 if test -n "$rebase_root"
618 then
619 revisions="$onto..$orig_head"
620 else
621 revisions="$upstream..$orig_head"
624 run_specific_rebase