From: "Jörg Sommer" <joerg@alea.gnuu.de>
To: git@vger.kernel.org
Cc: gitster@pobox.com, "Jörg Sommer" <joerg@alea.gnuu.de>
Subject: [PATCH v2 4/5] Handle fast forward correctly in rebase with preserve merges
Date: Sat, 22 Mar 2008 15:08:26 +0100 [thread overview]
Message-ID: <1206194907-3340-4-git-send-email-joerg@alea.gnuu.de> (raw)
In-Reply-To: <1206194907-3340-3-git-send-email-joerg@alea.gnuu.de>
Rebase-interactive with preserve merges does fast forward commits while
the parent of the old commit is not the parent of the new commit. If the
parent of the changed commit is not touched, e.g. has no entry in the
REWRITTEN database, a fast forward happens. With these commits
“A---B---C” and rebase “A---C---B” would do a fast forward for C which
leads to an incorrect result.
The fast forward is also not realised, i.e. the HEAD is not updated.
After all is done, it was assumed that the new head is the rewritten old
head. But if the old head was applied before current head—as in the
example above—the commits after the rewritten old head are lost.
Signed-off-by: Jörg Sommer <joerg@alea.gnuu.de>
---
git-rebase--interactive.sh | 35 ++++++++++++++++++-----------------
1 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index e1ce44e..8626ef6 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -144,6 +144,7 @@ pick_one_preserving_merges () {
die "Cannot write current commit's replacement sha1"
fi
+ current_sha1=$(git rev-parse --verify HEAD)
# rewrite parents; if none were rewritten, we can fast-forward.
fast_forward=t
preserve=t
@@ -166,18 +167,31 @@ pick_one_preserving_merges () {
new_parents="$new_parents $p"
fi
done
+
+ # Don't do a fast forward, if current commit is not the parent of
+ # the new commit
+ case "$new_parents" in
+ ""|" $current_sha1"*)
+ ;;
+ *)
+ fast_forward=f
+ ;;
+ esac
+
case $fast_forward in
t)
output warn "Fast forward to $sha1"
test $preserve = f || echo $sha1 > "$REWRITTEN"/$sha1
+ output git reset --hard $sha1
+ if test "a$1" = a-n
+ then
+ output git reset --soft $current_sha1
+ fi
;;
f)
test "a$1" = a-n && die "Refusing to squash a merge: $sha1"
first_parent=$(expr "$new_parents" : ' \([^ ]*\)')
- # detach HEAD to current parent
- output git checkout $first_parent 2> /dev/null ||
- die "Cannot move HEAD to $first_parent"
echo $sha1 > "$DOTEST"/current-commit
case "$new_parents" in
@@ -330,20 +344,7 @@ do_next () {
HEADNAME=$(cat "$DOTEST"/head-name) &&
OLDHEAD=$(cat "$DOTEST"/head) &&
SHORTONTO=$(git rev-parse --short $(cat "$DOTEST"/onto)) &&
- if test -d "$REWRITTEN"
- then
- test -f "$DOTEST"/current-commit &&
- current_commit=$(cat "$DOTEST"/current-commit) &&
- git rev-parse HEAD > "$REWRITTEN"/$current_commit
- if test -f "$REWRITTEN"/$OLDHEAD
- then
- NEWHEAD=$(cat "$REWRITTEN"/$OLDHEAD)
- else
- NEWHEAD=$OLDHEAD
- fi
- else
- NEWHEAD=$(git rev-parse HEAD)
- fi &&
+ NEWHEAD=$(git rev-parse HEAD) &&
case $HEADNAME in
refs/*)
message="$GIT_REFLOG_ACTION: $HEADNAME onto $SHORTONTO)" &&
--
1.5.4.4
next prev parent reply other threads:[~2008-03-22 14:11 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-22 1:19 [PATCH] rebase with preserve merges should not show merged commits Jörg Sommer
2008-03-22 1:19 ` [PATCH] Check for non‐foreign commits in rebase-interactive test Jörg Sommer
2008-03-22 1:19 ` [PATCH] Handle fast forward correctly in rebase with preserve merges Jörg Sommer
2008-03-22 1:19 ` [PATCH] New tests to check " Jörg Sommer
2008-03-22 1:33 ` [PATCH] rebase with preserve merges should not show merged commits Johannes Schindelin
2008-03-22 9:43 ` Jörg Sommer
2008-03-22 11:22 ` Johannes Schindelin
2008-03-22 1:52 ` Björn Steinbrink
2008-03-22 9:40 ` Jörg Sommer
2008-03-22 12:37 ` Björn Steinbrink
2008-03-22 14:06 ` Jörg Sommer
2008-03-22 15:12 ` Björn Steinbrink
2008-03-22 15:37 ` Jörg Sommer
2008-03-22 14:08 ` [PATCH v2 1/5] " Jörg Sommer
2008-03-22 14:08 ` [PATCH v2 2/5] New test: no merges without preserve merges Jörg Sommer
2008-03-22 14:08 ` [PATCH v2 3/5] Check for non‐foreign commits in rebase-interactive test Jörg Sommer
2008-03-22 14:08 ` Jörg Sommer [this message]
2008-03-22 14:08 ` [PATCH v2 5/5] New tests to check rebase with preserve merges Jörg Sommer
2008-03-22 14:46 ` [PATCH v2 1/5] rebase with preserve merges should not show merged commits Johannes Schindelin
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=1206194907-3340-4-git-send-email-joerg@alea.gnuu.de \
--to=joerg@alea.gnuu.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/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).