Branch names must conform to a few simple rules. You can use the forward slash (/) to create a hierarchical name scheme. However, the name cannot end with a slash. The name cannot start with a minus sign (-).
Naming rules for refname: Git imposes the following rules on how references are named: They can include slash / for hierarchical (directory) grouping, but no slash-separated component can begin with a dot . or end with the sequence . lock .
When you have a branch with slashes in it, it gets stored as a directory hierarchy under . git/refs/heads .
Are you sure branch labs
does not already exist (as in this thread)?
You can't have both a file, and a directory with the same name.
You're trying to get git to do basically this:
% cd .git/refs/heads % ls -l total 0 -rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 labs -rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 master % mkdir labs mkdir: cannot create directory 'labs': File exists
You're getting the equivalent of the "cannot create directory" error.
When you have a branch with slashes in it, it gets stored as a directory hierarchy under.git/refs/heads
.
Note that labs
must not be an existing branch, as ddruganov points out in the comments:
git switch -c 19023-commerce/19033-commerce-view 19023-commerce
# Fails with:
fatal: cannot lock ref 'refs/heads/19073-commerce-view/99999-test-branch':
'refs/heads/19073-commerce-view' exists;
cannot create 'refs/heads/19073-commerce-view/99999-test-branch'
As explained in "git push: refs/heads/my/subbranch
exists, cannot create":
- If branch b exists, no branch named b/anything can be created.
- Likewise, if branch dev/b exists, dev/b/c cannot be created.
This is a git internal limitation.
It is possible to have hierarchical branch names (branch names with slash). For example in my repository I have such branch(es). One caveat is that you can't have both branch 'foo' and branch 'foo/bar' in repository.
Your problem is not with creating branch with slash in name.
$ git branch foo/bar error: unable to resolve reference refs/heads/labs/feature: Not a directory fatal: Failed to lock ref for update: Not a directory
The above error message talks about 'labs/feature' branch, not 'foo/bar' (unless it is a mistake in copy'n'paste, i.e you edited parts of session). What is the result of git branch
or git rev-parse --symbolic-full-name HEAD
?
I forgot that I had already an unused labs
branch. Deleting it solved my problem:
git branch -d labs
git checkout -b labs/feature
Explanation:
Each name can only be a parent branch or a normal branch, not both. Thats why the branches labs
and labs/feature
can't exists both at the same time.
The reason: Branches are stored in the file system and there you also can't have a file labs
and a directory labs
at the same level.
Sometimes that problem occurs if you already have a branch with the base name.
I tried this:
git checkout -b features/aName origin/features/aName
Unfortunately, I already had a branch named features
, and I got the exception of the question asker.
Removing the branch features
resolved the problem, the above command worked.
Branch name is case sensitive and so if there are folders created in Azure by your release manager, folder names should match exactly. Learned it hard way raising it with manager.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With