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