git: difference between "branchname" and "refs/heads/branchname"
Just for somebody who is curious - git show-ref
, which is available since Git v1.8.2.2, will show you all references you have in your local repository.
See, branchName
needs to be fully resolved before GIT can actually identify it. The fully resolved name will be refs/heads/branchName
.
One of the famous commandsgit checkout branchName
actually automatically resolves it fully to identify where you want to checkout. Note that it does it automatically hence we never write it fully on our own.
How does it do that ? Let us look here
refname :, e.g.
master
,heads/master
,refs/heads/master
A symbolic ref name. E.g. master typically means the commit object referenced by
refs/heads/master
. If you happen to have bothheads/master
andtags/master
, you can explicitly sayheads/master
to tell Git which one you mean. When ambiguous, a<refname>
is disambiguated by taking the first match in the following rules:1.If
$GIT_DIR/<refname>
exists, that is what you mean (this is usually useful only forHEAD
,FETCH_HEAD
,ORIG_HEAD
,MERGE_HEAD
andCHERRY_PICK_HEAD
);2.otherwise,
refs/<refname>
if it exists;3.otherwise,
refs/tags/<refname>
if it exists;4.otherwise,
refs/heads/<refname>
if it exists;5.otherwise,
refs/remotes/<refname>
if it exists;6.otherwise,
refs/remotes/<refname>/HEAD
if it exists.
So by above 6 steps , it tries to resolve what is this branchName
. Hence we never need to give a fully resolved branchName to it.
Look here and here too.
Also, go in your .git
directory and see inside the ref
folder.
A ref
is anything pointing to a commit, for example, branches (heads), tags, and remote branches. You should see heads, remotes, and tags in your .git/refs
directory, assuming you have all three types of refs in your repository.
refs/heads/0.58
specifies a branch named 0.58. If you don't specify what namespace the ref is in, git will look in the default ones. This makes using only 0.58 conceivably ambiguous - you could have both a branch and a tag named 0.58.