git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Nieder <jrnieder@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Ramkumar Ramachandra <artagnon@gmail.com>,
	Sverre Rabbelier <srabbelier@gmail.com>,
	Thore Husfeldt <thore.husfeldt@gmail.com>,
	git@vger.kernel.org, Scott Chacon <schacon@gmail.com>,
	Thomas Rast <trast@student.ethz.ch>
Subject: [PATCH 3/4] reset: accept "git reset -- <path>" from unborn branch
Date: Tue, 19 Oct 2010 17:13:31 -0500	[thread overview]
Message-ID: <20101019221331.GF32029@burratino> (raw)
In-Reply-To: <20101019221005.GC32029@burratino>

A common workflow:

	git checkout <branch>
	... hack hack hack ...
	git add -- <path1> <path2>
	git reset -- <path1>; # oops, that one isn't ready yet
	git commit

One might try to use 'git reset' to undo the effect of 'git add' on an
unborn branch, too, but it doesn't work:

	... hack hack hack ...
	$ git add -- <path1> <path2>
	$ git reset -- <path1>
	fatal: Failed to resolve 'HEAD' as a valid ref.

It is obvious that the operator meant to remove the entry for <path1>,
so just do that.

This patch only affects the "git reset <path>" syntax; explicit
use of "git reset HEAD <path>" will still error out.

Suggested-by: Sverre Rabbelier <srabbelier@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin/reset.c         |   15 ++++++++++++-
 t/t7106-reset-unborn.sh |   50 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100755 t/t7106-reset-unborn.sh

diff --git a/builtin/reset.c b/builtin/reset.c
index 2375472..ff57764 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -234,12 +234,14 @@ static void die_if_unmerged_cache(int reset_type)
 }
 
 int cmd_reset(int argc, const char **argv, const char *prefix)
 {
 	int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0;
+	int unborn_branch = 0;
 	int patch_mode = 0;
-	const char *rev = "HEAD";
+	const char *implicit_HEAD = "HEAD";
+	const char *rev = implicit_HEAD;
 	unsigned char sha1[20], *orig = NULL, sha1_orig[20],
 				*old_orig = NULL, sha1_old_orig[20];
 	struct commit *commit;
 	char *reflog_action, msg[1024];
 	const struct option options[] = {
@@ -303,11 +305,18 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
 		if (reset_type != NONE)
 			die("--patch is incompatible with --{hard,mixed,soft}");
 		return interactive_reset(rev, argv + i, prefix);
 	}
 
-	if (get_sha1(rev, sha1))
+	if (rev == implicit_HEAD) {
+		/* We may be on a branch yet to be born. */
+		resolve_ref("HEAD", sha1, 0, NULL);
+		if (is_null_sha1(sha1)) {
+			unborn_branch = 1;
+			hashcpy(sha1, (const unsigned char *) EMPTY_TREE_SHA1_BIN);
+		}
+	} else if (get_sha1(rev, sha1))
 		die("Failed to resolve '%s' as a valid ref.", rev);
 
 	/* git reset tree [--] paths... can be used to
 	 * load chosen paths from the tree into the index without
 	 * affecting the working tree nor HEAD. */
@@ -319,10 +328,12 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
 					reset_type_names[reset_type]);
 		return read_from_tree(prefix, argv + i, sha1,
 				quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN);
 	}
 
+	if (unborn_branch)
+		die("Failed to resolve 'HEAD' as a valid ref.");
 	commit = lookup_commit_reference(sha1);
 	if (!commit)
 		die("Could not parse object '%s'.", rev);
 	hashcpy(sha1, commit->object.sha1);
 
