Bitbucketでブランチを作れなくなった時の対処

Bitbucketを利用していて、同名のブランチが存在しないにも関わらずブランチを新しく作れなくなる問題があるので、その対処法を書く。

エラーメッセージとしては、bitbucket上からブランチを作成した場合は以下のようなメッセージが表示される。

20141016033223

ローカルで作成したブランチを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の問題

問題となるのは、次のようなケースである。

  1. Bitbukect上に以下のブランチを作る

    • test/branch/test1

    • test/branch/test2

  2. Bitbukect上のDelete Branchボタンから上記の2つのブランチを削除

  3. Bitbukect上で以下のブランチを作成もしくはローカルのGitから以下のブランチをPush

    • test/branch
  4. 作成できない

ここから先は、推測の話になるが、Bitbucket上でDelete Branchボタンを押した際のブランチの削除処理が正しく実行されていない為、test/branch/Atest/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コマンドで正しくブランチの作成と削除を実行すること。