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