When run on an unborn branch, "git reset" currently fails with: fatal: Failed to resolve 'HEAD' as a valid ref. Fix this by interpreting it as a reset to the empty tree. If --patch is given, we currently pass the revision specifier, as given on the command line, to interactive_reset(). On an unborn branch, HEAD can of course not be resolved, so we need to pass the sha1 of the empty tree to interactive_reset() as well. This is fine since interactive_reset only needs the parameter to be a treeish and doesn't use it for display purposes. --- Is it correct that interactive_reset does not use the revision specifier for display purposes? Or, worse, that it requires it to be a commit in some cases? I tried it and didn't see any problem. builtin/reset.c | 10 +++++--- t/t7106-reset-unborn-branch.sh | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100755 t/t7106-reset-unborn-branch.sh diff --git a/builtin/reset.c b/builtin/reset.c index cec9874..3845225 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -229,7 +229,10 @@ static struct object *lookup_commit_or_tree(const char *rev) { unsigned char sha1[20]; struct commit *commit; struct tree *tree; - if (get_sha1_treeish(rev, sha1)) + if (!strcmp(rev, "HEAD") && get_sha1("HEAD", sha1)) { + // unborn branch: reset to empty tree + hashcpy(sha1, EMPTY_TREE_SHA1_BIN); + } else if (get_sha1_treeish(rev, sha1)) die(_("Failed to resolve '%s' as a valid ref."), rev); commit = lookup_commit_reference_gently(sha1, 1); if (commit) @@ -292,7 +295,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix) * Otherwise, argv[i] could be either <rev> or <paths> and * has to be unambiguous. */ - else if (!get_sha1_treeish(argv[i], sha1)) { + else if (!strcmp(argv[i], "HEAD") || + !get_sha1_treeish(argv[i], sha1)) { /* * Ok, argv[i] looks like a rev; it should not * be a filename. @@ -315,7 +319,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (patch_mode) { if (reset_type != NONE) die(_("--patch is incompatible with --{hard,mixed,soft}")); - return interactive_reset(rev, argv + i, prefix); + return interactive_reset(sha1_to_hex(sha1), argv + i, prefix); } /* git reset tree [--] paths... can be used to diff --git a/t/t7106-reset-unborn-branch.sh b/t/t7106-reset-unborn-branch.sh new file mode 100755 index 0000000..67d45be --- /dev/null +++ b/t/t7106-reset-unborn-branch.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +test_description='git reset should work on unborn branch' +. ./test-lib.sh + +test_expect_success 'setup' ' + echo a >a && + echo b >b +' + +test_expect_success 'reset' ' + git add a b && + git reset && + test "$(git ls-files)" == "" +' + +test_expect_success 'reset HEAD' ' + rm .git/index && + git add a b && + git reset HEAD && + test "$(git ls-files)" == "" +' + +test_expect_success 'reset $file' ' + rm .git/index && + git add a b && + git reset a && + test "$(git ls-files)" == "b" +' + +test_expect_success 'reset -p' ' + rm .git/index && + git add a && + echo y | git reset -p && + test "$(git ls-files)" == "" +' + +test_expect_success 'reset --soft not allowed' ' + rm .git/index && + git add a && + test_must_fail git reset --soft +' + +test_expect_success 'reset --hard' ' + rm .git/index && + git add a && + git reset --hard && + test "$(git ls-files)" == "" && + test_path_is_missing a +' + +test_done -- 1.8.0.1.240.ge8a1f5a -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html