Git weigert sich, nicht verwandte Historien bei Rebase zusammenzuführen


2149

Während git rebase origin/developmentder folgenden Fehlermeldung wird von Git angezeigt:

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

Meine Git-Version ist 2.9.0. In der vorherigen Version funktionierte es einwandfrei.

Wie kann ich diese Rebase fortsetzen und nicht verwandte Historien mit der in der neuen Version eingeführten erzwungenen Flagge zulassen?


12
@ Shishya Bei allem Respekt löst die am häufigsten gewählte Antwort diese Frage nicht direkt. Die Frage fragt nach der git-rebaseSituation, während die Antwort eine Flagge fürgit-merge
Shubham Chaudhary

13
@AsifMohammed das ist nicht das, wofür eine akzeptierte Antwort ist. Die Menschen werden automatisch die Antwort mit den meisten Stimmen wegen des nach Stimmen Sortierung Standard finden.
Glorfindel

2
Für den Fall, dass jemand anderes den gleichen Fehler gemacht hat, habe ich diesen Fehler erhalten, nachdem ich versehentlich git pull [repo URL]anstelle vongit clone [repo URL]
rsoren


35
Ein Durcheinander wurde hier durch die Tatsache verursacht, dass der Titel nicht angibt, dass dies im Zusammenhang mit einer Rebase steht. Ihre Frage bezieht sich also auf Googler, die diesen Fehler in verschiedenen Kontexten erhalten, und stimmt eine Antwort ab, die dies tatsächlich nicht tut Bewerben Sie sich auf die Frage, die Sie gestellt haben. Es kann jetzt nicht einfach bereinigt werden, sodass das inkohärente Q & A-Paar für immer auf der Website und in den Google-Suchergebnissen hoch bleibt. Die Moral der Geschichte ist, dass Fragetitel wichtig sind!
Mark Amery

Antworten:


2614

Das Standardverhalten hat sich seit Git 2.9 geändert:

"git merge" ermöglichte das Zusammenführen von zwei Zweigen, die standardmäßig keine gemeinsame Basis haben. Dies führte dazu, dass ein brandneuer Verlauf eines vorhandenen Projekts erstellt und dann von einem ahnungslosen Betreuer abgerufen wurde, wodurch ein unnötiger paralleler Verlauf in das vorhandene Projekt eingefügt werden konnte . Dem Befehl wurde beigebracht , dies standardmäßig nicht zuzulassen.--allow-unrelated-histories In einem seltenen Fall wird eine Escape-Luke- Option verwendet, bei der die Historien zweier Projekte zusammengeführt werden, die ihr Leben unabhängig voneinander begonnen haben.

Weitere Informationen finden Sie im Git-Release-Änderungsprotokoll .

Sie können verwenden --allow-unrelated-histories, um die Zusammenführung zu erzwingen.


18
Kennen Sie die Änderung der Zusammenführung, aber diese Option funktioniert nicht mit Rebase
Shubham Chaudhary

3
Gibt es eine Option, die --allow-unrelated-historiesdauerhaft aktiviert wird ?
Jmarceli

4
@jmarceli "Da eine solche" Zusammenführung von zwei Projekten "ein seltenes Ereignis ist, wird keine Konfigurationsoption hinzugefügt, um eine solche Zusammenführung immer zuzulassen." Also nein.
blue112

2
Ich habe auf diese Weise versucht, einen Zweig für ein anderes Repo zusammenzuführen, aber es wurde ein neues Commit für meinen aktuellen Zweig erstellt und der Verlauf des anderen Repos wurde nicht beibehalten. Dann habe ich einen lokalen Zweig aus dem anderen Repo ausgecheckt und erst dann zusammengeführt, und plötzlich erschien ein normales Zusammenführungs-Commit. Seltsam.
mgol

13
Hervorragend, funktioniert auch mit git pull. War in diesem "seltenen Ereignis, das die Geschichte zweier Projekte zusammenführt, die ihr Leben unabhängig voneinander begonnen haben". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia

1189

In meinem Fall trat der Fehler nur fatal: refusing to merge unrelated historiesbei jedem Versuch auf, insbesondere bei der ersten Pull-Anforderung nach dem Remote-Hinzufügen eines Git-Repositorys.

Die Verwendung des --allow-unrelated-historiesFlags funktionierte mit einer Pull-Anfrage folgendermaßen:

git pull origin branchname --allow-unrelated-histories

231
Ich sehe diesen Fehler immer, wenn ich beim Erstellen eines neuen Github-Repositorys mit einer README.md es beim ersten Mal in ein lokales Repository ziehe. So nervig.
Tien Do

29
Bei neuen Repos ist es in der Regel besser, mit einem zu beginnen git clone.
Regenschirm

3
adi

