@matheusbsbs / matheus-bagliano / commits / 61dfa1bb67
Fork 0

"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 <gitster@pobox.com>

Junio C Hamano committed Nov 20, 2009 at 03:02 UTC 61dfa1bb6710690e53fa20bc3ddd1f5fbe8c1d22
1 file changed +18 -1
git-rebase.sh
+18 -1
@@ -34,6 +34,8 @@ set_reflog_action rebase
34 require_work_tree
35 cd_to_toplevel
36
37 +LF='
38 +'
39 OK_TO_SKIP_PRE_REBASE=
40 RESOLVEMSG="
41 When you have resolved this problem run \"git rebase --continue\".
@@ -417,7 +419,22 @@ fi
419
420 # Make sure the branch to rebase onto is valid.
421 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
438
439 # If a hook exists, give it a chance to interrupt
440 run_pre_rebase_hook "$upstream_arg" "$@"