git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pete Harlan <pgit@pcharlan.com>
To: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	git list <git@vger.kernel.org>
Subject: [PATCH/RFC] Allow empty commits during rebase -i
Date: Sun, 17 Jan 2010 17:12:01 -0800	[thread overview]
Message-ID: <4B53B561.0@pcharlan.com> (raw)

If you squash two commits into a previous commit, where the first
squash reverts the previous commit and the second redoes the change
correctly, rebase -i would fail during the first squash because it
generates an empty commit.  This patch allows the rebase to succeed.

This also introduces the possibility that you might accidentally
create an empty commit with a squash, but I expect that will happen
less often than the scenario this is intended to address.

Signed-off-by: Pete Harlan <pgit@pcharlan.com>
---

This arose for me recently; I used "git revert" to undo a commit
several changes back, and then reworked and committed anew.  The first
commit that I was redoing had a thorough commit message, while my new
commit had a message like "do it right this time".  I squashed the
three commits into one with rebase -i, but git choked on the
intermediate empty commit.

I could have simply removed the first two commits I was squashing (the
initial version and its revert), but then would have lost the
well-written commit message that went with the first version.

I imagine an ideal version of this fix would make it so the use case I
presented here would work, but rebase -i would still prevent
introducing a new empty commit, or at least warn when it was
introducing one.  In the absence of that ideal fix, I think this
behavior is better than failing to handle this case.

 git-rebase--interactive.sh    |    2 +-
 t/t3404-rebase-interactive.sh |    9 +++++++++
 2 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 1560e84..81db5cf 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -403,7 +403,7 @@ do_next () {
 			GIT_AUTHOR_NAME="$GIT_AUTHOR_NAME" \
 			GIT_AUTHOR_EMAIL="$GIT_AUTHOR_EMAIL" \
 			GIT_AUTHOR_DATE="$GIT_AUTHOR_DATE" \
-			$USE_OUTPUT git commit --no-verify \
+			$USE_OUTPUT git commit --no-verify --allow-empty \
 				$MSG_OPT "$EDIT_OR_FILE" || failed=t
 		fi
 		if test $failed = t
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 3a37793..5eb9f7e 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -484,4 +484,13 @@ test_expect_success 'reword' '
 	git show HEAD~2 | grep "C changed"
 '

+test_expect_success 'squash including empty' '
+	test_commit Initial_emptysquash emptysquash abc &&
+	test_commit first_mod emptysquash abd &&
+	test_tick &&
+	git revert --no-edit HEAD &&
+	test_commit second_mod emptysquash abe &&
+	FAKE_LINES="1 squash 2 squash 3" git rebase -i Initial_emptysquash
+'
+
 test_done
-- 
1.6.6.196.g1f735

             reply	other threads:[~2010-01-18  1:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-18  1:12 Pete Harlan [this message]
2010-01-18  1:29 ` [PATCH/RFC] Allow empty commits during rebase -i Junio C Hamano
2010-01-18  2:11   ` Pete Harlan
2010-01-18  3:11     ` Junio C Hamano
2010-01-18 10:01     ` 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=4B53B561.0@pcharlan.com \
    --to=pgit@pcharlan.com \
    --cc=Johannes.Schindelin@gmx.de \
    --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).