エラーの内容
git mergeやgit pullを実行すると、以下のエラーが表示されます:
fatal: refusing to merge unrelated histories
2つのブランチに共通のコミット祖先が存在しない場合、つまり履歴が完全に別々の系統となっている場合に発生します。Git 2.9でこの安全チェックが追加されたのは、無関係なプロジェクトを誤ってマージしてしまうのを防ぐためです。
発生するケース
- ローカルで
git initを実行した後、すでにコミットが存在するリモート(例:READMEで初期化されたGitHubリポジトリ)を追加した場合 - 2つの別々のリポジトリを意図的にマージしようとしている場合
- 片方の
.git履歴が削除されて再初期化された場合 - シャロークローンしたリポジトリをフルリポジトリとマージしようとしている場合
修正方法1:関連しない履歴のマージを許可する(最も一般的)
--allow-unrelated-historiesフラグを渡すだけです。これにより、状況を理解した上で続行することをGitに伝えます:
# git merge実行時にエラーが発生した場合
git merge origin/main --allow-unrelated-histories
# git pull実行時にエラーが発生した場合
git pull origin main --allow-unrelated-histories
Gitがマージコミットメッセージの入力のために設定済みのエディタを開きます。保存して閉じると完了です。
リモートではなくローカルブランチをマージする場合も同じフラグを使います:
git merge feature-branch --allow-unrelated-histories
修正方法2:関連しない履歴をリベースする
マージコミットを作らずに線形な履歴を保ちたい場合は、rebaseを使います:
git rebase origin/main --allow-unrelated-histories
注意点として、rebaseはコミットハッシュを書き換えます。チームメンバーがすでにプルしている共有ブランチには使用しないでください — 全員に混乱を招くことになります。
修正方法3:「新規ローカルリポジトリ+既存リモート」のシナリオ
ほとんどの場合、このシナリオが原因です:git initを実行していくつかコミットした後、READMEやLICENSEがすでに含まれているGitHubリポジトリからプルしようとしたケースです。
# ステップ1:リモートを追加(まだの場合)
git remote add origin https://github.com/username/repo.git
# ステップ2:リモートの参照をフェッチ
git fetch origin
# ステップ3:関連しない履歴を許可してマージ
git merge origin/main --allow-unrelated-histories
# ステップ4:統合した履歴をプッシュ
git push -u origin main
修正方法4:2つの別々のリポジトリをマージする
2つのリポジトリをモノレポ形式で1つに統合する場合は、2つ目のリポジトリをリモートとして追加し、取り込んだ後に整理します:
# ターゲットリポジトリで、もう一方のリポジトリをリモートとして追加
git remote add other-repo https://github.com/username/other-repo.git
git fetch other-repo
# マージする
git merge other-repo/main --allow-unrelated-histories
# リモート参照を削除
git remote remove other-repo
整理しやすくするために、インポートしたファイルをすぐにサブディレクトリに移動しましょう:
mkdir imported-project
git mv file1.txt file2.txt imported-project/
git commit -m "インポートしたファイルをサブディレクトリに移動"
修正の確認
以下の2つのコマンドで正しく完了したか確認します:
# マージコミットがログに表示されることを確認
git log --oneline --graph --all
# ワーキングツリーがクリーンであることを確認
git status
ログの先頭に、両方の履歴を結ぶマージコミットが表示されるはずです。git statusを実行すると、クリーンなワーキングツリー(または予定していたコミット前の変更のみ)が表示されるはずです。
上流で問題がないことを確認するためにプッシュしましょう:
git push origin main
予防策
根本的な原因は常に同じです:両方の側が独立したコミットから始まっていること。これを避ければ、このエラーは発生しません。
- リモートリポジトリは空の状態で作成する — GitHubやGitLabで「READMEでこのリポジトリを初期化する」のチェックを外します。最初の
git pushがそのまま成功します。 - まずクローンしてからファイルを追加する —
git initをスキップし、リモートリポジトリをクローンしてそのディレクトリにファイルを配置します。 - ローカルでinitする必要がある場合 — ローカルコミットを作成する前に、リモートを追加してフェッチし、マージを行います。
# 既存のリモートで新規スタートする際の安全なワークフロー
git clone https://github.com/username/repo.git
cd repo
# ここにプロジェクトファイルを追加
git add .
git commit -m "プロジェクトファイルの初期コミット"
git push

