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