# phpman > man > git-check-ref-format(1)

> **TLDR:** Check if a reference name is acceptable, and exit with a non-zero status if it is not.
>
- Check the format of the specified reference name:
  `git check-ref-format {{refs/head/refname}}`
- Print the name of the last branch checked out:
  `git check-ref-format --branch @{-1}`
- Normalize a refname:
  `git check-ref-format --normalize {{refs/head/refname}}`

*Source: tldr-pages*

---

[GIT-CHECK-REF-FOR(1)](https://www.chedong.com/phpMan.php/man/GIT-CHECK-REF-FOR/1/markdown)                         Git Manual                         [GIT-CHECK-REF-FOR(1)](https://www.chedong.com/phpMan.php/man/GIT-CHECK-REF-FOR/1/markdown)



## NAME
       git-check-ref-format - Ensures that a reference name is well formed

## SYNOPSIS
       _git_ _check-ref-format_ [--normalize]
              [--[no-]allow-onelevel] [--refspec-pattern]
              <refname>
       _git_ _check-ref-format_ --branch <branchname-shorthand>


## DESCRIPTION
       Checks if a given _refname_ is acceptable, and exits with a non-zero status if it is not.

       A reference is used in Git to specify branches and tags. A branch head is stored in the
       **refs/heads** hierarchy, while a tag is stored in the **refs/tags** hierarchy of the ref namespace
       (typically in **$GIT**___**DIR/refs/heads** and **$GIT**___**DIR/refs/tags** directories or, as entries in file
       **$GIT**___**DIR/packed-refs** if refs are packed by **git** **gc**).

       Git imposes the following rules on how references are named:

        1. They can include slash **/** for hierarchical (directory) grouping, but no slash-separated
           component can begin with a dot **.**  or end with the sequence **.lock**.

        2. They must contain at least one **/**. This enforces the presence of a category like **heads/**,
           **tags/** etc. but the actual names are not restricted. If the **--allow-onelevel** option is
           used, this rule is waived.

        3. They cannot have two consecutive dots **..**  anywhere.

        4. They cannot have ASCII control characters (i.e. bytes whose values are lower than \040,
           or \177 **DEL**), space, tilde **~**, caret **^**, or colon **:** anywhere.

        5. They cannot have question-mark **?**, asterisk *****, or open bracket **[** anywhere. See the
           **--refspec-pattern** option below for an exception to this rule.

        6. They cannot begin or end with a slash **/** or contain multiple consecutive slashes (see the
           **--normalize** option below for an exception to this rule)

        7. They cannot end with a dot **.**.

        8. They cannot contain a sequence **@{**.

        9. They cannot be the single character **@**.

       10. They cannot contain a **\**.

       These rules make it easy for shell script based tools to parse reference names, pathname
       expansion by the shell when a reference name is used unquoted (by mistake), and also avoid
       ambiguities in certain reference name expressions (see [**gitrevisions**(7)](https://www.chedong.com/phpMan.php/man/gitrevisions/7/markdown)):

        1. A double-dot **..**  is often used as in **ref1..ref2**, and in some contexts this notation means
           **^ref1** **ref2** (i.e. not in **ref1** and in **ref2**).

        2. A tilde **~** and caret **^** are used to introduce the postfix _nth_ _parent_ and _peel_ _onion_
           operation.

        3. A colon **:** is used as in **srcref:dstref** to mean "use srcref’s value and store it in dstref"
           in fetch and push operations. It may also be used to select a specific object such as
           with _git_ _cat-file_: "git cat-file blob v1.3.3:refs.c".

        4. at-open-brace **@{** is used as a notation to access a reflog entry.

       With the **--branch** option, the command takes a name and checks if it can be used as a valid
       branch name (e.g. when creating a new branch). But be cautious when using the previous
       checkout syntax that may refer to a detached HEAD state. The rule **git** **check-ref-format**
       **--branch** **$name** implements may be stricter than what **git** **check-ref-format** **refs/heads/$name**
       says (e.g. a dash may appear at the beginning of a ref component, but it is explicitly
       forbidden at the beginning of a branch name). When run with **--branch** option in a repository,
       the input is first expanded for the “previous checkout syntax” **@{-n}**. For example, **@{-1}** is a
       way to refer the last thing that was checked out using "git switch" or "git checkout"
       operation. This option should be used by porcelains to accept this syntax anywhere a branch
       name is expected, so they can act as if you typed the branch name. As an exception note that,
       the “previous checkout operation” might result in a commit object name when the N-th last
       thing checked out was not a branch.

## OPTIONS
       --[no-]allow-onelevel
           Controls whether one-level refnames are accepted (i.e., refnames that do not contain
           multiple **/**-separated components). The default is **--no-allow-onelevel**.

### --refspec-pattern
           Interpret <refname> as a reference name pattern for a refspec (as used with remote
           repositories). If this option is enabled, <refname> is allowed to contain a single ***** in
           the refspec (e.g., **foo/bar*/baz** or **foo/bar*baz/** but not **foo/bar*/baz***).

### --normalize
           Normalize _refname_ by removing any leading slash (**/**) characters and collapsing runs of
           adjacent slashes between name components into a single slash. If the normalized refname
           is valid then print it to standard output and exit with a status of 0, otherwise exit
           with a non-zero status. (**--print** is a deprecated way to spell **--normalize**.)

## EXAMPLES
       •   Print the name of the previous thing checked out:

               $ git check-ref-format --branch @{-1}


       •   Determine the reference name to use for a new branch:

               $ ref=$(git check-ref-format --normalize "refs/heads/$newbranch")||
               { echo "we do not like '$newbranch' as a branch name." >&2 ; exit 1 ; }


## GIT
       Part of the [**git**(1)](https://www.chedong.com/phpMan.php/man/git/1/markdown) suite



Git 2.34.1                                   02/26/2026                         [GIT-CHECK-REF-FOR(1)](https://www.chedong.com/phpMan.php/man/GIT-CHECK-REF-FOR/1/markdown)
