経緯
他の人が作った project/feature_name みたいなブランチを派生元として project/feature_name/add_hoge みたいな作業用ブランチを作ろうとしたら怒られた。
$ git branch
master
* project/feature_name
$ git checkout -b project/feature_name/add_hoge
fatal: cannot lock ref 'project/feature_name/add_hoge':
'project/feature_name' exists; cannot create 'project/feature_name/add_hoge'
原因
Git では foo/bar みたいなブランチを作ろうとすると .git ディレクトリ配下に foo ディレクトリを作ろうとする。
このとき既に foo というブランチが存在していると、当然もう foo ディレクトリが作成済みなので上記のようなエラーになるらしい。
$ git co -b hoge
Switched to a new branch 'hoge'
$ git co -b hoge/fuga
fatal: cannot lock ref 'refs/heads/hoge/fuga': 'refs/heads/hoge' exists; cannot create 'refs/heads/hoge/fuga'
参考: gitでfooとfoo/barというブランチは同時には作成できない
解決
1. 派生元のブランチ名を工夫する
今回のケースみたいにトップブランチを作って、そこから作業用ブランチを切って…みたいにやる場合、トップブランチ名を下記のようにすれば衝突しない。
NG: project/feature_name
OK: project/feature_name/top
上記のようにすると、 project/feature_name/add_hoge のように作業用ブランチの命名ができる。
2. 作業用ブランチの名前に / を使わない
個人的にはしっかり / で区切りたいけど、そんなこだわりはない場合は単に使わなければ良い。
例) project/feature_name_add_hoge
例) project/feature_name--add_hoge
例) project/feature_name__add_hoge