2
Dies hielt mich für einige Stunden an, bevor mir klar wurde, dass es eine offensichtliche Lösung für das Zusammenführen solcher Dateien geben musste, wenn es für Standarddateien auftritt - ich bin froh, dass ich nicht der einzige bin, der zumindest dieses Problem hatte!
Zibbobz

3
In meinem Fall ist es passiert, weil ich eine Lizenzdatei bei github hinzugefügt habe. Der oben erwähnte Befehl (und unten sind sie gleich) hat funktioniert.
Uudaddy

580

Versuchen Sie den folgenden Befehl:

git pull origin master --allow-unrelated-histories

Dies sollte Ihr Problem lösen.


265

Ich habe diesen Fehler erhalten, als ich zuerst ein lokales Repository eingerichtet habe. Dann bin ich zu GitHub gegangen und habe ein neues Repository erstellt. Dann rannte ich

git remote add origin <repository url>

Wenn ich versuchte zu drücken oder zu ziehen, bekam ich fatal: unrelated_historiesjedes Mal den gleichen Fehler.

So habe ich es behoben:

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

Ich denke wir waren im selben Boot. Um etwas hinzuzufügen: Mein Problem war, dass sich bereits etwas auf dem Remote-Repo befand. In meinem Ordner wurde der .gitOrdner gelöscht , ausgeführt git initund das getan, was Adithya gesagt hat, mit Ausnahme des Zusammenführungsteils.
Codepleb

1
Wie drücke ich die INSERT-Taste auf dem Mac? Eigentlich muss ich die Commit-Nachricht eingeben und über die Befehlszeile zusammenführen, aber ich weiß nicht, wie ich das über die Befehlszeile machen soll.
Shajeel Afzal

Öffnet es vim? Wenn ja, ist es nur SHIFT +:
Adithya Bhat

Sogar ich hatte zuerst das GitHub-Repo erstellt und ging diese Befehle zum Hinzufügen des Repos durch.
Herr Suryaa Jha

1
Das ist eine wirklich gute Antwort. Der Punkt ist, dass Sie das Ziehen erzwingen und dann das lokale und das entfernte Repo zusammenführen müssen.
Alanwsx


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

Sie werden zu einem Vim-Bearbeitungsfenster weitergeleitet:

  • Commit-Nachricht einfügen
  • Drücken Sie dann Esc(um den "Einfügen" -Modus zu verlassen), dann :(Doppelpunkt), dann x(kleines "x") und drücken Sie schließlich Enter, um Vim zu verlassen
  • git push --set-upstream origin <branch>

5
Strg + X bringt dich nicht aus Vim
Ruben

aber :x<Enter>wird
webKnjaZ

101

Ich hatte das gleiche Problem. Versuche dies:

git pull origin master --allow-unrelated-histories 

git push origin master

47

Versuchen git pull --rebase development


Dies löste mein Problem. Hier ist, wie das Problem begann
Harlan Nelson

1
Dies sollte wahrscheinlich sein:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri

3
@ RiccardoMurri Nachdem ich das gerade versucht habe, würde ich das nicht wieder tun. Mein neues Repo enthielt einige Beispielinitialisierungsdateien und Commits für meine lokalen Repo-Monate. Wenn Sie dies ausführen (mit newOrigin branchanstatt development), wird das anfängliche Commit oben in meinem lokalen Zweig hinzugefügt, wodurch fast alles effektiv entfernt wird. Ich wollte, dass das anfängliche Commit von der neuen Fernbedienung ganz unten ist.
RedOctober13

42

Für Android Studio und IntelliJ:

Zuerst verpflichten alles und Konflikte zu lösen.

Öffnen Sie dann das Terminal von unten in der IDE und geben Sie Folgendes ein:

git pull origin master --allow-unrelated-histories

Jetzt können Sie schieben.


38

WARNUNG DIESES ÜBERSCHREIBT DAS REMOTE-REPOSITORY möglicherweise

Das hat bei mir funktioniert:

git push origin master --force

1
Aber was passiert eigentlich mit lokalen und entfernten Dateien?
Prathamesh More

Nach meinem Wissen und meiner Erfahrung sind lokale Dateien intakt. Remote-Dateien, die Sie in einem bestimmten Ordner hinzufügen möchten, werden hinzugefügt.
Aniket Patil

5
Tu das nicht! Dadurch werden alle Remote-Dateien überschrieben .
Finomnis

Fügen Sie einfach einen Haftungsausschluss hinzu, dass dieser Befehl alle Dateien im Hauptzweig überschreibt . Hat gut für mich funktioniert. Vielen Dank.
Flavio

1
Es funktioniert, ist aber ziemlich hart, die - Allow-Unradad-Geschichten sind spezifischer und angemessener
Bdulac

32

Da alle anderen Antworten die Frage nicht beantworten, finden Sie hier eine Lösung, die von dieser Antwort inspiriert ist auf eine verwandte Frage .

