「fatal: refusing to merge unrelated histories」の原因と解決法
Gitで「fatal: refusing to merge unrelated histories」が発生する原因とその具体的な対処法を解説します。初回のpullで履歴が一致しないケースなど、初心者がよく直面するトラブルをわかりやすく整理。
このエラーはなぜ起こる?
fatal: refusing to merge unrelated histories
は、Gitで git pull
を実行した際にローカルとリモートの履歴が全く異なる場合に発生します。つまり、履歴に共通の祖先(共通コミット)が存在しない状態でマージしようとすると、Gitは自動的な統合を拒否します。
よくある原因
1. ローカルとリモートが別々に初期化されている
- ローカルで
を行って開発を始めたが、その後 GitHub に新しく作成したリポジトリにpushしようとしたgit init
- GitHub上にはREADMEやLICENSEなどが既に含まれている
2. GitHubのテンプレート機能を使って初期化された
- 自動生成されたコミットが最初に存在するため、ローカルとの接点がない
3. 別のプロジェクトを間違って上書きしようとした
- 無関係な履歴を持つリポジトリ同士を統合しようとした
解決方法:--allow-unrelated-historiesオプションを使う
git pull origin main --allow-unrelated-histories
このオプションを付けることで、Gitは「別々の履歴でも強制的にマージしてもよい」と認識し、マージ処理が実行されます。
マージ後に競合が発生した場合
このエラーの後にマージが成功しても、ファイルの内容が競合する場合は、以下のようなマージマーカーが表示されます:
<<<<<<< HEAD あなたの変更 ======= リモートの変更 >>>>>>> origin/main
解決手順
- 手動でどちらの変更を残すか選択し、ファイルを修正
- 修正したファイルをステージング
git add ファイル名
- マージ完了のコミット
git commit
回避策とベストプラクティス
- 初回pushの前に、GitHubのリポジトリを空(READMEなし)で作成する
- 既存のREADME等がある場合は、ローカルでもcloneしてから開発を始める
で接続したあと、最初のpullでこのエラーが出たら落ち着いてオプション付きで実行git remote add origin
まとめ
「fatal: refusing to merge unrelated histories」は、ローカルとリモートの履歴がつながっていない状態でマージしようとすると発生します。エラーが出たら慌てず、
--allow-unrelated-histories
を使ってマージし、必要に応じて競合を手動で解決しましょう。
編集部