I've found out that using slashes to name git branches in a hierarchy fashion is limited to only one level:
$ git checkout -b feature/public-api Switched to a new branch 'feature/public-api' $ git checkout -b feature/public-api/oauth2 fatal: cannot lock ref 'refs/heads/feature/public-api/oauth2': 'refs/heads/feature/public-api' exists; cannot create 'refs/heads/feature/public-api/oauth2'
The reason for this is that a git branch is simply a text file in the
.git/branches directory, containing the hash of the commit at the tip of the branch. When a branch's name contains a slash, git creates a subdirectory to store this file in. So the hash of the branch
feature/public-api is stored at
.git/branches/feature/public-api. If you try to add one more level to that, then git will try to create the
.git/branches/feature/public-api directory, which is impossible, because there's already a file with this name.
It's yet another leaky abstraction from git, once again for the purposes of performance and simplicity of implementation, which I can understand.