[PATCH] Fix rebase -p --onto
- From
Greg Price <price@ksplice.com>
- Date
- Jul 16, 2009, 23:00 UTC
- Message-ID
- <20090716230031.GM7503@vinegar-pot.mit.edu>
In a rebase with --onto, the correct test for whether we can skip rewriting a commit is if it is already on top of $ONTO, not $UPSTREAM. Without --onto, this distinction does not exist and the behavior does not change.
In the situation
X---o---o---o---M \ / x---x---x---x
Y
if we try to move the branches merged at M from their base on X to be based on Y, so as to get
X
Y---o'--o'--o'--M' \ / x'--x'--x'--x'
then we fail. The command `git rebase -p --onto Y X M` moves only the first-parent chain, like so:
X
\
x---x---x---x
\
Y---o'--o'--o'--M'because it mistakenly drops the other branch(es) x---x---x---x from the TODO file. This tests and fixes this behavior.
Signed-off-by: Greg Price <price@ksplice.com> Cc: Stephen Haberman <stephen@exigencecorp.com> ---
git-rebase--interactive.sh | 2 +- t/t3414-rebase-preserve-onto.sh | 48 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletions(-) create mode 100644 t/t3414-rebase-preserve-onto.sh
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index f96d887..23ded48 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -703,7 +703,7 @@ first and then run 'git rebase --continue' again." preserve=t for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-) do - if test -f "$REWRITTEN"/$p -a \( $p != $UPSTREAM -o $sha1 = $first_after_upstream \) + if test -f "$REWRITTEN"/$p -a \( $p != $ONTO -o $sha1 = $first_after_upstream \) then preserve=f fi diff --git a/t/t3414-rebase-preserve-onto.sh b/t/t3414-rebase-preserve-onto.sh new file mode 100644 index 0000000..ee29517 --- /dev/null +++ b/t/t3414-rebase-preserve-onto.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Copyright (c) 2009 Greg Price +# + +test_description='git rebase -p should respect --onto + +In a rebase with --onto, we should rewrite all the commits that +aren'"'"'t on top of $ONTO, even if they are on top of $UPSTREAM. +' +. ./test-lib.sh + +. ../lib-rebase.sh + +# Set up branches like this: +# A1---B1---D1---E1 +# \ \ / +# \ \--C1--/ +# F1 + +test_expect_success 'setup' ' + test_commit A1 && + test_commit B1 && + test_commit C1 && + git reset --hard B1 && + test_commit D1 && + test_merge E1 C1 && + git reset --hard A1 && + test_commit F1 +' + +# Now rebase E1 from B1 onto F1, expect to get this: +# A1---B1---D1---E1 +# \ \ / +# \ \--C1--/ +# \ +# F1---D2---E2 +# \ / +# \--C2--/ + +test_expect_success 'rebase from B1 onto F1' ' + git checkout E1 && + git rebase -p --onto F1 B1 && + test "$(git rev-parse HEAD^1^1)" = "$(git rev-parse F1)" && + test "$(git rev-parse HEAD^2^1)" = "$(git rev-parse F1)" +' + +test_done
-- 1.6.4.rc0.19.gbedf