Skip to content

Commit 61dfa1b

Browse files
committed
"rebase --onto A...B" replays history on the merge base between A and B
This is in spirit similar to "checkout A...B". To re-queue a new set of patches for a series that the original author prepared to apply on 'next' on the same base as before, you would do something like this: $ git checkout next^0 $ git am -s rerolled-series.mbox $ git rebase --onto next...jh/notes next The first two commands recreates commits to be rebased as the original author intended (i.e. applies directly on top of 'next'), and the rebase command replays that history on top of the same commit the series being replaced was built on (which is typically much older than the tip of 'next'). Signed-off-by: Junio C Hamano <[email protected]>
1 parent 619a644 commit 61dfa1b

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

git-rebase.sh

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ set_reflog_action rebase
3434
require_work_tree
3535
cd_to_toplevel
3636

37+
LF='
38+
'
3739
OK_TO_SKIP_PRE_REBASE=
3840
RESOLVEMSG="
3941
When you have resolved this problem run \"git rebase --continue\".
@@ -417,7 +419,22 @@ fi
417419

418420
# Make sure the branch to rebase onto is valid.
419421
onto_name=${newbase-"$upstream_name"}
420-
onto=$(git rev-parse --verify "${onto_name}^0") || exit
422+
if left=$(expr "$onto_name" : '\(.*\)\.\.\.') &&
423+
right=$(expr "$onto_name" : '\.\.\.\(.*\)$') &&
424+
: ${left:=HEAD} ${right:=HEAD} &&
425+
onto=$(git merge-base "$left" "$right")
426+
then
427+
case "$onto" in
428+
?*"$LF"?*)
429+
die "$onto_name: there are more than one merge bases"
430+
;;
431+
'')
432+
die "$onto_name: there is no merge base"
433+
;;
434+
esac
435+
else
436+
onto=$(git rev-parse --verify "${onto_name}^0") || exit
437+
fi
421438

422439
# If a hook exists, give it a chance to interrupt
423440
run_pre_rebase_hook "$upstream_arg" "$@"

0 commit comments

Comments
 (0)