So bekommen Sie Ihren Fehler zu tun git rebase:

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

Dieser Fehler bricht die Rebase nicht ab, aber Sie befinden sich jetzt in der Mitte:

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

Sie können die Zusammenführung jetzt von Hand durchführen. Finden Sie die übergeordneten Commits des ursprünglichen Merge-Commits heraus:

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

    test merge commit

Finden Sie heraus, welches der beiden Eltern zum Zusammenführen mit dem aktuellen zusammengeführt wurde (wahrscheinlich das zweite, überprüfen Sie mit git log 222222222), und führen Sie die Zusammenführung von Hand durch, indem Sie die Festschreibungsnachricht des ursprünglichen Zusammenführungs-Festschreibens kopieren:

$ 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

Ich hatte das gleiche Problem. Das Problem ist, dass Remote dies verhindert hat.

Ich habe zuerst ein lokales Repository erstellt. Ich habe ein LICENSEund hinzugefügtREADME.md -Datei zu meiner lokalen und festgeschriebenen Datei .

Dann wollte ich ein Remote-Repository, also habe ich eines auf GitHub erstellt. Hier habe ich einen Fehler gemacht, als ich "Dieses Repository mit einer README-Datei initialisieren" aktiviert habe. aktiviert habe, wodurch auch in remote eine README.md erstellt wurde.

Also jetzt, als ich rannte

git push --set-upstream origin master

Ich habe:

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.

Um dies zu überwinden, habe ich es getan

git pull origin master

Was zu dem folgenden Fehler führte:

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

Ich habe es versucht:

git pull origin master --allow-unrelated-histories

Ergebnis:

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.

Lösung:

Ich habe das Remote-Repository entfernt und ein neues erstellt (ich glaube, nur das Entfernen von Dateien READMEhätte funktionieren können). Danach hat Folgendes funktioniert:

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

25
Das Erstellen eines neuen Repositorys ist keine Lösung
Zach

3
Git Pull Origin Master - Allow-Un-Related-Histories arbeiteten für mich .. Danke
SKalariya

git push --force ... wäre in diesem speziellen Fall eine richtige Lösung für Schritt 1
Konstantin Pelepelin

2
Dies ist keine Lösung. Wenn Sie Anfänger sind, können Sie das tun, aber wenn Sie mit einigen realen Projekten arbeiten, sollten Sie mit dem richtigen Weg umgehen müssen.
Prathamesh More

27

Dies geschieht normalerweise, wenn Sie das Remote-Repository zum ersten Mal festschreiben. Da der Fehler eindeutig besagt, dass "das Zusammenführen nicht verwandter Historien verweigert wird", müssen wir das Flag --allow-non-related-histories verwenden.

git pull origin master  --allow-unrelated-histories

Jetzt würde es einige Konflikte geben, die wir manuell lösen müssen. Danach schreiben Sie einfach den Code fest und drücken ihn.


Wie in der Frage erwähnt, versuche ich, eine Git-Rebase und keine Git-Pull durchzuführen. Git-Rebase hat nicht die --allow-unrelated-historiesFlagge.
Shubham Chaudhary

24

Zwei Möglichkeiten, wenn dies passieren kann -

  1. Sie haben ein Projekt geklont und irgendwie wurde das .git-Verzeichnis gelöscht oder beschädigt. Dies führt dazu, dass Git Ihre lokale Historie nicht kennt und daher diesen Fehler auslöst, wenn Sie versuchen, in das Remote-Repository zu pushen oder daraus zu ziehen.

  2. Sie haben ein neues Repository erstellt, einige Commits hinzugefügt und versuchen nun, aus einem Remote-Repository zu ziehen, das bereits einige eigene Commits enthält. Git wird in diesem Fall auch den Fehler auslösen, da es keine Ahnung hat, wie die beiden Projekte zusammenhängen.

LÖSUNG

Git Pull Origin Master - Allow-Un-Related-Histories

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


12

Ich hatte auch damit zu kämpfen, aber es gelang mir, eine Problemumgehung zu finden.

Wenn Sie auf den obigen Fehler stoßen, wählen Sie einfach das Merge-Commit aus und setzen Sie die Rebase fort:

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

3
Im Flugzeug Englisch bitte?
Agent Zebra

@AgentZebra Für jede Scheibe in der komplexen Ebene ist ein kontinuierliches geschlossenes Pfadintegral 0.
Addem

12

Ziehen Sie zunächst die Remote-Änderungen mit dem folgenden Befehl auf Ihr lokales Verzeichnis:

git pull origin branchname --allow-unrelated-histories

** Filialname ist in meinem Fall Master.

Wenn der Pull-Befehl ausgeführt wird, tritt ein Konflikt auf. Sie sollten die Konflikte lösen. Ich benutze Android Studio, um Konflikte zu lösen. Geben Sie hier die Bildbeschreibung ein

