From: Andrew Wong <andrew.kw.w@gmail.com>
To: git@vger.kernel.org
Cc: Andrew Wong <andrew.kw.w@gmail.com>
Subject: [RFC] Interactive-rebase doesn't pick all children of "upstream"
Date: Sat, 21 May 2011 01:51:18 -0400 [thread overview]
Message-ID: <1305957078-19111-2-git-send-email-andrew.kw.w@gmail.com> (raw)
In-Reply-To: <1305957078-19111-1-git-send-email-andrew.kw.w@gmail.com>
Consider this graph:
D---E (topic, HEAD)
/ /
A---B---C (master)
\
F (topic2)
and the following three commands:
1. git rebase -i A
2. git rebase -i --onto F B
3. git rebase -i B
Currently, (1) and (2) will pick B, D, C, and E onto A and F,
respectively. However, (3) will only pick D and E onto B. This
behavior of (3) is inconsistent with (1) and (2).
This also creates a bug if we do:
4. git rebase -i C
In (4), E is never picked. And since interactive-rebase resets "HEAD" to
"onto", E is lost after the interactive-rebase.
This patch fixes the inconsistency and bug by ensuring that all children
of upstream are always picked.
Two of the tests contain a scenario like (3). Since the new behavior
added more commits for picking, these tests need to be updated to edit
the "todo" list properly.
---
git-rebase--interactive.sh | 7 +++++--
t/t3404-rebase-interactive.sh | 2 +-
t/t3411-rebase-preserve-around-merges.sh | 2 +-
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 41ba96a..b6d1e5b 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -711,7 +711,7 @@ then
# parents to rewrite and skipping dropped commits would
# prematurely end our probe
merges_option=
- first_after_upstream="$(git rev-list --reverse --first-parent $upstream..$orig_head | head -n 1)"
+ commits_after_upstream="$(git rev-list --reverse --parents $upstream..$orig_head | sane_grep " $upstream" | cut -d' ' -s -f1)"
else
merges_option="--no-merges --cherry-pick"
fi
@@ -744,7 +744,10 @@ do
preserve=t
for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -s -f2-)
do
- if test -f "$rewritten"/$p -a \( $p != $onto -o $sha1 = $first_after_upstream \)
+ if test -f "$rewritten"/$p && (
+ test $p != $onto ||
+ expr "$commits_after_upstream" ":" ".*$sha1.*"
+ )
then
preserve=f
fi
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 7d8147b..c3cddcd 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -295,7 +295,7 @@ test_expect_success 'preserve merges with -p' '
'
test_expect_success 'edit ancestor with -p' '
- FAKE_LINES="1 edit 2 3 4" git rebase -i -p HEAD~3 &&
+ FAKE_LINES="1 2 edit 3 4" git rebase -i -p HEAD~3 &&
echo 2 > unrelated-file &&
test_tick &&
git commit -m L2-modified --amend unrelated-file &&
diff --git a/t/t3411-rebase-preserve-around-merges.sh b/t/t3411-rebase-preserve-around-merges.sh
index 14a23cd..ace8e54 100755
--- a/t/t3411-rebase-preserve-around-merges.sh
+++ b/t/t3411-rebase-preserve-around-merges.sh
@@ -37,7 +37,7 @@ test_expect_success 'setup' '
# -- C1 --
#
test_expect_success 'squash F1 into D1' '
- FAKE_LINES="1 squash 3 2" git rebase -i -p B1 &&
+ FAKE_LINES="1 squash 4 2 3" git rebase -i -p B1 &&
test "$(git rev-parse HEAD^2)" = "$(git rev-parse C1)" &&
test "$(git rev-parse HEAD~2)" = "$(git rev-parse B1)" &&
git tag E2
--
1.7.5.2.316.gd7d8c.dirty
next prev parent reply other threads:[~2011-05-21 6:53 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-16 10:33 [BUG] rebase -p loses commits Jeff King
2011-05-16 19:42 ` Andrew Wong
2011-05-16 20:36 ` Junio C Hamano
2011-05-17 0:33 ` Andrew Wong
2011-05-17 0:54 ` Junio C Hamano
2011-05-17 1:02 ` Junio C Hamano
2011-05-17 5:44 ` Jeff King
2011-05-17 16:07 ` Andrew Wong
2011-05-17 16:12 ` Jeff King
2011-05-21 5:51 ` [RFC] Interactive-rebase doesn't pick all children of "upstream" Andrew Wong
2011-05-21 5:51 ` Andrew Wong [this message]
2011-05-21 7:34 ` Andrew Wong
2011-06-05 5:32 ` [PATCH] " Andrew Wong
2011-06-05 9:16 ` Johannes Sixt
2011-06-05 14:11 ` Andrew Wong
2011-06-07 4:08 ` [PATCH v2] rebase -i -p: doesn't pick certain merge commits that are " Andrew Wong
2011-06-07 4:08 ` [PATCH] " Andrew Wong
2011-06-12 16:28 ` Andrew Wong
2011-06-13 16:01 ` Junio C Hamano
2011-06-13 17:30 ` Andrew Wong
2011-06-16 22:24 ` Stephen Haberman
2011-06-18 6:40 ` Andrew Wong
2011-06-18 15:17 ` Stephen Haberman
2011-06-18 16:47 ` Andrew Wong
2011-06-18 17:12 ` Stephen Haberman
2011-06-18 22:12 ` [PATCH] rebase -i -p: include non-first-parent commits in todo list Andrew Wong
2011-06-18 22:13 ` [PATCH] rebase -i -p: doesn't pick certain merge commits that are children of "upstream" Andrew Wong
2011-05-17 5:39 ` [BUG] rebase -p loses commits Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1305957078-19111-2-git-send-email-andrew.kw.w@gmail.com \
--to=andrew.kw.w@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).