既存のローカル/リモートリポジトリのデフォルトブランチ名を、四苦八苦しながらmasterからmainに変更した話

初投稿です。
お手柔らかにお願いします。

# 経緯

masterをデフォルトブランチとして開発を進めていたが、Githubページを見ると、
mainという名のブランチが、リポジトリ作成時から手つかずの状態で残っているのを発見。

そういえば差別表現云々で、masterからmainに名称変更になった話があったなあと今更ながらに思い出しました。

リモートリポジトリにmasterとmainが両方残っているのも気持ち悪いので、mainのみに変更しようと思い立ちました。

# 結論

今回のケースでは、リモートリポジトリのmasterとmainは全くの別物(共通の祖先がない)なので、
--allow-unrelated-historiesオプションを付けてマージすれば万事解決です。

# 実際の流れ

当方初心者につき、上記の結論に至るまでに紆余曲折ありました。
せっかくなので、備忘録も兼ねて、解決までに実際にやったことを残しておきます。

(0)
Railsチュートリアルを進めていたところ、Github上に謎のmainブランチを発見。
これがリポジトリ作成時にできたデフォルトブランチであったことに気付く。

【登場人物】
master：ローカルではこいつをデフォルトとして開発していた。
origin/master：リモートではこいつをデフォルトのつもりで開発していた。内容はローカルのmasterと同じ。
origin/main：リポジトリ作成に生成されていた本当のデフォルトブランチ。内容は.gitignoreとReadme.mdのみ。

(1)
以下の記事を参考に、ローカルのブランチ名をmainに変更。
参考URL：
https://qiita.com/masakinihirota/items/1a657674e609be112fc6

```
$ git branch -m master main
```

※この時点でローカル・リモート双方にmainブランチがあることになるが、
お互い全く関係のない、つまり共通の祖先がないブランチ同士の状態。

(2)
ローカルで変えたブランチをリモートへpush。

```
$ git push -u origin main
```

ところが、以下のエラー。

```
To https://github.com/shu-illy/xxxxxxx
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/shu-illy/xxxxxxx'
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.
```

(3)
この時点ではエラー文の意味をほとんど理解できず。
「もしかしてHerokuでアプリが動いてるからあかんのか？」などと的外れな推測をして、
以下のコマンドでHeroku上でアプリを停止しようとする。

```
$ heroku ps
$ heroku ps:scale web=0
```

(4)
(2)と同じ試み。当然同じエラー。

(5)
何故かリモートのmasterを消してしまう。

```
$ git push origin :master
```

(6)
git pullを試して以下のエラー。

```
fatal: refusing to merge unrelated histories
```

このエラー文に重要なヒントがあるにも関わらず、あっさり見過ごす。

(7)
的外れ推測その2
「gitのバージョンがあかんのか？」

以下の通りgitを最新版にアップデート。

```
$ git --version
git version 2.24.3 (Apple Git-128)

$ brew install git

$ export PATH=/usr/local/Cellar/git/2.27.0/bin:$PATH

$ git --version
git version 2.30.0
```

(8)
(4)に同じ。

(9)
とりあえず今後のためにローカルリポジトリでのデフォルトブランチ名の設定をmainに変更した。

```
$ git config --global init.defaultBranch main
```

このあたりでようやく(1)※に気付く。
リモートのmainブランチに紐付けたローカルブランチを用意し、ローカルのmainをマージすれば良いと悟る。

ここで登場人物を一旦おさらいしましょう。

【登場人物】
main：最新の状態。こいつをorigin/mainにプッシュしたい。
master：mainに名前変更済。
origin/main：リポジトリ作成時から手付かず(.gitignoreとReadme.mdだけがある状態)。
origin/master：(5)で消されてしまった可哀想な人。

(10)
ローカルのブランチ名をmainからmasterに戻す。

```
$ git branch -m main master
```

(11)
origin/mainと紐付けるために、ローカルのmainを復活させる。

```
$ git checkout -b main
```

(12)
作成したmainブランチに、リモートのmainを強制上書きする。
参考URL：
http://www-creators.com/archives/1097

```
$ git fetch origin main
$ git reset --hard origin/main
```

(13)
mainブランチにmasterをマージ。
共通の祖先を持っていないブランチ同士のマージなので、以下のコマンド。
参考URL：
https://qiita.com/mei28/items/85bc881ac1f26332ac15

```
$ git merge --allow-unrelated-histories master
```

(14)
当然コンフリクトが起こるので手作業で解消。

(15)
コミット・プッシュして無事ローカル/リモートともにデフォルトのブランチ名がmainになりました。
めでたしめでたし。

```
$ git add .
$ git commit -m "Change default branch name"
$ git push origin main  
```

## 参考URL(再掲)
masterからmainに変更する（githubのリモート＆ローカルブランチ）:
https://qiita.com/masakinihirota/items/1a657674e609be112fc6


git pull を強制し、リモートでローカルを上書きする方法:
http://www-creators.com/archives/1097

[Git] fatal: refusing to merge unrelated histiesを解決する話:
https://qiita.com/mei28/items/85bc881ac1f26332ac15