Gitの「fatal: refusing to merge unrelated histories」エラーの解決方法

beginner📦 Git2026-03-18| Git 2.9以降(Linux、macOS、Windows) — git merge、git pull、またはgit rebase実行時に発生

Error Message

fatal: refusing to merge unrelated histories
#git#merge#履歴#無関係な履歴

エラーの内容

git mergegit 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

Related Error Notes