`HEAD` is an invalid branch name.[1] But the `@` synonym is allowed. This is just as inconvenient since commands like `git checkout @` will, quite sensibly, do `git checkout HEAD` instead of checking out that branch; in turn there is no practical reason to use this as a branch name since you cannot even check out the branch itself (only check out the commit which `refs/heads/@` points to). † 1: a625b092cc5 (branch: correctly reject refs/heads/{-dash,HEAD}, 2017-11-14) Signed-off-by: Kristoffer Haugsbakk <code@xxxxxxxxxxxxxxx> --- object-name.c | 3 ++- t/t3204-branch-name-interpretation.sh | 9 ++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/object-name.c b/object-name.c index 42e3ba4a77a..56b288ff4c3 100644 --- a/object-name.c +++ b/object-name.c @@ -1763,7 +1763,8 @@ int strbuf_check_branch_ref(struct strbuf *sb, const char *name) strbuf_splice(sb, 0, 0, "refs/heads/", 11); if (*name == '-' || - !strcmp(sb->buf, "refs/heads/HEAD")) + !strcmp(sb->buf, "refs/heads/HEAD") || + !strcmp(sb->buf, "refs/heads/@")) return -1; return check_refname_format(sb->buf, 0); diff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh index 594e3e43e12..7dcd1308f8c 100755 --- a/t/t3204-branch-name-interpretation.sh +++ b/t/t3204-branch-name-interpretation.sh @@ -119,13 +119,8 @@ test_expect_success 'disallow deleting remote branch via @{-1}' ' expect_branch refs/heads/origin/previous two ' -# The thing we are testing here is that "@" is the real branch refs/heads/@, -# and not refs/heads/HEAD. These tests should not imply that refs/heads/@ is a -# sane thing, but it _is_ technically allowed for now. If we disallow it, these -# can be switched to test_must_fail. -test_expect_success 'create branch named "@"' ' - git branch -f @ one && - expect_branch refs/heads/@ one +test_expect_success 'disallow branch named "@"' ' + test_must_fail git branch -f @ one ' test_expect_success 'delete branch named "@"' ' -- 2.46.1.641.g54e7913fcb6