]> git.ipfire.org Git - thirdparty/git.git/blame - git-rebase.sh
t4205, t6006: add tests that fail with i18n.logOutputEncoding set
[thirdparty/git.git] / git-rebase.sh
CommitLineData
59e6b23a
JH
1#!/bin/sh
2#
3# Copyright (c) 2005 Junio C Hamano.
4#
5
533b7039 6SUBDIRECTORY_OK=Yes
45e2acf3 7OPTIONS_KEEPDASHDASH=
b6e9e73e 8OPTIONS_STUCKLONG=t
45e2acf3 9OPTIONS_SPEC="\
c2145384 10git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
0cd993a7 11git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
eb9a7cb4 12git-rebase --continue | --abort | --skip | --edit-todo
45e2acf3
MZ
13--
14 Available options are
15v,verbose! display a diffstat of what changed upstream
16q,quiet! be quiet. implies --no-stat
58794775 17autostash! automatically stash/stash pop before and after
ad8261d2 18fork-point use 'merge-base --fork-point' to refine upstream
45e2acf3
MZ
19onto=! rebase onto given branch instead of upstream
20p,preserve-merges! try to recreate merges instead of ignoring them
21s,strategy=! use the given merge strategy
22no-ff! cherry-pick all commits, even if unchanged
23m,merge! use merging strategies to rebase
24i,interactive! let the user edit the list of commits to rebase
c2145384 25x,exec=! add exec lines after each commit of the editable list
90e1818f 26k,keep-empty preserve empty commits during rebase
45e2acf3
MZ
27f,force-rebase! force rebase even if branch is up to date
28X,strategy-option=! pass the argument through to the merge strategy
29stat! display a diffstat of what changed upstream
30n,no-stat! do not show diffstat of what changed upstream
31verify allow pre-rebase hook to run
32rerere-autoupdate allow rerere to update index with resolved conflicts
33root! rebase all reachable commits up to the root(s)
34autosquash move commits that begin with squash!/fixup! under -i
35committer-date-is-author-date! passed to 'git am'
36ignore-date! passed to 'git am'
37whitespace=! passed to 'git apply'
38ignore-whitespace! passed to 'git apply'
39C=! passed to 'git apply'
3ee5e540 40S,gpg-sign? GPG-sign commits
45e2acf3 41 Actions:
5960bc9d
MZ
42continue! continue
43abort! abort and check out the original branch
44skip! skip current patch and continue
eb9a7cb4 45edit-todo! edit the todo list during an interactive rebase
45e2acf3 46"
ae2b0f15 47. git-sh-setup
c7108bf9 48. git-sh-i18n
f9474132 49set_reflog_action rebase
035b5bf6 50require_work_tree_exists
533b7039 51cd_to_toplevel
4282c4fb 52
61dfa1bb
JH
53LF='
54'
6bb4e485
MZ
55ok_to_skip_pre_rebase=
56resolvemsg="
c7108bf9
JX
57$(gettext 'When you have resolved this problem, run "git rebase --continue".
58If you prefer to skip this patch, run "git rebase --skip" instead.
59To check out the original branch and stop rebasing, run "git rebase --abort".')
cc120056 60"
6bb4e485 61unset onto
c2145384 62cmd=
9765b6ab 63strategy=
93ce190c 64strategy_opts=
58634dbf 65do_merge=
69a636ad
MZ
66merge_dir="$GIT_DIR"/rebase-merge
67apply_dir="$GIT_DIR"/rebase-apply
b758789c 68verbose=
9474a029
MZ
69diffstat=
70test "$(git config --bool rebase.stat)" = true && diffstat=t
58794775 71autostash="$(git config --bool rebase.autostash || echo false)"
ad8261d2 72fork_point=auto
67dad687 73git_am_opt=
190f5323 74rebase_root=
b2f82e05 75force_rebase=
cb6020bb 76allow_rerere_autoupdate=
99de0640
MZ
77# Non-empty if a rebase was in progress when 'git rebase' was invoked
78in_progress=
79# One of {am, merge, interactive}
80type=
81# One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
82state_dir=
34262322
MZ
83# One of {'', continue, skip, abort}, as parsed from command line
84action=
cf432ca0
MZ
85preserve_merges=
86autosquash=
90e1818f 87keep_empty=
cf432ca0 88test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
3ee5e540 89gpg_sign_opt=
58634dbf 90
fa99c1e1 91read_basic_state () {
dc8ca912
RR
92 test -f "$state_dir/head-name" &&
93 test -f "$state_dir/onto" &&
02ac45fa
MZ
94 head_name=$(cat "$state_dir"/head-name) &&
95 onto=$(cat "$state_dir"/onto) &&
84df4560
MZ
96 # We always write to orig-head, but interactive rebase used to write to
97 # head. Fall back to reading from head to cover for the case that the
98 # user upgraded git with an ongoing interactive rebase.
99 if test -f "$state_dir"/orig-head
2959c283 100 then
2959c283 101 orig_head=$(cat "$state_dir"/orig-head)
84df4560
MZ
102 else
103 orig_head=$(cat "$state_dir"/head)
2959c283 104 fi &&
7b37a7c6
MZ
105 GIT_QUIET=$(cat "$state_dir"/quiet) &&
106 test -f "$state_dir"/verbose && verbose=t
80ff4795
MZ
107 test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
108 test -f "$state_dir"/strategy_opts &&
109 strategy_opts="$(cat "$state_dir"/strategy_opts)"
b3e4847e
MZ
110 test -f "$state_dir"/allow_rerere_autoupdate &&
111 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
3ee5e540
NV
112 test -f "$state_dir"/gpg_sign_opt &&
113 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
02ac45fa
MZ
114}
115
84df4560
MZ
116write_basic_state () {
117 echo "$head_name" > "$state_dir"/head-name &&
118 echo "$onto" > "$state_dir"/onto &&
119 echo "$orig_head" > "$state_dir"/orig-head &&
7b37a7c6
MZ
120 echo "$GIT_QUIET" > "$state_dir"/quiet &&
121 test t = "$verbose" && : > "$state_dir"/verbose
80ff4795
MZ
122 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
123 test -n "$strategy_opts" && echo "$strategy_opts" > \
124 "$state_dir"/strategy_opts
b3e4847e
MZ
125 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
126 "$state_dir"/allow_rerere_autoupdate
3ee5e540 127 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
84df4560
MZ
128}
129
4974c2ca
MZ
130output () {
131 case "$verbose" in
132 '')
133 output=$("$@" 2>&1 )
134 status=$?
135 test $status != 0 && printf "%s\n" "$output"
136 return $status
137 ;;
138 *)
139 "$@"
140 ;;
141 esac
142}
143
6fd2f5e6 144move_to_original_branch () {
6fd2f5e6
JS
145 case "$head_name" in
146 refs/*)
147 message="rebase finished: $head_name onto $onto"
148 git update-ref -m "$message" \
149 $head_name $(git rev-parse HEAD) $orig_head &&
53f2ffa8
JK
150 git symbolic-ref \
151 -m "rebase finished: returning to $head_name" \
152 HEAD $head_name ||
c7108bf9 153 die "$(gettext "Could not move back to $head_name")"
6fd2f5e6
JS
154 ;;
155 esac
156}
157
58794775
RR
158finish_rebase () {
159 if test -f "$state_dir/autostash"
160 then
161 stash_sha1=$(cat "$state_dir/autostash")
162 if git stash apply $stash_sha1 2>&1 >/dev/null
163 then
164 echo "$(gettext 'Applied autostash.')"
165 else
20351bb0
RR
166 git stash store -m "autostash" -q $stash_sha1 ||
167 die "$(eval_gettext "Cannot store \$stash_sha1")"
58794775
RR
168 gettext 'Applying autostash resulted in conflicts.
169Your changes are safe in the stash.
ac1998de 170You can run "git stash pop" or "git stash drop" at any time.
58794775
RR
171'
172 fi
173 fi
174 git gc --auto &&
175 rm -rf "$state_dir"
176}
177
8cd65967 178run_specific_rebase () {
f8cca019
AE
179 if [ "$interactive_rebase" = implied ]; then
180 GIT_EDITOR=:
181 export GIT_EDITOR
8a6dae10 182 autosquash=
f8cca019 183 fi
46df82d5 184 . git-rebase--$type
f5f758a5
RR
185 ret=$?
186 if test $ret -eq 0
187 then
58794775 188 finish_rebase
f5f758a5
RR
189 fi
190 exit $ret
1b1dce4b
JS
191}
192
d70b4a8f 193run_pre_rebase_hook () {
6bb4e485 194 if test -z "$ok_to_skip_pre_rebase" &&
c4427656 195 test -x "$GIT_DIR/hooks/pre-rebase"
d70b4a8f 196 then
bc2bbc45 197 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
c7108bf9 198 die "$(gettext "The pre-rebase hook refused to rebase.")"
d70b4a8f
NS
199 fi
200}
201
69a636ad 202test -f "$apply_dir"/applying &&
c7108bf9 203 die "$(gettext "It looks like git-am is in progress. Cannot rebase.")"
9b752a6e 204
99de0640
MZ
205if test -d "$apply_dir"
206then
207 type=am
208 state_dir="$apply_dir"
209elif test -d "$merge_dir"
210then
211 if test -f "$merge_dir"/interactive
212 then
213 type=interactive
214 interactive_rebase=explicit
215 else
216 type=merge
217 fi
218 state_dir="$merge_dir"
219fi
220test -n "$type" && in_progress=t
221
95135b06 222total_argc=$#
822f7c73 223while test $# != 0
e646c9c8
JH
224do
225 case "$1" in
c4427656 226 --no-verify)
6bb4e485 227 ok_to_skip_pre_rebase=yes
c4427656 228 ;;
7baf9c4b 229 --verify)
6bb4e485 230 ok_to_skip_pre_rebase=
7baf9c4b 231 ;;
eb9a7cb4 232 --continue|--skip|--abort|--edit-todo)
45e2acf3 233 test $total_argc -eq 2 || usage
34262322 234 action=${1##--}
031321c6 235 ;;
b6e9e73e
NV
236 --onto=*)
237 onto="${1#--onto=}"
e646c9c8 238 ;;
b6e9e73e
NV
239 --exec=*)
240 cmd="${cmd}exec ${1#--exec=}${LF}"
c2145384 241 ;;
b6e9e73e 242 --interactive)
cf432ca0
MZ
243 interactive_rebase=explicit
244 ;;
b6e9e73e 245 --keep-empty)
90e1818f
NH
246 keep_empty=yes
247 ;;
b6e9e73e 248 --preserve-merges)
cf432ca0
MZ
249 preserve_merges=t
250 test -z "$interactive_rebase" && interactive_rebase=implied
251 ;;
252 --autosquash)
253 autosquash=t
254 ;;
255 --no-autosquash)
256 autosquash=
257 ;;
ad8261d2
JK
258 --fork-point)
259 fork_point=t
260 ;;
261 --no-fork-point)
262 fork_point=
263 ;;
b6e9e73e 264 --merge)
58634dbf
EW
265 do_merge=t
266 ;;
b6e9e73e
NV
267 --strategy-option=*)
268 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
93ce190c 269 do_merge=t
9765b6ab 270 test -z "$strategy" && strategy=recursive
93ce190c 271 ;;
b6e9e73e
NV
272 --strategy=*)
273 strategy="${1#--strategy=}"
58634dbf
EW
274 do_merge=t
275 ;;
b6e9e73e 276 --no-stat)
a9c3821c
TAV
277 diffstat=
278 ;;
279 --stat)
280 diffstat=t
281 ;;
58794775
RR
282 --autostash)
283 autostash=true
284 ;;
b6e9e73e 285 --verbose)
b758789c 286 verbose=t
a9c3821c 287 diffstat=t
0e987a12
SB
288 GIT_QUIET=
289 ;;
b6e9e73e 290 --quiet)
0e987a12
SB
291 GIT_QUIET=t
292 git_am_opt="$git_am_opt -q"
293 verbose=
294 diffstat=
b758789c 295 ;;
b6e9e73e
NV
296 --whitespace=*)
297 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
298 case "${1#--whitespace=}" in
45e2acf3 299 fix|strip)
b2f82e05
SR
300 force_rebase=t
301 ;;
302 esac
059f446d 303 ;;
86c91f91
GB
304 --ignore-whitespace)
305 git_am_opt="$git_am_opt $1"
306 ;;
570ccad3
MB
307 --committer-date-is-author-date|--ignore-date)
308 git_am_opt="$git_am_opt $1"
309 force_rebase=t
310 ;;
b6e9e73e
NV
311 -C*)
312 git_am_opt="$git_am_opt $1"
67dad687 313 ;;
190f5323
TR
314 --root)
315 rebase_root=t
316 ;;
b6e9e73e 317 --force-rebase|--no-ff)
b2f82e05
SR
318 force_rebase=t
319 ;;
cb6020bb
JH
320 --rerere-autoupdate|--no-rerere-autoupdate)
321 allow_rerere_autoupdate="$1"
322 ;;
3ee5e540
NV
323 --gpg-sign)
324 gpg_sign_opt=-S
325 ;;
326 --gpg-sign=*)
327 gpg_sign_opt="-S${1#--gpg-sign=}"
328 ;;
45e2acf3
MZ
329 --)
330 shift
e646c9c8
JH
331 break
332 ;;
333 esac
334 shift
335done
51b2ead0 336test $# -gt 2 && usage
2db8aaec 337
c2145384
LK
338if test -n "$cmd" &&
339 test "$interactive_rebase" != explicit
340then
465d6a00 341 die "$(gettext "The --exec option must be used with the --interactive option")"
c2145384
LK
342fi
343
cf432ca0
MZ
344if test -n "$action"
345then
c7108bf9 346 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
2959c283
MZ
347 # Only interactive rebase uses detailed reflog messages
348 if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
349 then
350 GIT_REFLOG_ACTION="rebase -i ($action)"
351 export GIT_REFLOG_ACTION
352 fi
cf432ca0 353fi
34262322 354
eb9a7cb4
AW
355if test "$action" = "edit-todo" && test "$type" != "interactive"
356then
357 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
358fi
359
34262322
MZ
360case "$action" in
361continue)
2959c283
MZ
362 # Sanity check
363 git rev-parse --verify HEAD >/dev/null ||
c7108bf9 364 die "$(gettext "Cannot read HEAD")"
34262322
MZ
365 git update-index --ignore-submodules --refresh &&
366 git diff-files --quiet --ignore-submodules || {
c7108bf9
JX
367 echo "$(gettext "You must edit all merge conflicts and then
368mark them as resolved using git add")"
34262322
MZ
369 exit 1
370 }
fa99c1e1
MZ
371 read_basic_state
372 run_specific_rebase
34262322
MZ
373 ;;
374skip)
4974c2ca 375 output git reset --hard HEAD || exit $?
fa99c1e1
MZ
376 read_basic_state
377 run_specific_rebase
34262322
MZ
378 ;;
379abort)
380 git rerere clear
fa99c1e1 381 read_basic_state
34262322
MZ
382 case "$head_name" in
383 refs/*)
ea69619c 384 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
c7108bf9 385 die "$(eval_gettext "Could not move back to \$head_name")"
34262322
MZ
386 ;;
387 esac
4974c2ca 388 output git reset --hard $orig_head
58794775 389 finish_rebase
34262322
MZ
390 exit
391 ;;
eb9a7cb4
AW
392edit-todo)
393 run_specific_rebase
394 ;;
34262322
MZ
395esac
396
99de0640
MZ
397# Make sure no rebase is in progress
398if test -n "$in_progress"
7f4bd5d8 399then
c7108bf9
JX
400 state_dir_base=${state_dir##*/}
401 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
402 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
403 die "
404$(eval_gettext 'It seems that there is already a $state_dir_base directory, and
e39beac6 405I wonder if you are in the middle of another rebase. If that is the
99de0640 406case, please try
c7108bf9 407 $cmd_live_rebase
99de0640 408If that is not the case, please
c7108bf9 409 $cmd_clear_stale_rebase
9b752a6e 410and run me again. I am stopping in case you still have something
c7108bf9 411valuable there.')"
7f4bd5d8
JH
412fi
413
df5df20c
CW
414if test -n "$rebase_root" && test -z "$onto"
415then
416 test -z "$interactive_rebase" && interactive_rebase=implied
417fi
418
cf432ca0
MZ
419if test -n "$interactive_rebase"
420then
421 type=interactive
422 state_dir="$merge_dir"
423elif test -n "$do_merge"
424then
425 type=merge
426 state_dir="$merge_dir"
427else
428 type=am
429 state_dir="$apply_dir"
430fi
431
190f5323
TR
432if test -z "$rebase_root"
433then
15a147e6
MZ
434 case "$#" in
435 0)
436 if ! upstream_name=$(git rev-parse --symbolic-full-name \
437 --verify -q @{upstream} 2>/dev/null)
438 then
439 . git-parse-remote
440 error_on_missing_default_upstream "rebase" "rebase" \
3c02396a 441 "against" "git rebase <branch>"
15a147e6 442 fi
ad8261d2
JK
443
444 test "$fork_point" = auto && fork_point=t
15a147e6
MZ
445 ;;
446 *) upstream_name="$1"
4f407407
BG
447 if test "$upstream_name" = "-"
448 then
449 upstream_name="@{-1}"
450 fi
15a147e6
MZ
451 shift
452 ;;
453 esac
2e6e276d 454 upstream=$(peel_committish "${upstream_name}") ||
c7108bf9 455 die "$(eval_gettext "invalid upstream \$upstream_name")"
190f5323
TR
456 upstream_arg="$upstream_name"
457else
df5df20c
CW
458 if test -z "$onto"
459 then
460 empty_tree=`git hash-object -t tree /dev/null`
461 onto=`git commit-tree $empty_tree </dev/null`
462 squash_onto="$onto"
463 fi
190f5323
TR
464 unset upstream_name
465 unset upstream
f2b6a199 466 test $# -gt 1 && usage
46df82d5 467 upstream_arg=--root
190f5323 468fi
32d99544 469
a1bf91e0 470# Make sure the branch to rebase onto is valid.
6bb4e485 471onto_name=${onto-"$upstream_name"}
9f21e97d
NS
472case "$onto_name" in
473*...*)
474 if left=${onto_name%...*} right=${onto_name#*...} &&
475 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
476 then
477 case "$onto" in
478 ?*"$LF"?*)
c7108bf9 479 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
9f21e97d
NS
480 ;;
481 '')
c7108bf9 482 die "$(eval_gettext "\$onto_name: there is no merge base")"
9f21e97d
NS
483 ;;
484 esac
485 else
c7108bf9 486 die "$(eval_gettext "\$onto_name: there is no merge base")"
9f21e97d
NS
487 fi
488 ;;
489*)
2e6e276d 490 onto=$(peel_committish "$onto_name") ||
c7108bf9 491 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
9f21e97d
NS
492 ;;
493esac
a1bf91e0 494
0cb06644
JH
495# If the branch to rebase is given, that is the branch we will rebase
496# $branch_name -- branch being rebased, or HEAD (already detached)
497# $orig_head -- commit object name of tip of the branch before rebasing
498# $head_name -- refs/heads/<that-branch> or "detached HEAD"
499switch_to=
59e6b23a 500case "$#" in
190f5323 5011)
0cb06644 502 # Is it "rebase other $branchname" or "rebase other $commit"?
190f5323
TR
503 branch_name="$1"
504 switch_to="$1"
0cb06644 505
190f5323 506 if git show-ref --verify --quiet -- "refs/heads/$1" &&
cb82a05d 507 orig_head=$(git rev-parse -q --verify "refs/heads/$1")
0cb06644 508 then
190f5323 509 head_name="refs/heads/$1"
cb82a05d 510 elif orig_head=$(git rev-parse -q --verify "$1")
0cb06644
JH
511 then
512 head_name="detached HEAD"
513 else
c7108bf9 514 die "$(eval_gettext "fatal: no such branch: \$branch_name")"
0cb06644 515 fi
e646c9c8 516 ;;
f2b6a199 5170)
0cb06644 518 # Do not need to switch branches, we are already on it.
bcf31618
JH
519 if branch_name=`git symbolic-ref -q HEAD`
520 then
0cb06644 521 head_name=$branch_name
bcf31618
JH
522 branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
523 else
0cb06644 524 head_name="detached HEAD"
bcf31618
JH
525 branch_name=HEAD ;# detached
526 fi
ea709800 527 orig_head=$(git rev-parse --verify HEAD) || exit
e646c9c8 528 ;;
f2b6a199
MZ
529*)
530 die "BUG: unexpected number of arguments left to parse"
531 ;;
59e6b23a
JH
532esac
533
ad8261d2
JK
534if test "$fork_point" = t
535then
bb3f4583
JK
536 new_upstream=$(git merge-base --fork-point "$upstream_name" \
537 "${switch_to:-HEAD}")
ad8261d2
JK
538 if test -n "$new_upstream"
539 then
540 upstream=$new_upstream
541 fi
542fi
543
58794775
RR
544if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
545then
546 stash_sha1=$(git stash create "autostash") ||
547 die "$(gettext 'Cannot autostash')"
548
549 mkdir -p "$state_dir" &&
550 echo $stash_sha1 >"$state_dir/autostash" &&
551 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
552 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
553 git reset --hard
554fi
555
c7108bf9 556require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
8f9bfb64 557
cb82a05d
MZ
558# Now we are rebasing commits $upstream..$orig_head (or with --root,
559# everything leading up to $orig_head) on top of $onto
e646c9c8 560
1308c17b 561# Check if we are already based on $onto with linear history,
cc1453e1
MZ
562# but this should be done only when upstream and onto are the same
563# and if this is not an interactive rebase.
cb82a05d 564mb=$(git merge-base "$onto" "$orig_head")
cc1453e1
MZ
565if test "$type" != interactive && test "$upstream" = "$onto" &&
566 test "$mb" = "$onto" &&
1308c17b 567 # linear history?
cb82a05d 568 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
7f4bd5d8 569then
b2f82e05
SR
570 if test -z "$force_rebase"
571 then
572 # Lazily switch to the target branch if needed...
4b03df21
RR
573 test -z "$switch_to" ||
574 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
575 git checkout "$switch_to" --
c7108bf9 576 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
96e2b99e 577 finish_rebase
b2f82e05
SR
578 exit 0
579 else
c7108bf9 580 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
b2f82e05 581 fi
7f4bd5d8
JH
582fi
583
8f9bfb64
MZ
584# If a hook exists, give it a chance to interrupt
585run_pre_rebase_hook "$upstream_arg" "$@"
586
a9c3821c
TAV
587if test -n "$diffstat"
588then
589 if test -n "$verbose"
590 then
c7108bf9 591 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
a9c3821c
TAV
592 fi
593 # We want color (if set), but no pager
594 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
595fi
596
fa99c1e1 597test "$type" = interactive && run_specific_rebase
f4107d9c
MZ
598
599# Detach HEAD and reset the tree
c7108bf9 600say "$(gettext "First, rewinding head to replay your work on top of it...")"
4b03df21
RR
601
602GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
603 git checkout -q "$onto^0" || die "could not detach HEAD"
cb82a05d 604git update-ref ORIG_HEAD $orig_head
f4107d9c 605
e646c9c8 606# If the $onto is a proper descendant of the tip of the branch, then
a75d7b54 607# we just fast-forwarded.
cb82a05d 608if test "$mb" = "$orig_head"
32d99544 609then
c7108bf9 610 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
6fd2f5e6 611 move_to_original_branch
af2f0ebc 612 finish_rebase
32d99544
LS
613 exit 0
614fi
615
190f5323
TR
616if test -n "$rebase_root"
617then
618 revisions="$onto..$orig_head"
619else
620 revisions="$upstream..$orig_head"
621fi
622
fa99c1e1 623run_specific_rebase