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