リベースで無関係な履歴をマージすることをGitが拒否


2150

中にgit rebase origin/development次のエラーメッセージGitリポジトリから示されています:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

私のGitバージョンは2.9.0です。以前のバージョンでは正常に機能していました。

新しいリリースで強制フラグが導入された無関係な履歴を許可して、このリベースを継続するにはどうすればよいですか?


12
@Shishyaすべての敬意を払って、最も投票された回答はこの質問を直接解決するものではありません。質問はgit-rebase状況を尋ね、答えはフラグを立てるgit-merge
Shubham Chaudhary

13
@AsifMohammed は、受け入れられた回答の対象ではありません。投票によるデフォルトのソートにより、人々は自動的に最も投票数の多い回答を見つけます。
グロルフィンデル2017

2
他の誰かが同じ間違いをした場合、誤ってgit pull [repo URL]代わりに使用した後にこのエラーが発生しましたgit clone [repo URL]
rsoren


35
タイトルがこれがリベースのコンテキストにあることを指定していないという事実によってここで混乱が生じたので、あなたの質問は、さまざまなコンテキストでこのエラーが発生し、実際にはない回答を支持しているGoogle社員を引き寄せていますあなたが尋ねた質問に適用してください。現在、簡単にクリーンアップすることはできないため、一貫性のないQ&Aペアはサイトに残り、Google検索結果の上位に永久に残ります。ストーリーの教訓は、質問のタイトルが重要であることです!
Mark Amery 2017年

回答:


2616

Git 2.9以降、デフォルトの動作が変更されました。

「git merge」を使用して、デフォルトで共通のベースがない2つのブランチをマージできるようになりました。これにより、既存のプロジェクトの新しい履歴が作成され、疑いを持たないメンテナーによって引っ張られ、不要な並行履歴が既存のプロジェクトにマージされました。 。コマンドはデフォルトこれを許可しないように教えられており--allow-unrelated-histories、2つのプロジェクトの履歴を個別にマージするまれなイベントでエスケープハッチオプションが使用されます。

詳細については、Gitリリースの変更ログをご覧ください。

を使用--allow-unrelated-historiesして、マージを強制的に実行できます。


18
マージの変更を知っているが、このオプションはリベースでは機能しない
Shubham Chaudhary '21 / 06/21

3
--allow-unrelated-histories永久にオンになるオプションはありますか?
jmarceli 2016年

4
@jmarceli「このような「2つのプロジェクトのマージ」はまれなイベントであるため、このようなマージを常に許可する構成オプションは追加されません。」いいえ。
blue112 2016年

2
この方法で別のリポジトリのブランチをマージしようとしましたが、現在のブランチに新しいコミットが作成され、他のリポジトリの履歴は保持されませんでした。次に、他のリポジトリからローカルブランチをチェックアウトして、それをマージしたところ、突然通常のマージコミットが表示されました。変だ。
mgol 2016

13
素晴らしいgit pullです。その「独立して生活を始めた2つのプロジェクトの歴史を融合させたレアイベント」でした。git --work-tree="." pull --allow-unrelated-histories
ペトルザハリア2017

1189

私の場合、エラーはfatal: refusing to merge unrelated historiesすべての試行、特にGitリポジトリをリモートで追加した後の最初のプルリクエストで発生しました。

--allow-unrelated-historiesフラグの使用は、次のようにプルリクエストで機能しました。

git pull origin branchname --allow-unrelated-histories

232
README.mdを使用して新しいGithubリポジトリを作成するときに、初めてローカルリポジトリにプルすると、常にこのエラーが表示されます。とても迷惑。
Tien Do

29
新しいレポジトリの場合、最初にプルしgit cloneます。通常は、から始めるのが適切です。
傘:


2
これにより、数時間停止しましたが、デフォルトのファイルでこのようなファイルをマージするための明らかな解決策が必要であることに気づく前に、少なくともこの問題を抱えていたのは私だけではありません!
Zibbobz

3
私の場合、githubにライセンスファイルを追加したために発生しました。上記のコマンド(および以下のコマンドは同じ)が機能しました。
uudaddy

581

次のコマンドを試してください。

git pull origin master --allow-unrelated-histories

これで問題が解決するはずです。


266

最初にローカルリポジトリを設定したときに、このエラーが発生しました。次に、GitHubに移動して、新しいリポジトリを作成しました。それから私は走った

git remote add origin <repository url>

プッシュまたはプルしようとすると、fatal: unrelated_histories毎回同じエラーが発生しました。

修正方法は次のとおりです。

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

私たちは同じ船に乗っていたと思います。何かを追加するには:私の問題は、リモートリポジトリにすでに何かがあったことです。したがって、私のフォルダーでは、フォルダーを削除して.git実行git initし、マージ部分を除いて、Adithyaが言ったことを実行しました。
codepleb 2017

1
MacでINSERTボタンを押す方法は?実際には、コミットメッセージを入力してコマンドラインからマージする必要がありますが、コマンドラインから行う方法がわかりません。
Shajeel Afzal 2017

