git pushコマンドを実行すると「fatal: <ブランチ名> cannot be resolved to branch」となりpushが失敗する

2021.08.05

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、git pushコマンドを実行するとfatal: <ブランチ名> cannot be resolved to branchとなりpushが失敗する事象の原因と対処についてです。

事象

GitHubを使用した開発でローカルブランチでの作業内容をgit pushでリモートブランチに送信しようとしたところ、下記のようなエラーとなりpushが失敗しました。

$ git push origin feature/adminpage/impl-adding-user-in-bulk
fatal: feature/adminpage/impl-adding-user-in-bulk cannot be resolved to branch

直接原因、解決

原因は、正しいブランチ名では大文字となっている箇所が、pushコマンドで指定したブランチ名では小文字となっていたためでした。

$ git branch --contains=HEAD
  feature/adminPage/impl-adding-user-in-bulk

よく見ると/adminpageではなく、正しくは/adminPageです。

正しいブランチ名を指定すると正常にpushが行えました。

$ git push origin feature/adminPage/impl-adding-user-in-bulk

根本原因

そもそもなんで小文字と大文字を間違えたかと言うと、git statusgit commitコマンドで画面出力されるカレントブランチ名は大文字が小文字になっているためです。画面出力されたブランチ名の文字列をいつものようにコピペしてpushコマンドに指定していたため、今回の事象に遭遇してしまいました。

git status

$ git status
On branch feature/adminpage/impl-adding-user-in-bulk
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   web/src/components/actions/useGetUsers.tsx
        modified:   web/src/components/pages/userPage.tsx
        ...

git commit

$ git commit -m "fix"
[feature/adminpage/impl-adding-user-in-bulk cff74b1] fix
 8 files changed, 429 insertions(+), 366 deletions(-)
 ...

git push origin HEAD を使った場合は?

git push origin HEADを使用するとカレントブランチがpushされます。これでブランチ名の指定ミスも起きないのではと考えました。

実行してみると、コンソール上では一見pushが成功したように見えます。

$ git branch --contains=HEAD
  feature/adminPage/impl-adding-user-in-bulk
$ git push origin HEAD

しかしリモートには名前が小文字のブランチ(下記画像の下)が新しく作成されてしまいました。ブランチの内容はローカルで行った変更が反映されていますが、名前が正しいブランチ(下記画像の上)とは別ブランチとなっています。

よって、git push origin HEADでは大文字を含むブランチを正常にpushすることは出来ませんでした。

結論

大文字を含むブランチ名を作らないようにする。そうすればpush時のブランチ名の指定ミスは起きないですし、git push origin HEADも使えます。

以上