summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-01-03 12:07:32 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-01-03 21:34:19 (GMT)
commit3442ea4a75a3c76f65efac71b414584f765e5a99 (patch)
tree1ba10fed9fb2ef89b102e0462579133e6d851502
parent27c03aafdf29736f889c56777426066c74fa115d (diff)
downloadgit-3442ea4a75a3c76f65efac71b414584f765e5a99.zip
git-3442ea4a75a3c76f65efac71b414584f765e5a99.tar.gz
git-3442ea4a75a3c76f65efac71b414584f765e5a99.tar.bz2
git checkout: do not allow switching to a tree-ish that is not a commit
"git checkout -b newbranch $commit^{tree}" mistakenly created a new branch rooted at the current HEAD, because in that case, the two structure fields used to see if the command was invoked without any argument (hence it needs to default to checking out the HEAD) were populated incorrectly. Upon seeing a command line argument that we took as a rev, we should store that string in new.name, even if that does not name a commit. This will correctly trigger the existing safety logic. Signed-off-by: Junio C Hamano <gitster@pobox.com> Acked-by: Daniel Barkalow <barkalow@iabervon.org>
-rw-r--r--builtin-checkout.c2
-rwxr-xr-xt/t2011-checkout-invalid-head.sh4
2 files changed, 5 insertions, 1 deletions
diff --git a/builtin-checkout.c b/builtin-checkout.c
index c107fd6..544aa5a 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -515,8 +515,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
argv++;
argc--;
+ new.name = arg;
if ((new.commit = lookup_commit_reference_gently(rev, 1))) {
- new.name = arg;
setup_branch_path(&new);
if (resolve_ref(new.path, rev, 1, NULL))
new.commit = lookup_commit_reference(rev);
diff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh
index 764bb0a..15ebdc2 100755
--- a/t/t2011-checkout-invalid-head.sh
+++ b/t/t2011-checkout-invalid-head.sh
@@ -10,6 +10,10 @@ test_expect_success 'setup' '
git commit -m initial
'
+test_expect_success 'checkout should not start branch from a tree' '
+ test_must_fail git checkout -b newbranch master^{tree}
+'
+
test_expect_success 'checkout master from invalid HEAD' '
echo 0000000000000000000000000000000000000000 >.git/HEAD &&
git checkout master --