Githubのデフォルトブランチがmainであることに気付かず、ローカルのブランチをmasterのままpushし、エラーが出たときの対処法


経緯

アプリケーション作成のためGithubにリモートリポジトリを作成し、ローカルのブランチ名をmasterにしてpushしました。Githubを確認するとプルリクの表示が出ていたので疑問に思って確認すると、Githubで作成されたデフォルトブランチがmainになっていたことに気が付きました。調べてみると2020年の10月からGithubにて作成されるデフォルトブランチがmainになっていることが分かりました。

今回、私と同じようにローカルブランチをmasterにしてpushし、プルリクの表示が出て以降進めず、どう対処すればよいか分からない方がいると思い記事を書こうと思いました

※記事にしようと思ったときにはマージまで終了してしまったので画像は少ないです!

※10月からリポジトリのデフォルトブランチ名がmainになるという情報は以下を参考にしています。
https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/

原因

リモートリポジトリ作成時、デフォルトブランチがmainになっていることを確認せずにローカルブランチをmasterのままpushしてしまったこと。

実際に発生したこと

いつものようにpushまでしました。

$ git init
$ git add .
$ git commit -m "XXXXXXX"
$ git remote add origin https://github.com/YYYYYYY/test.git
$ git push origin master

ここでGithubを更新すると、Compare & pull requestが表示されます。

通常であれば、Compare & pull requestを押すと以下が表示されますが・・・

今回は表示されませんでした。

今回の場合、Conpare & pull request押すと以下が表示されました。

There isn’t anything to compare. main and master are entirely different commit histories.

「mainとmasterは全く異なるコミットを持つので比較できません」という意味ですね。

関連性を構築できればうまくいくかもしれません。

解決策

mainとmasterを関連づける

$ git branch --set-upstream-to origin/master main                     

master = (ローカルリポジトリのブランチ)
main = (リモートリポジトリのブランチ)

これでmainとmasterの関連性を構築できました。

あとは以下を行います。

$ git checkout master
$ git pull
$ git checkout main
$ git pull
$ git merge master
$ git push origin main

補足

上記を行った際に以下が発生するかもしれません。

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/maruuchi/health_care6.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

その際は以下の方法で対処しました。

$ git push -f origin main

これは強制的にpushを行うことです。あまり良い方法ではないかもしれませんが...

追記

新たなアプリケーションを作成するため新しくリモートリポジトリを作成し、ブランチ名をmainにしてローカルリポジトリのブランチ名をmasterにしてpushしたところエラーは発生せず、通常通りpushできました。原因は不明です。