状況

ローカルで作成したリポジトリにgit add remoteし、pullしようとしたらrefusing to merge unrelated historiesになった。

1
2
3
4
5
6
7
8
9
$ git remote add origin https://github.com/shosatojp/hoge.git
$ git push --set-upstream origin master
# To https://github.com/shosatojp/hoge.git
# ! [rejected] master -> master (non-fast-forward)
# error: failed to push some refs to 'https://github.com/shosatojp/hoge.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.

pushするとpullしろと言われる。ここまではいい。

これが今回gitに怒られたところ

1
2
3
4
$ git pull origin master
# From https://github.com/shosatojp/hoge
# * branch master -> FETCH_HEAD
# fatal: refusing to merge unrelated histories

「refusing to merge unrelated histories」のエラーが発生している。

Refusing to Merge Unrelated Historiesとは何か

gitの公式サイトにはmergeのオプションでこのように書かれている

By default, git merge command refuses to merge histories that do not share a common ancestor. This option can be used to override this safety when merging histories of two projects that started their lives independently.
https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---allow-unrelated-histories

つまり、

デフォルトでは、共通の祖先を持たないブランチ同士のmergeは安全のために無効にされているというのだ。

今回のケースではgithubでリポジトリを作りreadme.mdを追加し、ローカルでファイルを追加してから、git remote addをしたため共通の祖先を持たないブランチ同士ということになったものと思われる。

結論

mergeコマンドで祖先を共有しないブランチ同士のmergeを許可する--allow-unrelated-historiesオプションを使用すればよい。このオプションはpullでも使える

1
2
3
4
5
$ git pull --allow-unrelated-histories origin master

# または以下2行
$ git fetch
$ git merge --allow-unrelated-histories origin/master

参考文献

https://git-scm.com/docs/git-merge