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