rebase -i: clarify what happens on a failed `exec`
[git.git] / git-rebase.sh
blob48bc84456a4c02188d35456214aa7bba97024788
1 #!/bin/sh
3 # Copyright (c) 2005 Junio C Hamano.
6 SUBDIRECTORY_OK=Yes
7 OPTIONS_KEEPDASHDASH=
8 OPTIONS_STUCKLONG=t
9 OPTIONS_SPEC="\
10 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
11 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
12 git rebase --continue | --abort | --skip | --edit-todo
14 Available options are
15 v,verbose! display a diffstat of what changed upstream
16 q,quiet! be quiet. implies --no-stat
17 autostash automatically stash/stash pop before and after
18 fork-point use 'merge-base --fork-point' to refine upstream
19 onto=! rebase onto given branch instead of upstream
20 r,rebase-merges? try to rebase merges instead of skipping them
21 p,preserve-merges! try to recreate merges instead of ignoring them
22 s,strategy=! use the given merge strategy
23 no-ff! cherry-pick all commits, even if unchanged
24 m,merge! use merging strategies to rebase
25 i,interactive! let the user edit the list of commits to rebase
26 x,exec=! add exec lines after each commit of the editable list
27 k,keep-empty preserve empty commits during rebase
28 allow-empty-message allow rebasing commits with empty messages
29 f,force-rebase! force rebase even if branch is up to date
30 X,strategy-option=! pass the argument through to the merge strategy
31 stat! display a diffstat of what changed upstream
32 n,no-stat! do not show diffstat of what changed upstream
33 verify allow pre-rebase hook to run
34 rerere-autoupdate allow rerere to update index with resolved conflicts
35 root! rebase all reachable commits up to the root(s)
36 autosquash move commits that begin with squash!/fixup! under -i
37 committer-date-is-author-date! passed to 'git am'
38 ignore-date! passed to 'git am'
39 signoff passed to 'git am'
40 whitespace=! passed to 'git apply'
41 ignore-whitespace! passed to 'git apply'
42 C=! passed to 'git apply'
43 S,gpg-sign? GPG-sign commits
44 Actions:
45 continue! continue
46 abort! abort and check out the original branch
47 skip! skip current patch and continue
48 edit-todo! edit the todo list during an interactive rebase
49 quit! abort but keep HEAD where it is
50 show-current-patch! show the patch file being applied or merged
52 . git-sh-setup
53 set_reflog_action rebase
54 require_work_tree_exists
55 cd_to_toplevel
57 LF='
59 ok_to_skip_pre_rebase=
60 resolvemsg="
61 $(gettext 'Resolve all conflicts manually, mark them as resolved with
62 "git add/rm <conflicted_files>", then run "git rebase --continue".
63 You can instead skip this commit: run "git rebase --skip".
64 To abort and get back to the state before "git rebase", run "git rebase --abort".')
66 squash_onto=
67 unset onto
68 unset restrict_revision
69 cmd=
70 strategy=
71 strategy_opts=
72 do_merge=
73 merge_dir="$GIT_DIR"/rebase-merge
74 apply_dir="$GIT_DIR"/rebase-apply
75 verbose=
76 diffstat=
77 test "$(git config --bool rebase.stat)" = true && diffstat=t
78 autostash="$(git config --bool rebase.autostash || echo false)"
79 fork_point=auto
80 git_am_opt=
81 git_format_patch_opt=
82 rebase_root=
83 force_rebase=
84 allow_rerere_autoupdate=
85 # Non-empty if a rebase was in progress when 'git rebase' was invoked
86 in_progress=
87 # One of {am, merge, interactive}
88 type=
89 # One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
90 state_dir=
91 # One of {'', continue, skip, abort}, as parsed from command line
92 action=
93 rebase_merges=
94 rebase_cousins=
95 preserve_merges=
96 autosquash=
97 keep_empty=
98 allow_empty_message=
99 signoff=
100 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
101 case "$(git config --bool commit.gpgsign)" in
102 true) gpg_sign_opt=-S ;;
103 *) gpg_sign_opt= ;;
104 esac
106 read_basic_state () {
107 test -f "$state_dir/head-name" &&
108 test -f "$state_dir/onto" &&
109 head_name=$(cat "$state_dir"/head-name) &&
110 onto=$(cat "$state_dir"/onto) &&
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
115 then
116 orig_head=$(cat "$state_dir"/orig-head)
117 else
118 orig_head=$(cat "$state_dir"/head)
119 fi &&
120 GIT_QUIET=$(cat "$state_dir"/quiet) &&
121 test -f "$state_dir"/verbose && verbose=t
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)"
125 test -f "$state_dir"/allow_rerere_autoupdate &&
126 allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
127 test -f "$state_dir"/gpg_sign_opt &&
128 gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
129 test -f "$state_dir"/signoff && {
130 signoff="$(cat "$state_dir"/signoff)"
131 force_rebase=t
135 write_basic_state () {
136 echo "$head_name" > "$state_dir"/head-name &&
137 echo "$onto" > "$state_dir"/onto &&
138 echo "$orig_head" > "$state_dir"/orig-head &&
139 echo "$GIT_QUIET" > "$state_dir"/quiet &&
140 test t = "$verbose" && : > "$state_dir"/verbose
141 test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
142 test -n "$strategy_opts" && echo "$strategy_opts" > \
143 "$state_dir"/strategy_opts
144 test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
145 "$state_dir"/allow_rerere_autoupdate
146 test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
147 test -n "$signoff" && echo "$signoff" >"$state_dir"/signoff
150 output () {
151 case "$verbose" in
153 output=$("$@" 2>&1 )
154 status=$?
155 test $status != 0 && printf "%s\n" "$output"
156 return $status
159 "$@"
161 esac
164 move_to_original_branch () {
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 &&
170 git symbolic-ref \
171 -m "rebase finished: returning to $head_name" \
172 HEAD $head_name ||
173 die "$(eval_gettext "Could not move back to \$head_name")"
175 esac
178 apply_autostash () {
179 if test -f "$state_dir/autostash"
180 then
181 stash_sha1=$(cat "$state_dir/autostash")
182 if git stash apply $stash_sha1 >/dev/null 2>&1
183 then
184 echo "$(gettext 'Applied autostash.')" >&2
185 else
186 git stash store -m "autostash" -q $stash_sha1 ||
187 die "$(eval_gettext "Cannot store \$stash_sha1")"
188 gettext 'Applying autostash resulted in conflicts.
189 Your changes are safe in the stash.
190 You can run "git stash pop" or "git stash drop" at any time.
191 ' >&2
196 finish_rebase () {
197 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
198 apply_autostash &&
199 { git gc --auto || true; } &&
200 rm -rf "$state_dir"
203 run_interactive () {
204 GIT_CHERRY_PICK_HELP="$resolvemsg"
205 export GIT_CHERRY_PICK_HELP
207 test -n "$keep_empty" && keep_empty="--keep-empty"
208 test -n "$rebase_merges" && rebase_merges="--rebase-merges"
209 test -n "$rebase_cousins" && rebase_cousins="--rebase-cousins"
210 test -n "$autosquash" && autosquash="--autosquash"
211 test -n "$verbose" && verbose="--verbose"
212 test -n "$force_rebase" && force_rebase="--no-ff"
213 test -n "$restrict_revision" && \
214 restrict_revision="--restrict-revision=^$restrict_revision"
215 test -n "$upstream" && upstream="--upstream=$upstream"
216 test -n "$onto" && onto="--onto=$onto"
217 test -n "$squash_onto" && squash_onto="--squash-onto=$squash_onto"
218 test -n "$onto_name" && onto_name="--onto-name=$onto_name"
219 test -n "$head_name" && head_name="--head-name=$head_name"
220 test -n "$strategy" && strategy="--strategy=$strategy"
221 test -n "$strategy_opts" && strategy_opts="--strategy-opts=$strategy_opts"
222 test -n "$switch_to" && switch_to="--switch-to=$switch_to"
223 test -n "$cmd" && cmd="--cmd=$cmd"
224 test -n "$action" && action="--$action"
226 exec git rebase--interactive "$action" "$keep_empty" "$rebase_merges" "$rebase_cousins" \
227 "$upstream" "$onto" "$squash_onto" "$restrict_revision" \
228 "$allow_empty_message" "$autosquash" "$verbose" \
229 "$force_rebase" "$onto_name" "$head_name" "$strategy" \
230 "$strategy_opts" "$cmd" "$switch_to" \
231 "$allow_rerere_autoupdate" "$gpg_sign_opt" "$signoff"
234 run_specific_rebase () {
235 if [ "$interactive_rebase" = implied ]; then
236 GIT_EDITOR=:
237 export GIT_EDITOR
238 autosquash=
241 if test -n "$interactive_rebase" -a -z "$preserve_merges"
242 then
243 run_interactive
244 else
245 . git-rebase--$type
247 if test -z "$preserve_merges"
248 then
249 git_rebase__$type
250 else
251 git_rebase__preserve_merges
255 ret=$?
256 if test $ret -eq 0
257 then
258 finish_rebase
259 elif test $ret -eq 2 # special exit status for rebase -p
260 then
261 apply_autostash &&
262 rm -rf "$state_dir" &&
263 die "Nothing to do"
265 exit $ret
268 run_pre_rebase_hook () {
269 if test -z "$ok_to_skip_pre_rebase" &&
270 test -x "$(git rev-parse --git-path hooks/pre-rebase)"
271 then
272 "$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
273 die "$(gettext "The pre-rebase hook refused to rebase.")"
277 test -f "$apply_dir"/applying &&
278 die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"
280 if test -d "$apply_dir"
281 then
282 type=am
283 state_dir="$apply_dir"
284 elif test -d "$merge_dir"
285 then
286 if test -d "$merge_dir"/rewritten
287 then
288 type=preserve-merges
289 interactive_rebase=explicit
290 preserve_merges=t
291 elif test -f "$merge_dir"/interactive
292 then
293 type=interactive
294 interactive_rebase=explicit
295 else
296 type=merge
298 state_dir="$merge_dir"
300 test -n "$type" && in_progress=t
302 total_argc=$#
303 while test $# != 0
305 case "$1" in
306 --no-verify)
307 ok_to_skip_pre_rebase=yes
309 --verify)
310 ok_to_skip_pre_rebase=
312 --continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
313 test $total_argc -eq 2 || usage
314 action=${1##--}
316 --onto=*)
317 onto="${1#--onto=}"
319 --exec=*)
320 cmd="${cmd}exec ${1#--exec=}${LF}"
321 test -z "$interactive_rebase" && interactive_rebase=implied
323 --interactive)
324 interactive_rebase=explicit
326 --keep-empty)
327 keep_empty=yes
329 --allow-empty-message)
330 allow_empty_message=--allow-empty-message
332 --no-keep-empty)
333 keep_empty=
335 --rebase-merges)
336 rebase_merges=t
337 test -z "$interactive_rebase" && interactive_rebase=implied
339 --rebase-merges=*)
340 rebase_merges=t
341 case "${1#*=}" in
342 rebase-cousins) rebase_cousins=t;;
343 no-rebase-cousins) rebase_cousins=;;
344 *) die "Unknown mode: $1";;
345 esac
346 test -z "$interactive_rebase" && interactive_rebase=implied
348 --preserve-merges)
349 preserve_merges=t
350 test -z "$interactive_rebase" && interactive_rebase=implied
352 --autosquash)
353 autosquash=t
355 --no-autosquash)
356 autosquash=
358 --fork-point)
359 fork_point=t
361 --no-fork-point)
362 fork_point=
364 --merge)
365 do_merge=t
367 --strategy-option=*)
368 strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}" | sed -e s/^.//)"
369 do_merge=t
370 test -z "$strategy" && strategy=recursive
372 --strategy=*)
373 strategy="${1#--strategy=}"
374 do_merge=t
376 --no-stat)
377 diffstat=
379 --stat)
380 diffstat=t
382 --autostash)
383 autostash=true
385 --no-autostash)
386 autostash=false
388 --verbose)
389 verbose=t
390 diffstat=t
391 GIT_QUIET=
393 --quiet)
394 GIT_QUIET=t
395 git_am_opt="$git_am_opt -q"
396 verbose=
397 diffstat=
399 --whitespace=*)
400 git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
401 case "${1#--whitespace=}" in
402 fix|strip)
403 force_rebase=t
405 esac
407 --ignore-whitespace)
408 git_am_opt="$git_am_opt $1"
410 --signoff)
411 signoff=--signoff
413 --no-signoff)
414 signoff=
416 --committer-date-is-author-date|--ignore-date)
417 git_am_opt="$git_am_opt $1"
418 force_rebase=t
420 -C*)
421 git_am_opt="$git_am_opt $1"
423 --root)
424 rebase_root=t
426 --force-rebase|--no-ff)
427 force_rebase=t
429 --rerere-autoupdate|--no-rerere-autoupdate)
430 allow_rerere_autoupdate="$1"
432 --gpg-sign)
433 gpg_sign_opt=-S
435 --gpg-sign=*)
436 gpg_sign_opt="-S${1#--gpg-sign=}"
439 shift
440 break
443 usage
445 esac
446 shift
447 done
448 test $# -gt 2 && usage
450 if test -n "$action"
451 then
452 test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
453 # Only interactive rebase uses detailed reflog messages
454 if test -n "$interactive_rebase" && test "$GIT_REFLOG_ACTION" = rebase
455 then
456 GIT_REFLOG_ACTION="rebase -i ($action)"
457 export GIT_REFLOG_ACTION
461 if test "$action" = "edit-todo" && test -z "$interactive_rebase"
462 then
463 die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
466 case "$action" in
467 continue)
468 # Sanity check
469 git rev-parse --verify HEAD >/dev/null ||
470 die "$(gettext "Cannot read HEAD")"
471 git update-index --ignore-submodules --refresh &&
472 git diff-files --quiet --ignore-submodules || {
473 echo "$(gettext "You must edit all merge conflicts and then
474 mark them as resolved using git add")"
475 exit 1
477 read_basic_state
478 run_specific_rebase
480 skip)
481 output git reset --hard HEAD || exit $?
482 read_basic_state
483 run_specific_rebase
485 abort)
486 git rerere clear
487 read_basic_state
488 case "$head_name" in
489 refs/*)
490 git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
491 die "$(eval_gettext "Could not move back to \$head_name")"
493 esac
494 output git reset --hard $orig_head
495 finish_rebase
496 exit
498 quit)
499 exec rm -rf "$state_dir"
501 edit-todo)
502 run_specific_rebase
504 show-current-patch)
505 run_specific_rebase
506 die "BUG: run_specific_rebase is not supposed to return here"
508 esac
510 # Make sure no rebase is in progress
511 if test -n "$in_progress"
512 then
513 state_dir_base=${state_dir##*/}
514 cmd_live_rebase="git rebase (--continue | --abort | --skip)"
515 cmd_clear_stale_rebase="rm -fr \"$state_dir\""
516 die "
517 $(eval_gettext 'It seems that there is already a $state_dir_base directory, and
518 I wonder if you are in the middle of another rebase. If that is the
519 case, please try
520 $cmd_live_rebase
521 If that is not the case, please
522 $cmd_clear_stale_rebase
523 and run me again. I am stopping in case you still have something
524 valuable there.')"
527 if test -n "$rebase_root" && test -z "$onto"
528 then
529 test -z "$interactive_rebase" && interactive_rebase=implied
532 if test -n "$keep_empty"
533 then
534 test -z "$interactive_rebase" && interactive_rebase=implied
537 if test -n "$interactive_rebase"
538 then
539 if test -z "$preserve_merges"
540 then
541 type=interactive
542 else
543 type=preserve-merges
546 state_dir="$merge_dir"
547 elif test -n "$do_merge"
548 then
549 type=merge
550 state_dir="$merge_dir"
551 else
552 type=am
553 state_dir="$apply_dir"
556 if test -t 2 && test -z "$GIT_QUIET"
557 then
558 git_format_patch_opt="$git_format_patch_opt --progress"
561 if test -n "$signoff"
562 then
563 test -n "$preserve_merges" &&
564 die "$(gettext "error: cannot combine '--signoff' with '--preserve-merges'")"
565 git_am_opt="$git_am_opt $signoff"
566 force_rebase=t
569 if test -z "$rebase_root"
570 then
571 case "$#" in
573 if ! upstream_name=$(git rev-parse --symbolic-full-name \
574 --verify -q @{upstream} 2>/dev/null)
575 then
576 . git-parse-remote
577 error_on_missing_default_upstream "rebase" "rebase" \
578 "against" "git rebase $(gettext '<branch>')"
581 test "$fork_point" = auto && fork_point=t
583 *) upstream_name="$1"
584 if test "$upstream_name" = "-"
585 then
586 upstream_name="@{-1}"
588 shift
590 esac
591 upstream=$(peel_committish "${upstream_name}") ||
592 die "$(eval_gettext "invalid upstream '\$upstream_name'")"
593 upstream_arg="$upstream_name"
594 else
595 if test -z "$onto"
596 then
597 empty_tree=$(git hash-object -t tree /dev/null)
598 onto=$(git commit-tree $empty_tree </dev/null)
599 squash_onto="$onto"
601 unset upstream_name
602 unset upstream
603 test $# -gt 1 && usage
604 upstream_arg=--root
607 # Make sure the branch to rebase onto is valid.
608 onto_name=${onto-"$upstream_name"}
609 case "$onto_name" in
610 *...*)
611 if left=${onto_name%...*} right=${onto_name#*...} &&
612 onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
613 then
614 case "$onto" in
615 ?*"$LF"?*)
616 die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
619 die "$(eval_gettext "\$onto_name: there is no merge base")"
621 esac
622 else
623 die "$(eval_gettext "\$onto_name: there is no merge base")"
627 onto=$(peel_committish "$onto_name") ||
628 die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
630 esac
632 # If the branch to rebase is given, that is the branch we will rebase
633 # $branch_name -- branch/commit being rebased, or HEAD (already detached)
634 # $orig_head -- commit object name of tip of the branch before rebasing
635 # $head_name -- refs/heads/<that-branch> or "detached HEAD"
636 switch_to=
637 case "$#" in
639 # Is it "rebase other $branchname" or "rebase other $commit"?
640 branch_name="$1"
641 switch_to="$1"
643 # Is it a local branch?
644 if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
645 orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
646 then
647 head_name="refs/heads/$branch_name"
648 # If not is it a valid ref (branch or commit)?
649 elif orig_head=$(git rev-parse -q --verify "$branch_name")
650 then
651 head_name="detached HEAD"
653 else
654 die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
658 # Do not need to switch branches, we are already on it.
659 if branch_name=$(git symbolic-ref -q HEAD)
660 then
661 head_name=$branch_name
662 branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
663 else
664 head_name="detached HEAD"
665 branch_name=HEAD
667 orig_head=$(git rev-parse --verify HEAD) || exit
670 die "BUG: unexpected number of arguments left to parse"
672 esac
674 if test "$fork_point" = t
675 then
676 new_upstream=$(git merge-base --fork-point "$upstream_name" \
677 "${switch_to:-HEAD}")
678 if test -n "$new_upstream"
679 then
680 restrict_revision=$new_upstream
684 if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
685 then
686 stash_sha1=$(git stash create "autostash") ||
687 die "$(gettext 'Cannot autostash')"
689 mkdir -p "$state_dir" &&
690 echo $stash_sha1 >"$state_dir/autostash" &&
691 stash_abbrev=$(git rev-parse --short $stash_sha1) &&
692 echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
693 git reset --hard
696 require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
698 # Now we are rebasing commits $upstream..$orig_head (or with --root,
699 # everything leading up to $orig_head) on top of $onto
701 # Check if we are already based on $onto with linear history,
702 # but this should be done only when upstream and onto are the same
703 # and if this is not an interactive rebase.
704 mb=$(git merge-base "$onto" "$orig_head")
705 if test -z "$interactive_rebase" && test "$upstream" = "$onto" &&
706 test "$mb" = "$onto" && test -z "$restrict_revision" &&
707 # linear history?
708 ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
709 then
710 if test -z "$force_rebase"
711 then
712 # Lazily switch to the target branch if needed...
713 test -z "$switch_to" ||
714 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
715 git checkout -q "$switch_to" --
716 if test "$branch_name" = "HEAD" &&
717 ! git symbolic-ref -q HEAD
718 then
719 say "$(eval_gettext "HEAD is up to date.")"
720 else
721 say "$(eval_gettext "Current branch \$branch_name is up to date.")"
723 finish_rebase
724 exit 0
725 else
726 if test "$branch_name" = "HEAD" &&
727 ! git symbolic-ref -q HEAD
728 then
729 say "$(eval_gettext "HEAD is up to date, rebase forced.")"
730 else
731 say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
736 # If a hook exists, give it a chance to interrupt
737 run_pre_rebase_hook "$upstream_arg" "$@"
739 if test -n "$diffstat"
740 then
741 if test -n "$verbose"
742 then
743 echo "$(eval_gettext "Changes from \$mb to \$onto:")"
745 # We want color (if set), but no pager
746 GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
749 test -n "$interactive_rebase" && run_specific_rebase
751 # Detach HEAD and reset the tree
752 say "$(gettext "First, rewinding head to replay your work on top of it...")"
754 GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
755 git checkout -q "$onto^0" || die "could not detach HEAD"
756 git update-ref ORIG_HEAD $orig_head
758 # If the $onto is a proper descendant of the tip of the branch, then
759 # we just fast-forwarded.
760 if test "$mb" = "$orig_head"
761 then
762 say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
763 move_to_original_branch
764 finish_rebase
765 exit 0
768 if test -n "$rebase_root"
769 then
770 revisions="$onto..$orig_head"
771 else
772 revisions="${restrict_revision-$upstream}..$orig_head"
775 run_specific_rebase