Bitbucketでブランチを作れなくなった時の対処
Bitbucketを利用していて、同名のブランチが存在しないにも関わらずブランチを新しく作れなくなる問題があるので、その対処法を書く。
エラーメッセージとしては、bitbucket上からブランチを作成した場合は以下のようなメッセージが表示される。
ローカルで作成したブランチをPushする場合は以下のようなエラーがでる。
remote: error: failed to lock refs/heads/test/branch To https://user_name@bitbucket.org/user_name/test.git ! [remote rejected] test/branch -> test/branch (failed to lock) error: failed to push some refs to 'https://user_name@bitbucket.org/user_name/test.git'
Gitの仕様について
まず、Gitの仕様から起こる問題について説明しておく。
Gitでは、/
の区切りを識別してブランチの情報を格納する為、/
以前の名前が同じブランチは作成することはできない。以下のサイトなどを参考。
gitのブランチ名にスラッシュを含めるときの罠 - hokaccha.hamalog v2
例としては次のような場合が問題になる。
Bitbucket(Git)上にあるブランチ
test/branch/test
作れるブランチ名
test/branch/test2
test/branch2/test
test2
作れないブランチ名
test/branch
test/hoge
test
test/branch/test
(当たり前)
これはGitの仕様なので、当然Bitbucketでも同じ問題が起こる。今回問題としているのは、これの特殊ケースである。
Bitbucketの問題
問題となるのは、次のようなケースである。
Bitbukect上に以下のブランチを作る
test/branch/test1
test/branch/test2
Bitbukect上のDelete Branchボタンから上記の2つのブランチを削除
Bitbukect上で以下のブランチを作成もしくはローカルのGitから以下のブランチをPush
test/branch
作成できない
ここから先は、推測の話になるが、Bitbucket上でDelete Branchボタンを押した際のブランチの削除処理が正しく実行されていない為、test/branch/A
やtest/branch/B
の情報が残っており、test/branch
が作成できなくなったのだと思われる。
解決方法
この方法で、全ての場合上手くいくかは不明だが、以下のようにする。
1. リポジトリを適当な場所にcloneする
2. ローカルに以下のブランチを作成しPush
git checkout -b test/branch/test1 git checkout -b test/branch/test2 git push origin test/branch/test1 git push origin test/branch/test2
3. ローカルで以下のコマンドを実行して、リモートのブランチを削除
git push origin :test/branch/test1 git push origin :test/branch/test2
4. ローカルのブランチを削除する(5を実行する為)
git branch -d test/branch/test1 git branch -d test/branch/test2
5. ローカルで作りたいブランチを作成してPush
git checkout -b test/branch git push origin test/branch
ポイントはGitコマンドで正しくブランチの作成と削除を実行すること。