問題の導入
Git を使用しているときに、次のエラー メッセージが表示される場合があります。
fatal: refusing to merge unrelated histories
このエラーは通常、無関係な 2 つの Git リポジトリ履歴をマージしようとしたときに発生します。この記事では、このエラーが発生する原因と解決方法について詳しく説明します。
問題分析
このエラーの根本原因は、無関係な 2 つのリポジトリの履歴が相互にどのように関連しているかを Git が判断できないことです。Git は、コミットのグラフを構築するために、履歴を通じて各コミットの親コミットを追跡します。共通の祖先を持たない 2 つの履歴をマージしようとすると、Git はそれらが無関係であると見なすため、デフォルトでマージを拒否します。
これは通常、次の場合に発生します。
-
新しいローカル リポジトリを作成していくつかのコミットを作成し、それをリモート リポジトリとマージしようとしましたが、リモート リポジトリにはすでに独自のコミット履歴もありました。
-
プロジェクトは別のリポジトリから複製されましたが、2 つのリポジトリは履歴を共有していませんでした。
解決
「致命的: 無関係な履歴のマージを拒否する」エラーを解決するには、次の方法があります。
--allow-unrelated-histories
ロゴ
フラグを使用すると、--allow-unrelated-histories
無関係な履歴をマージできます。これは問題を解決する簡単な方法ですが、2 つの異なる履歴を新しい共通の履歴にマージするため、使用には注意が必要です。
git pull origin master --allow-unrelated-histories
これにより競合が発生する可能性があり、再送信する前にこれらの競合を解決する必要があることに注意してください。
- 新しいブランチを作成する
無関係な 2 つの履歴を混在させたくない場合は、新しいブランチを作成し、リモート リポジトリの内容をそのブランチにマージできます。
# 创建新分支
git checkout -b new-branch
# 拉取远程仓库内容并合并到新分支
git pull origin master
# 提交更改
git commit -m "Merge remote branch into new branch"
# 推送到远程仓库
git push origin new-branch
- リポジトリを再クローンする
2 つのリポジトリの履歴がまったく無関係で、それらをマージしたくない場合は、クリーンなリポジトリを再クローンできます。これにより、無関係な履歴のない、まったく新しいローカル リポジトリが作成されます。
# 删除当前仓库目录
rm -rf your-repo-directory
# 重新克隆远程仓库
git clone <repository-url>
- 履歴のマージと書き換え (慎重に使用してください)
2 つのリポジトリの履歴をマージする必要があると判断した場合は、--allow-unrelated-histories
フラグを使用してマージし、 --rebase オプションを使用して履歴を書き換えて、クリーンなマージ履歴を作成できます。
# 拉取远程仓库内容并合并并重写历史
git pull origin master --rebase=interactive --allow-unrelated-histories
# 解决任何冲突并继续重写历史
# 提交更改
git commit -m "Merge and rewrite history"
# 推送到远程仓库
git push origin master
この方法は履歴を書き換える可能性があるため、特に複数人での共同プロジェクトでは注意して使用してください。
要約する
fatal: refusing to merge unrelated histories
このエラーは通常、無関係な Git 履歴をマージしようとしたことが原因で発生します。ニーズに応じて、この問題は上記のさまざまなソリューションを使用して処理できます。--allow-uncategorized-histories オプションと --rebase オプションは、プロジェクトの整合性を損なわないように注意して使用してください。最終的なソリューションはプロジェクトのニーズと履歴によって異なります。