]> git.ipfire.org Git - thirdparty/git.git/blame - git-rebase.sh
Git 1.9.0
[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
99855ddf 172run_specific_rebase_internal () {
f8cca019
AE
173 if [ "$interactive_rebase" = implied ]; then
174 GIT_EDITOR=:
175 export GIT_EDITOR
8a6dae10 176 autosquash=
f8cca019 177 fi
99855ddf
MM
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.
46df82d5 183 . git-rebase--$type
99855ddf
MM
184}
185
186run_specific_rebase () {
187 run_specific_rebase_internal
f5f758a5
RR
188 ret=$?
189 if test $ret -eq 0
190 then
58794775 191 finish_rebase
f5f758a5
RR
192 fi
193 exit $ret
1b1dce4b
JS
194}
195
d70b4a8f 196run_pre_rebase_hook () {
6bb4e485 197 if test -z "$ok_to_skip_pre_rebase" &&
c4427656 198 test -x "$GIT_DIR/hooks/pre-rebase"
d70b4a8f 199 then
bc2bbc45 200 "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} ||
c7108bf9 201 die "$(gettext "The pre-rebase hook refused to rebase.")"
d70b4a8f
NS
202 fi
203}
204
69a636ad 205test -f "$apply_dir"/applying &&
c7108bf9 206 die "$(gettext "It looks like git-am is in progress. Cannot rebase.")"
9b752a6e 207
99de0640
MZ
208if test -d "$apply_dir"
209then
210 type=am
211 state_dir="$apply_dir"
212elif test -d "$merge_dir"
213then
214 if test -f "$merge_dir"/interactive
215 then
216 type=interactive
217 interactive_rebase=explicit
218 else
219 type=merge
220 fi
221 state_dir="$merge_dir"
222fi
223test -n "$type" && in_progress=t
224
95135b06 225total_argc=$#
822f7c73 226while test $# != 0
e646c9c8
JH
227do
228 case "$1" in
c4427656 229 --no-verify)
6bb4e485 230 ok_to_skip_pre_rebase=yes
c4427656 231 ;;
7baf9c4b 232 --verify)
6bb4e485 233 ok_to_skip_pre_rebase=
7baf9c4b 234 ;;
eb9a7cb4 235 --continue|--skip|--abort|--edit-todo)
45e2acf3 236 test $total_argc -eq 2 || usage
34262322 237 action=${1##--}
031321c6 238 ;;
e646c9c8
JH
239 --onto)
240 test 2 -le "$#" || usage
6bb4e485 241 onto="$2"
e646c9c8
JH
242 shift
243 ;;
c2145384
LK
244 -x)
245 test 2 -le "$#" || usage
246 cmd="${cmd}exec $2${LF}"
247 shift
248 ;;
45e2acf3 249 -i)
cf432ca0
MZ
250 interactive_rebase=explicit
251 ;;
90e1818f
NH
252 -k)
253 keep_empty=yes
254 ;;
45e2acf3 255 -p)
cf432ca0
MZ
256 preserve_merges=t
257 test -z "$interactive_rebase" && interactive_rebase=implied
258 ;;
259 --autosquash)
260 autosquash=t
261 ;;
262 --no-autosquash)
263 autosquash=
264 ;;
ad8261d2
JK
265 --fork-point)
266 fork_point=t
267 ;;
268 --no-fork-point)
269 fork_point=
270 ;;
45e2acf3 271 -M|-m)
58634dbf
EW
272 do_merge=t
273 ;;
45e2acf3
MZ
274 -X)
275 shift
276 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")"
93ce190c 277 do_merge=t
9765b6ab 278 test -z "$strategy" && strategy=recursive
93ce190c 279 ;;
45e2acf3
MZ
280 -s)
281 shift
282 strategy="$1"
58634dbf
EW
283 do_merge=t
284 ;;
45e2acf3 285 -n)
a9c3821c
TAV
286 diffstat=
287 ;;
288 --stat)
289 diffstat=t
290 ;;
58794775
RR
291 --autostash)
292 autostash=true
293 ;;
45e2acf3 294 -v)
b758789c 295 verbose=t
a9c3821c 296 diffstat=t
0e987a12
SB
297 GIT_QUIET=
298 ;;
45e2acf3 299 -q)
0e987a12
SB
300 GIT_QUIET=t
301 git_am_opt="$git_am_opt -q"
302 verbose=
303 diffstat=
b758789c 304 ;;
45e2acf3
MZ
305 --whitespace)
306 shift
307 git_am_opt="$git_am_opt --whitespace=$1"
b2f82e05 308 case "$1" in
45e2acf3 309 fix|strip)
b2f82e05
SR
310 force_rebase=t
311 ;;
312 esac
059f446d 313 ;;
86c91f91
GB
314 --ignore-whitespace)
315 git_am_opt="$git_am_opt $1"
316 ;;
570ccad3
MB
317 --committer-date-is-author-date|--ignore-date)
318 git_am_opt="$git_am_opt $1"
319 force_rebase=t
320 ;;
45e2acf3
MZ
321 -C)
322 shift
323 git_am_opt="$git_am_opt -C$1"
67dad687 324 ;;
190f5323
TR
325 --root)
326 rebase_root=t
327 ;;
45e2acf3 328 -f|--no-ff)
b2f82e05
SR
329 force_rebase=t
330 ;;
cb6020bb
JH
331 --rerere-autoupdate|--no-rerere-autoupdate)
332 allow_rerere_autoupdate="$1"
333 ;;
45e2acf3
MZ
334 --)
335 shift
e646c9c8
JH
336 break
337 ;;
338 esac
339 shift
340done
51b2ead0 341test $# -gt 2 && usage
2db8aaec 342
c2145384
LK
343if test -n "$cmd" &&
344 test "$interactive_rebase" != explicit
345then
465d6a00 346 die "$(gettext "The --exec option must be used with the --interactive option")"
c2145384
LK
347fi
348
cf432ca0
MZ
349if test -n "$action"
350then
c7108bf9 351 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
2959c283
MZ
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
357 fi
cf432ca0 358fi
34262322 359
eb9a7cb4
AW
360if test "$action" = "edit-todo" && test "$type" != "interactive"
361then
362 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
363fi
364
34262322
MZ
365case "$action" in
366continue)
2959c283
MZ
367 # Sanity check
368 git rev-parse --verify HEAD >/dev/null ||
c7108bf9 369 die "$(gettext "Cannot read HEAD")"
34262322
MZ
370 git update-index --ignore-submodules --refresh &&
371 git diff-files --quiet --ignore-submodules || {
c7108bf9
JX
372 echo "$(gettext "You must edit all merge conflicts and then
373mark them as resolved using git add")"
34262322
MZ
374 exit 1
375 }
fa99c1e1
MZ
376 read_basic_state
377 run_specific_rebase
34262322
MZ
378 ;;
379skip)
4974c2ca 380 output git reset --hard HEAD || exit $?
fa99c1e1
MZ
381 read_basic_state
382 run_specific_rebase
34262322
MZ
383 ;;
384abort)
385 git rerere clear
fa99c1e1 386 read_basic_state
34262322
MZ
387 case "$head_name" in
388 refs/*)
ea69619c 389 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
c7108bf9 390 die "$(eval_gettext "Could not move back to \$head_name")"
34262322
MZ
391 ;;
392 esac
4974c2ca 393 output git reset --hard $orig_head
58794775 394 finish_rebase
34262322
MZ
395 exit
396 ;;
eb9a7cb4
AW
397edit-todo)
398 run_specific_rebase
399 ;;
34262322
MZ
400esac
401
99de0640
MZ
402# Make sure no rebase is in progress
403if test -n "$in_progress"
7f4bd5d8 404then
c7108bf9
JX
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
e39beac6 410I wonder if you are in the middle of another rebase. If that is the
99de0640 411case, please try
c7108bf9 412 $cmd_live_rebase
99de0640 413If that is not the case, please
c7108bf9 414 $cmd_clear_stale_rebase
9b752a6e 415and run me again. I am stopping in case you still have something
c7108bf9 416valuable there.')"
7f4bd5d8
JH
417fi
418
df5df20c
CW
419if test -n "$rebase_root" && test -z "$onto"
420then
421 test -z "$interactive_rebase" && interactive_rebase=implied
422fi
423
cf432ca0
MZ
424if test -n "$interactive_rebase"
425then
426 type=interactive
427 state_dir="$merge_dir"
428elif test -n "$do_merge"
429then
430 type=merge
431 state_dir="$merge_dir"
432else
433 type=am
434 state_dir="$apply_dir"
435fi
436
190f5323
TR
437if test -z "$rebase_root"
438then
15a147e6
MZ
439 case "$#" in
440 0)
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" \
3c02396a 446 "against" "git rebase <branch>"
15a147e6 447 fi
ad8261d2
JK
448
449 test "$fork_point" = auto && fork_point=t
15a147e6
MZ
450 ;;
451 *) upstream_name="$1"
452 shift
453 ;;
454 esac
2e6e276d 455 upstream=$(peel_committish "${upstream_name}") ||
c7108bf9 456 die "$(eval_gettext "invalid upstream \$upstream_name")"
190f5323
TR
457 upstream_arg="$upstream_name"
458else
df5df20c
CW
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"
464 fi
190f5323
TR
465 unset upstream_name
466 unset upstream
f2b6a199 467 test $# -gt 1 && usage
46df82d5 468 upstream_arg=--root
190f5323 469fi
32d99544 470
a1bf91e0 471# Make sure the branch to rebase onto is valid.
6bb4e485 472onto_name=${onto-"$upstream_name"}
9f21e97d
NS
473case "$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"?*)
c7108bf9 480 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
9f21e97d
NS
481 ;;
482 '')
c7108bf9 483 die "$(eval_gettext "\$onto_name: there is no merge base")"
9f21e97d
NS
484 ;;
485 esac
486 else
c7108bf9 487 die "$(eval_gettext "\$onto_name: there is no merge base")"
9f21e97d
NS
488 fi
489 ;;
490*)
2e6e276d 491 onto=$(peel_committish "$onto_name") ||
c7108bf9 492 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
9f21e97d
NS
493 ;;
494esac
a1bf91e0 495
0cb06644
JH
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"
500switch_to=
59e6b23a 501case "$#" in
190f5323 5021)
0cb06644 503 # Is it "rebase other $branchname" or "rebase other $commit"?
190f5323
TR
504 branch_name="$1"
505 switch_to="$1"
0cb06644 506
190f5323 507 if git show-ref --verify --quiet -- "refs/heads/$1" &&
cb82a05d 508 orig_head=$(git rev-parse -q --verify "refs/heads/$1")
0cb06644 509 then
190f5323 510 head_name="refs/heads/$1"
cb82a05d 511 elif orig_head=$(git rev-parse -q --verify "$1")
0cb06644
JH
512 then
513 head_name="detached HEAD"
514 else
c7108bf9 515 die "$(eval_gettext "fatal: no such branch: \$branch_name")"
0cb06644 516 fi
e646c9c8 517 ;;
f2b6a199 5180)
0cb06644 519 # Do not need to switch branches, we are already on it.
bcf31618
JH
520 if branch_name=`git symbolic-ref -q HEAD`
521 then
0cb06644 522 head_name=$branch_name
bcf31618
JH
523 branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
524 else
0cb06644 525 head_name="detached HEAD"
bcf31618
JH
526 branch_name=HEAD ;# detached
527 fi
ea709800 528 orig_head=$(git rev-parse --verify HEAD) || exit
e646c9c8 529 ;;
f2b6a199
MZ
530*)
531 die "BUG: unexpected number of arguments left to parse"
532 ;;
59e6b23a
JH
533esac
534
ad8261d2
JK
535if test "$fork_point" = t
536then
bb3f4583
JK
537 new_upstream=$(git merge-base --fork-point "$upstream_name" \
538 "${switch_to:-HEAD}")
ad8261d2
JK
539 if test -n "$new_upstream"
540 then
541 upstream=$new_upstream
542 fi
543fi
544
58794775
RR
545if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
546then
547 stash_sha1=$(git stash create "autostash") ||
548 die "$(gettext 'Cannot autostash')"
549
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
555fi
556
c7108bf9 557require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
8f9bfb64 558
cb82a05d
MZ
559# Now we are rebasing commits $upstream..$orig_head (or with --root,
560# everything leading up to $orig_head) on top of $onto
e646c9c8 561
1308c17b 562# Check if we are already based on $onto with linear history,
cc1453e1
MZ
563# but this should be done only when upstream and onto are the same
564# and if this is not an interactive rebase.
cb82a05d 565mb=$(git merge-base "$onto" "$orig_head")
cc1453e1
MZ
566if test "$type" != interactive && test "$upstream" = "$onto" &&
567 test "$mb" = "$onto" &&
1308c17b 568 # linear history?
cb82a05d 569 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
7f4bd5d8 570then
b2f82e05
SR
571 if test -z "$force_rebase"
572 then
573 # Lazily switch to the target branch if needed...
4b03df21
RR
574 test -z "$switch_to" ||
575 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
576 git checkout "$switch_to" --
c7108bf9 577 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
96e2b99e 578 finish_rebase
b2f82e05
SR
579 exit 0
580 else
c7108bf9 581 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
b2f82e05 582 fi
7f4bd5d8
JH
583fi
584
8f9bfb64
MZ
585# If a hook exists, give it a chance to interrupt
586run_pre_rebase_hook "$upstream_arg" "$@"
587
a9c3821c
TAV
588if test -n "$diffstat"
589then
590 if test -n "$verbose"
591 then
c7108bf9 592 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
a9c3821c
TAV
593 fi
594 # We want color (if set), but no pager
595 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
596fi
597
fa99c1e1 598test "$type" = interactive && run_specific_rebase
f4107d9c
MZ
599
600# Detach HEAD and reset the tree
c7108bf9 601say "$(gettext "First, rewinding head to replay your work on top of it...")"
4b03df21
RR
602
603GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
604 git checkout -q "$onto^0" || die "could not detach HEAD"
cb82a05d 605git update-ref ORIG_HEAD $orig_head
f4107d9c 606
e646c9c8 607# If the $onto is a proper descendant of the tip of the branch, then
a75d7b54 608# we just fast-forwarded.
cb82a05d 609if test "$mb" = "$orig_head"
32d99544 610then
c7108bf9 611 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
6fd2f5e6 612 move_to_original_branch
af2f0ebc 613 finish_rebase
32d99544
LS
614 exit 0
615fi
616
190f5323
TR
617if test -n "$rebase_root"
618then
619 revisions="$onto..$orig_head"
620else
621 revisions="$upstream..$orig_head"
622fi
623
fa99c1e1 624run_specific_rebase