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