それはvimを開きますか?含まれている場合は、SHIFT +のみです
。– Adithya Bhat 2017

私は最初にGitHubリポジトリを作成し、リポジトリを追加するコマンドを実行していました。
Mr. Suryaa Jha

1
これは本当に良い答えです。ポイントは、プルを強制し、ローカルとリモートのリポジトリをマージする必要があることです。
alanwsx 2018年


135
git pull origin <branch> --allow-unrelated-histories

Vim編集ウィンドウが表示されます。

  • コミットメッセージを挿入
  • 次にEsc(「挿入」モードを終了するには)、次に:(コロン)、次にx(小さい「x」)を押し、最後にヒットEnterしてVimを終了します。
  • git push --set-upstream origin <branch>

5
Ctrl + Xを押してもVimから抜け出せません
Ruben

しかし:x<Enter>意志
webKnjaZ

101

私も同じ問題を抱えていました。これを試して:

git pull origin master --allow-unrelated-histories 

git push origin master

47

試す git pull --rebase development


これは私の問題を解決しました。これが問題の始まりです
ハーランネルソン

1
これはおそらく、次のようになりますgit pull --rebase=preserve --allow-unrelated-histories development
リッカルドMurri

3
@RiccardoMurri試してみたら、二度とやらないだろう。私の新しいリポジトリには、いくつかのサンプル初期化ファイルが含まれており、ローカルリポジトリの数か月分のコミットが必要です。これを(newOrigin branchではなくdevelopment)実行すると、ローカルブランチの先頭に最初のコミットが追加され、ほぼすべてが実質的に削除されます。新しいリモートからの最初のコミットを一番下にしたかったのです。
redOctober13 2018

42

Android StudioおよびIntelliJの場合:

まず、すべてをコミットし、競合を解決します。

次に、IDEの下からターミナルを開き、次のように入力します。

git pull origin master --allow-unrelated-histories

これでプッシュできます。


38

これにより、リモートリポジトリが上書きされる可能性があります。

これは私のために働きました:

git push origin master --force

1
しかし、実際にはローカルファイルとリモートファイルはどうなりますか?
Prathamesh More

私が知っていて経験したように、ローカルファイルはそのままです。特定のフォルダに追加したいリモートファイルが追加されます。
Aniket Patil

5
これを行わないでください!これにより、すべてのリモートファイルが上書きされます
Finomnis

このコマンドがmasterブランチのすべてのファイルを上書きするという免責事項を含めるだけです。私にとってはうまくいきました。ありがとう。
Flavio

1
動作しますが、かなり厳しいです。--allow-unrelad-historiesの方がより具体的で適切です
bdulac

32

他のすべての回答が実際に質問に回答しているわけではないため、関連する質問に対するこの回答から発想を得た解決策を次に示します。

だからあなたはあなたのエラーをやっていますgit rebase

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

このエラーは実際にはリベースをキャンセルしませんが、あなたは今その真ん中にいます:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

これで、手動でマージを実行できます。元のマージコミットの親コミットを見つけます。

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

2つのマージ親のうちどちらが現在の親(おそらく2番目の親、で確認するgit log 222222222)にマージされたものかを確認し、手動でマージを実行して、元のマージコミットのコミットメッセージをコピーします。

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

28

私も同じ問題を抱えていました。問題は、リモートがこれを妨げる何かを持っていたことです。

最初にローカルリポジトリを作成しました。私は追加LICENSEし、README.md私の地元とコミットにファイルを。

次に、リモートリポジトリが必要だったので、GitHubで作成しました。ここでは、「このリポジトリをREADMEで初期化する」のチェックを間違えたため、リモートにもREADME.mdが作成されました。

だから今走ったとき

git push --set-upstream origin master

私は得ました:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.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.

これを克服するために、私はやった

git pull origin master

以下のエラーが発生しました:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

私は試した:

git pull origin master --allow-unrelated-histories

結果:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

解決:

私はリモートリポジトリを削除し、新しいファイルを作成しました(ファイルを削除するだけで十分だったと思いますREADME)。その後、以下が機能しました:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

25
新しいリポジトリの作成は解決策ではありません
Zach

3
git pull origin master --allow-unrelated-historiesがうまく
いき

git push --force ... この特定のケースでは、ステップ1で適切な解決策になります
コンスタンチンペレペリン

2
これは解決策ではありません。あなたが初心者であればそれを行うことができますが、実際のプロジェクトで作業している場合は適切な方法で対処する必要があります。
Prathamesh More

27

これは通常、リモートリポジトリに初めてコミットしたときに発生します。エラーに「無関係な履歴のマージを拒否する」と明記されているため、-allow-unrelated-historiesフラグを使用する必要があります。

git pull origin master  --allow-unrelated-histories

これで、手動で解決する必要があるいくつかの競合が発生します。その後、コードをコミットしてプッシュします。


