Skip to content

Commit

Permalink
rebase -i: teach --onto A...B syntax
Browse files Browse the repository at this point in the history
When rewriting commits on a topic branch, sometimes it is easier to
compare the version of commits before and after the rewrite if they are
based on the same commit that forked from the upstream. An earlier commit
by Junio (fixed up by the previous commit) gives "--onto A...B" syntax to
rebase command, and rebases on top of the merge base between A and B;
teach the same to the interactive version, too.

Signed-off-by: しらいし ななこ <nanako3@lavabit.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nanako Shiraishi authored and Junio C Hamano committed Jan 7, 2010
1 parent 9f21e97 commit 230a456
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
21 changes: 20 additions & 1 deletion git-rebase--interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,25 @@ get_saved_options () {
test -f "$DOTEST"/rebase-root && REBASE_ROOT=t
}

LF='
'
parse_onto () {
case "$1" in
*...*)
if left=${1%...*} right=${1#*...} &&
onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
then
case "$onto" in
?*"$LF"?* | '')
exit 1 ;;
esac
echo "$onto"
exit 0
fi
esac
git rev-parse --verify "$1^0"
}

while test $# != 0
do
case "$1" in
Expand Down Expand Up @@ -589,7 +608,7 @@ first and then run 'git rebase --continue' again."
;;
--onto)
shift
ONTO=$(git rev-parse --verify "$1") ||
ONTO=$(parse_onto "$1") ||
die "Does not point to a valid commit: $1"
;;
--)
Expand Down
30 changes: 30 additions & 0 deletions t/t3415-rebase-onto-threedots.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,34 @@ test_expect_success 'rebase --onto master...side' '
test_must_fail git rebase --onto master...side J
'

test_expect_success 'rebase -i --onto master...topic' '
git reset --hard &&
git checkout topic &&
git reset --hard G &&
set_fake_editor &&
EXPECT_COUNT=1 git rebase -i --onto master...topic F &&
git rev-parse HEAD^1 >actual &&
git rev-parse C^0 >expect &&
test_cmp expect actual
'

test_expect_success 'rebase -i --onto master...' '
git reset --hard &&
git checkout topic &&
git reset --hard G &&
set_fake_editor &&
EXPECT_COUNT=1 git rebase -i --onto master... F &&
git rev-parse HEAD^1 >actual &&
git rev-parse C^0 >expect &&
test_cmp expect actual
'

test_expect_success 'rebase -i --onto master...side' '
git reset --hard &&
git checkout side &&
git reset --hard K &&
test_must_fail git rebase -i --onto master...side J
'

test_done

0 comments on commit 230a456

Please sign in to comment.