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