質問で述べたように、私はgit-pullではなくgit-rebaseを実行しようとしています。git-rebaseには--allow-unrelated-historiesフラグがありません。
Shubham Chaudhary

24

これが発生する可能性がある場合の2つの可能性-

  1. プロジェクトのクローンを作成し、どういうわけか.gitディレクトリが削除または破損しました。これにより、Gitはローカルの履歴を認識できなくなり、リモートリポジトリにプッシュまたはプルしようとすると、このエラーがスローされます。

  2. あなたは新しいリポジトリを作成し、それにいくつかのコミットを追加しました、そして今あなたはすでにそれ自身のいくつかのコミットを持っているリモートリポジトリからプルしようとしています。この場合、2つのプロジェクトがどのように関連しているかがわからないため、Gitはこの場合もエラーをスローします。

解決

git pull origin master --allow-unrelated-histories

参照-https ://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

私もこれに苦労しましたが、なんとか回避策を見つけることができました。

上記のエラーが発生した場合は、マージコミットをチェリーピックして、リベースを続行します。

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

3
飛行機で英語でお願いします?
エージェントゼブラ

@AgentZebra複素平面内の任意のディスクの連続した閉じた経路積分は0である
Addem

12

まず、次のコマンドを使用して、リモートの変更をローカルにプルします。

git pull origin branchname --allow-unrelated-histories

**私の場合、ブランチ名はマスターです。

プルコマンドが完了すると、競合が発生します。矛盾を解決する必要があります。Android Studioを使用して競合を解決しています。 ここに画像の説明を入力してください

競合が解決すると、マージが完了します!

これで安全にプッシュできます。


Resolve ConflictASでボタンを検索してきました。右下のポップアップ/バルーンが消えて、何もできない場合があります。ありがとう@oiyio
mochadwi


7

を実行するとgit pull、このメッセージが表示されましたfatal: refusing to merge unrelated histories と、しばらくの間ローカルコピーを更新していなかったrepoモジュールに対してされました。

このコマンドは、ローカルを元から更新するためだけに実行しました。私はリモートから最新のものを望んだだけで、ローカルの変更は必要ありませんでした。

git reset --hard origin/master

これは私の場合それを修正しました。


12
警告:これによりすべてのファイルが削除されました。何をしているかわからない場合は注意してください。
Salvi Pascual

2
保留中の変更がすべて削除されます!
Orestis P.


1

私は何年もリベースを使用していますが、そのような問題に遭遇したことはありません。ただし、最初の問題は、developmentリモートリポジトリからリモートブランチで直接実行しようとすることです。origin。リベースはgit履歴を再構築する危険なコマンドであるため、これは文字通り間違っています。とはいえ、期待どおりに機能する場合は、最初にローカルリポジトリを試してプッシュする必要があります。

したがって、私の通常のリベースワークフローは次のようになります(ただし、1つの委員会だけではないブランチでリベースを使用しないでください。そのようなブランチの場合は、必要に応じて、単にマージして競合を解決してください)。

  1. クリーンな作業ツリーがあることを確認してください(コミットされていない変更はありません)
  2. リベースするブランチにチェックアウトします(たとえば、master1行のコマンドとして; とします):git checkout master && git pull origin master && git checkout development
  3. 実際のリベースを実行します。 git rebase master
  4. それが完了し、すべてが期待どおりに機能する場合は、リモートにプッシュします。そのためには、リモートホストがすでに別の順序で履歴を持っているので、それを強制する必要があります。リモートはプッシュするものなしで応答します。したがって、「ローカルバージョンの履歴は正しいです。ローカルバージョンの履歴を使用して、リモートブランチのすべてを上書きします」と言う必要があります。git push -f origin development

すでに述べたように、リベースはgitの履歴を操作することに注意してください。これは通常、悪いことです。ただし、他の誰もコミットしないブランチでそれを行うことは可能です。他の開発者がブランチをプル可能な状態に保つには、マージ自体、スカッシュ、チェリーピックなどの別のマージ戦略を使用します。つまり、言い換えれば、リベースは分散開発のツールであってはなりません。このリポジトリで作業するのがあなただけの場合、問題なく機能します。

機能分岐戦略を使用します。この場合、私は通常、他の開発者からの「アップデート」を取得するためにrebaseを使用しますが、それはその間にmasterブランチで行われました。そうすることで、プルリクエストに表示されるコミットのサイズが小さくなります。したがって、この機能ブランチで行った変更をコードレビュー担当者が簡単に確認できるようになります。


この場合、私は実際にはリベースを続行したかったのですが、答えはそれを扱っていません。リベースのリスクと、git-rebaseを使用する必要がある場合と使用しない場合を知っています。これはgitワークフローの一般的な(意見)ガイドラインであり、質問に直接回答するものではありません。何年にもわたってrebaseを使用する限り、この特定のエラーはgit v2.9.0で追加され、フローはそのリリース以前は正常に機能していました。この回答でここに投稿したものは、stackoverflow.com / a
11566503/2670370
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.