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