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