diff --git a/t/t7106-reset-unborn.sh b/t/t7106-reset-unborn.sh
new file mode 100755
index 0000000..7baaffd
--- /dev/null
+++ b/t/t7106-reset-unborn.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+test_description='git reset from a branch yet to be born'
+. ./test-lib.sh
+
+>empty
+
+index_is_empty () {
+	git ls-files >actual &&
+	test_cmp empty actual
+}
+
+test_expect_success 'reset to remove file' '
+	echo one >file &&
+	git add file &&
+	git reset file &&
+	index_is_empty
+'
+
+test_expect_success 'reset after rm to remove file' '
+	echo one >file &&
+	git add file &&
+	rm file &&
+	git reset -- file &&
+	index_is_empty
+'
+
+test_expect_success 'reset file that does not match index' '
+	echo one >file &&
+	git add file &&
+	echo two >file &&
+	git reset -- file &&
+	index_is_empty
+'
+
+test_expect_success 'reset absent file' '
+	git reset -- file &&
+	index_is_empty
+'
+
+test_expect_success 'reset HEAD <files> from unborn branch' '
+	test_must_fail git reset HEAD -- .
+'
+
+test_expect_success 'reset HEAD from unborn branch' '
+	test_must_fail git reset HEAD &&
+	test_must_fail git reset HEAD --
+'
+
+test_done
-- 
1.7.2.3

  parent reply	other threads:[~2010-10-19 22:17 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-18 20:45 Git terminology: remote, add, track, stage, etc Thore Husfeldt
2010-10-18 21:15 ` Jonathan Nieder
2010-10-18 22:48   ` [RFC/PATCH] reset: accept "git reset <removed file>" Jonathan Nieder
2010-10-18 23:56     ` Junio C Hamano
2010-10-19  0:23       ` Jonathan Nieder
2010-10-19 17:34         ` Junio C Hamano
2010-10-19 22:34           ` Jonathan Nieder
2010-10-18 21:35 ` Git terminology: remote, add, track, stage, etc Sverre Rabbelier
2010-10-19  0:03   ` Junio C Hamano
2010-10-19 17:51   ` Ramkumar Ramachandra
2010-10-19 18:28     ` Jonathan Nieder
2010-10-19 18:34       ` Sverre Rabbelier
2010-10-19 18:43         ` Thore Husfeldt
2010-10-19 19:04           ` User manual: "You cannot check out these remote-tracking branches" Jonathan Nieder
2010-10-19 20:52             ` Matthieu Moy
2010-10-19 19:15           ` Git terminology: remote, add, track, stage, etc Nicolas Pitre
2010-10-19 19:20       ` Junio C Hamano
2010-10-19 22:10         ` [RFC/PATCH 0/4] reset: be more flexible about <rev> Jonathan Nieder
2010-10-19 22:11           ` [WIP/PATCH 1/4] reset -p: accept "git reset -p <tree>" Jonathan Nieder
2010-10-19 22:12           ` [PATCH 2/4] reset: accept "git reset <tree> <path>" Jonathan Nieder
2010-10-19 22:13           ` Jonathan Nieder [this message]
2010-10-19 22:14           ` [PATCH 4/4] reset: accept "git reset HEAD <path>" from unborn branch Jonathan Nieder
2010-10-19 23:08             ` Junio C Hamano
2010-10-19 23:26               ` Jonathan Nieder
2010-10-27 15:03     ` Git terminology: remote, add, track, stage, etc Ramkumar Ramachandra
2010-10-27 15:16       ` Drew Northup
2010-10-27 16:08         ` Matthieu Moy
2010-10-28 15:20           ` Ramkumar Ramachandra
2010-10-28 18:25             ` Matthieu Moy
2010-10-18 21:41 ` Matthieu Moy
2010-10-19  4:49   ` Miles Bader
2010-10-19  7:19     ` Wincent Colaiuta
2010-10-19  7:48       ` Miles Bader
2010-10-19  8:05         ` Wincent Colaiuta
2010-10-19 15:09           ` Eugene Sajine
2010-10-22 20:16             ` Paul Bolle
2010-10-22 21:00               ` Eugene Sajine
2010-10-22 21:46                 ` Drew Northup
2010-10-20  9:53   ` Thore Husfeldt
2010-10-20 11:34     ` Matthieu Moy
2010-10-20 14:01       ` Drew Northup
2010-10-18 21:57 ` Jakub Narebski
2010-10-19  8:05   ` Matthijs Kooijman
2010-10-19  8:27     ` Jakub Narebski
2010-10-19 17:30       ` Thore Husfeldt
2010-10-19 20:57         ` Jakub Narebski
2010-10-21  8:44   ` Michael Haggerty
2010-10-21 11:20     ` Drew Northup
2010-10-21 12:31       ` Thore Husfeldt
2010-10-21 12:56         ` Drew Northup
2010-10-21 14:06           ` Thore Husfeldt
2010-10-21 20:06             ` Drew Northup
2010-10-22  4:07       ` Miles Bader
2010-10-22 11:51         ` Drew Northup
2010-10-19 14:39 ` [PATCH v3] Porcelain scripts: Rewrite cryptic "needs update" error message Ramkumar Ramachandra
2010-10-27 14:55   ` Ramkumar Ramachandra
2010-11-05 22:38     ` Junio C Hamano
2011-02-12 23:14   ` Ævar Arnfjörð Bjarmason
2010-10-19 21:53 ` Git terminology: remote, add, track, stage, etc Drew Northup

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=20101019221331.GF32029@burratino \
    --to=jrnieder@gmail.com \
    --cc=artagnon@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=schacon@gmail.com \
    --cc=srabbelier@gmail.com \
    --cc=thore.husfeldt@gmail.com \
    --cc=trast@student.ethz.ch \
    /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).