git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[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
Next: Johannes Sixt
Message 1 of 9 in “Fix rebase -p --onto”
  1. Fix rebase -p --ontoGreg Price, Jul 16, 2009
  2. Johannes SixtJul 17, 2009
  3. Junio C HamanoJul 17, 2009
  4. Johannes SixtJul 17, 2009
  5. Johannes SixtJul 17, 2009
  6. Greg PriceJul 17, 2009
  7. Johannes SchindelinJul 17, 2009
  8. Greg PriceJul 17, 2009
  9. Greg PriceJul 17, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.