git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* bug in rebase--interactive with squash and conflicts
@ 2007-08-21 15:10 Johannes Sixt
  2007-08-23  8:55 ` [PATCH] rebase -i: fix squashing corner case Johannes Schindelin
  0 siblings, 1 reply; 3+ messages in thread
From: Johannes Sixt @ 2007-08-21 15:10 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git

Hi,

There's a problem with rebase--interactive where I want to squash two
commits and the one to squash is the first in the original series. In
particular, I change the commit list from

	pick 1
	pick 2
	pick 3
to
	pick 3
	squash 1
	pick 2

In this case, the edits of commit 3 are lost. There are conflicts when
commits 3 and 1 are cherry-picked.

You can simulate the problematic case by applying this patch:

index 40d6799..861ece1 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -252,3 +252,4 @@ 'interrupted squash works as expected' '
 		echo $n >> conflict &&
-		git add conflict &&
+		echo $n > $n
+		git add conflict $n &&
 		git commit -m $n
@@ -256,3 +257,3 @@ 'interrupted squash works as expected' '
 	one=$(git rev-parse HEAD~3) &&
-	! FAKE_LINES="1 squash 3 2" git rebase -i HEAD~3 &&
+	! FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
 	(echo one; echo two; echo four) > conflict &&


The test fails now, because git rebase --continue did not fail although
it should have. Run

   gitk HEAD to-be-rebased@{1}

Note that the rebase was completed, i.e. there are now 2 commits instead
of the original 3. But the file 'four' is missing and the final contents
of the file 'conflict' is

one
two
three

i.e. as if commit 3 had never taken place.

-- Hannes

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH] rebase -i: fix squashing corner case
  2007-08-21 15:10 bug in rebase--interactive with squash and conflicts Johannes Sixt
@ 2007-08-23  8:55 ` Johannes Schindelin
  2007-08-24  7:18   ` Johannes Sixt
  0 siblings, 1 reply; 3+ messages in thread
From: Johannes Schindelin @ 2007-08-23  8:55 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: git


When squashing, rebase -i did not prevent fast forwards.  This could
happen when picking some other commit than the first one, and then
squashing the first commit.  So do not allow fast forwards when
squashing.

Noticed by Johannes Sixt.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---

	On Tue, 21 Aug 2007, Johannes Sixt wrote:

	> There's a problem with rebase--interactive where I want to 
	> squash two commits and the one to squash is the first in the 
	> original series.

	Thanks.

 git-rebase--interactive.sh    |    5 +++--
 t/t3404-rebase-interactive.sh |   21 +++++++++++++++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index bdec462..ec798a1 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -96,13 +96,14 @@ die_abort () {
 }
 
 pick_one () {
-	case "$1" in -n) sha1=$2 ;; *) sha1=$1 ;; esac
+	no_ff=
+	case "$1" in -n) sha1=$2; no_ff=t ;; *) sha1=$1 ;; esac
 	output git rev-parse --verify $sha1 || die "Invalid commit name: $sha1"
 	test -d "$REWRITTEN" &&
 		pick_one_preserving_merges "$@" && return
 	parent_sha1=$(git rev-parse --verify $sha1^ 2>/dev/null)
 	current_sha1=$(git rev-parse --verify HEAD)
-	if test $current_sha1 = $parent_sha1; then
+	if test $no_ff$current_sha1 = $parent_sha1; then
 		output git reset --hard $sha1
 		test "a$1" = a-n && output git reset --soft $current_sha1
 		sha1=$(git rev-parse --short $sha1)
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 40d6799..718c9c1 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -264,6 +264,27 @@ test_expect_success 'interrupted squash works as expected' '
 	test $one = $(git rev-parse HEAD~2)
 '
 
+test_expect_success 'interrupted squash works as expected (case 2)' '
+	for n in one two three four
+	do
+		echo $n >> conflict &&
+		git add conflict &&
+		git commit -m $n
+	done &&
+	one=$(git rev-parse HEAD~3) &&
+	! FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
+	(echo one; echo four) > conflict &&
+	git add conflict &&
+	! git rebase --continue &&
+	(echo one; echo two; echo four) > conflict &&
+	git add conflict &&
+	! git rebase --continue &&
+	echo resolved > conflict &&
+	git add conflict &&
+	git rebase --continue &&
+	test $one = $(git rev-parse HEAD~2)
+'
+
 test_expect_success 'ignore patch if in upstream' '
 	HEAD=$(git rev-parse HEAD) &&
 	git checkout -b has-cherry-picked HEAD^ &&
-- 
1.5.3.rc6.3.gaf460

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] rebase -i: fix squashing corner case
  2007-08-23  8:55 ` [PATCH] rebase -i: fix squashing corner case Johannes Schindelin
@ 2007-08-24  7:18   ` Johannes Sixt
  0 siblings, 0 replies; 3+ messages in thread
From: Johannes Sixt @ 2007-08-24  7:18 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git, Junio C Hamano

Johannes Schindelin wrote:
> 
> When squashing, rebase -i did not prevent fast forwards.  This could
> happen when picking some other commit than the first one, and then
> squashing the first commit.  So do not allow fast forwards when
> squashing.

This indeed fixes the problem. Hence:

Acked-by: Johannes Sixt <johannes.sixt@telecom.at>

Junio, please apply.

-- Hannes

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-08-24  7:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-21 15:10 bug in rebase--interactive with squash and conflicts Johannes Sixt
2007-08-23  8:55 ` [PATCH] rebase -i: fix squashing corner case Johannes Schindelin
2007-08-24  7:18   ` Johannes Sixt

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).