Wenn Konflikte gelöst sind, erfolgt die Zusammenführung!

Jetzt können Sie sicher schieben.


Ich habe nach der Schaltfläche Resolve Conflictin AS gesucht . Manchmal verschwindet das Popup / der Ballon unten rechts und ich kann nichts tun. Danke @oiyio
mochadwi


7

Beim a git pullerhielt ich diese Nachricht fatal: refusing to merge unrelated histories für ein Repo-Modul, bei dem ich die lokale Kopie eine Weile nicht aktualisiert hatte.

Ich habe diesen Befehl nur ausgeführt, um den lokalen Ursprung zu aktualisieren. Ich wollte nur das Neueste von der Fernbedienung und brauchte keine lokalen Änderungen.

git reset --hard origin/master

Dies hat es in meinem Fall behoben.


12
WARNUNG: Dadurch wurden ALLE meine Dateien gelöscht. Seien Sie vorsichtig, wenn Sie nicht wissen, was Sie tun!
Salvi Pascual

2
Dadurch werden alle ausstehenden Änderungen gelöscht!
Orestis P.

1

Ich benutze die Rebase seit Jahren und war noch nie auf ein solches Problem gestoßen. Ihr erstes Problem ist jedoch, dass Sie versuchen, dies direkt auf dem Remote-Zweig developmentdes Remote-Repositorys zu tun origin. Das ist buchstäblich falsch, weil Rebase ein gefährlicher Befehl ist, der die Git-Geschichte umstrukturiert. Allerdings sollten Sie zuerst Ihr lokales Repository anprobieren und es nur pushen, wenn es für Sie wie erwartet funktioniert.

Mein üblicher Rebase-Workflow sieht also folgendermaßen aus (bitte beachten Sie jedoch, dass Sie Rebase nicht für Zweige verwenden sollten, die nicht das einzige Komitee sind. Verwenden Sie für solche Zweige ggf. einfach Zusammenführen und Lösen von Konflikten):

  1. Stellen Sie sicher, dass Sie einen sauberen Arbeitsbaum haben (keine unverbindlichen Änderungen).
  2. Kasse zu dem Zweig, auf den Sie neu aufbauen möchten (zum Beispiel masterals einzeiliger Befehl):git checkout master && git pull origin master && git checkout development
  3. Führen Sie die eigentliche Rebase durch: git rebase master
  4. Wenn es fertig ist und alles wie erwartet funktioniert, schieben Sie es auf Ihre Fernbedienung. Dazu müssen Sie es erzwingen, da der Remote-Host den Verlauf bereits in einer anderen Reihenfolge hat, würde die Remote mit nichts zu pushen antworten. Wir müssen also sagen: "Meine lokale Version des Verlaufs ist korrekt. Überschreiben Sie alles in diesem Remote-Zweig mit meiner lokalen Version des Verlaufs."git push -f origin development

Wie ich bereits erwähnt habe, denken Sie daran, dass Rebase die Git-Geschichte manipuliert, was normalerweise eine schlechte Sache ist. Dies ist jedoch in Filialen möglich, zu denen sich sonst niemand verpflichtet. Verwenden Sie eine andere Zusammenführungsstrategie wie Zusammenführen selbst, Squash oder Cherrypick, um den Zweig für die anderen Entwickler abziehbar zu halten. Mit anderen Worten: Rebase sollte nicht Ihr Werkzeug für die verteilte Entwicklung sein. Es funktioniert gut für Sie, wenn Sie der einzige sind, der an diesem Repository arbeitet.

Wir verwenden die Feature-Branch-Strategie. In diesem Fall verwende ich normalerweise rebase, um die "Updates" von den anderen Entwicklern zu erhalten, die in der Zwischenzeit im Master-Zweig aufgetreten sind. Auf diese Weise wird die Größe der Commits reduziert, die in einer Pull-Anforderung sichtbar sind. Daher erleichtert es dem Code-Prüfer, meine in diesem Feature-Zweig vorgenommenen Änderungen zu sehen.


In diesem Fall wollte ich eigentlich mit der Rebase fortfahren und die Antwort spricht das nicht an. Ich kenne die Risiken einer Neubasierung und wann ich Git-Rebase verwenden sollte und wann nicht. Dies ist eine allgemeine (meinungsgebundene) Richtlinie für den Git-Workflow und beantwortet die Frage nicht direkt. In Bezug auf die jahrelange Verwendung von Rebase wurde dieser spezielle Fehler in Version 2.9.0 von Git hinzugefügt, und der Fluss funktionierte vor dieser Version einwandfrei. Was Sie in dieser Antwort hier gepostet haben, wird bereits in viel älteren Fragen wie stackoverflow.com/a/11566503/2670370 und git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.