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