Wie füge ich Remote-Änderungen bei GitHub zusammen?


137

Ich erhalte folgenden Fehler, wenn ich den ersten Github-Push versuche:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

Wie kann ich das beheben und Remote-Änderungen zusammenführen?

Antworten:


106

Weitere Informationen finden Sie im Abschnitt "Nicht schneller Vorlauf" von " git push --help ".

Sie können "Git Pull" ausführen, potenzielle Konflikte lösen und das Ergebnis "Git Push". Ein "Git Pull" erzeugt ein Zusammenführungs-Commit C zwischen den Commits A und B.

Alternativ können Sie Ihren Wechsel zwischen X und B über A mit "git pull --rebase" neu begründen und das Ergebnis zurückschieben. Die Rebase erstellt ein neues Commit D, das den Wechsel zwischen X und B über A erstellt.


16
Ich stoße immer wieder darauf, außer dass mir bei einem "Git Pull" gesagt wird, dass ich bereits auf dem neuesten Stand bin. und wenn ich eine "git pull --rebase" mache, wird mir gesagt, dass "der aktuelle Zweigstellenmaster auf dem neuesten Stand ist". Irgendwelche Ideen? Vielen Dank!
JWL

3
@ larson4 Ich habe das gleiche Problem, aber nachdem Sie das tun git pull, machen Sie ein anderes Commit und dann sollte es gut sein
Patrick

20
@Patrick @larson Ich hatte ein ähnliches Problem, das dadurch verursacht wurde, dass ich die Fehlermeldung nicht sorgfältig gelesen habe. Die Ablehnung erfolgte in einem Zweig, den ich nicht ausgecheckt hatte. Der Zweig, in dem ich tatsächlich war, war erfolgreich. Die Lösung war zu git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier

86

Sie können einen Push auch erzwingen, indem Sie das Symbol + vor Ihrem Filialnamen einfügen.

git push origin +some_branch

1
Danke, dieser funktioniert für mich. Die anderen Lösungen würden die Wirkung von mygit reset --hard
Oli

1
Vielen Dank! Ich hatte Zweig "A" auf meine Heroku-Staging-App verschoben, um einige Funktionen in einer Produktionsumgebung zu testen. Dann (lokal) habe ich "A" und "B" zu "Master" zusammengeführt und wollte "Master" in meine Staging-App verschieben. Hatte alle möglichen Probleme. Dies machte das Schieben des "Meisters" sehr einfach. Vielen Dank!
Don Leatham

Hat auch für mich gearbeitet. Ich habe 4 Stunden gebraucht, um das Problem zu finden. Vielen Dank. Ich starte Netbeans auf einem lokalen Computer (Windows 7) und wollte bei jedem Push auf einem lokalen Computer auf einem Remote-Computer (Linux) auschecken.
Maxim Shoustin

Beachten Sie, dass diese Methode möglicherweise nicht sicher ist und dazu führen kann, dass einige unterschiedliche Commits nicht erreichbar sind.
Samuil

Dies sollte die akzeptierte Lösung sein. Die anderen Lösungen funktionierten nicht für mich
Banarun

20

Sie haben wahrscheinlich Änderungen an Github, die Sie nie zusammengeführt haben. Versuchen Sie git pull, die Änderungen abzurufen und zusammenzuführen, dann sollten Sie in der Lage sein, zu pushen. Entschuldigung, wenn ich Ihre Frage falsch verstanden habe.


18
Wenn

13

Wenn Sie "git pull" und "Bereits auf dem neuesten Stand" anzeigen und trotzdem diesen Fehler erhalten, liegt dies möglicherweise daran, dass einer Ihrer anderen Zweige nicht auf dem neuesten Stand ist. Versuchen Sie, zu einem anderen Zweig zu wechseln, und stellen Sie sicher, dass auch einer auf dem neuesten Stand ist, bevor Sie erneut versuchen, "git push" auszuführen:

Wechseln Sie zu Zweig "foo" und aktualisieren Sie ihn:

$ git checkout foo
$ git pull

Sie können die Zweige sehen, die Sie haben, indem Sie den folgenden Befehl eingeben:

$ git branch

Können Sie erklären, warum dies funktioniert und notwendig ist? (Es hat mein Problem gelöst.) Es scheint mir nur kontraintuitiv zu sein. Ich verstehe nicht, warum Git einen anderen Zweig benötigt, um auf dem neuesten Stand zu sein, damit ich den Hauptzweig weiterführen kann.
Quinxy von Besiex

@QuinxyvonBesiex Ich bin nicht sicher, ob ich es selbst verstehe. Es kann etwas mit der zugrunde liegenden Struktur von Git selbst und der Organisation von Zweigen zu tun haben (die meines Wissens im Grunde genommen mit Tags identisch sind).
David Calhoun

7

Sie können es zwingen, zu drücken, aber bitte tun Sie dies NUR, wenn Sie ganz sicher sind, was Sie tun.

Der Befehl lautet:

git push -f 

3

Dieses Problem kann auch auftreten, wenn Sie widersprüchliche Tags haben. Wenn Ihre lokale Version und Ihre Remote-Version denselben Tag-Namen für unterschiedliche Commits verwenden, können Sie hier landen.

Sie können es lösen, indem Sie das lokale Tag löschen:

$ git tag --delete foo_tag

2

Als ich diesen Fehler bekam, habe ich meinen gesamten Projektordner gesichert. Dann habe ich so etwas gemacht

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... abhängig von Ihrem Filialnamen (wenn es nicht Master ist).

Dann habe ich getan git pull --rebase. Danach habe ich die gezogenen Dateien durch die Dateien meines gesicherten Projekts ersetzt. Jetzt bin ich bereit, meine Änderungen erneut zu übernehmen und zu pushen.


0

1) Erzwingen eines Pulls, um lokale Änderungen zu überschreiben

Wenn Sie sich nicht für die lokal vorgenommenen Änderungen interessieren und den Code aus dem Repository abrufen möchten, können Sie einen Pull erzwingen. Dadurch werden alle auf Ihrem Computer vorgenommenen lokalen Änderungen überschrieben. Eine Kopie der Version im Repository wird angezeigt.

Führen Sie die folgenden Befehle in Ihrer IDE aus:

Git Reset - schwer

Git Pull

Dadurch werden alle Ihre lokalen Änderungen sofort zerstört. Stellen Sie daher sicher, dass Sie wissen, was Sie tun, und dass Sie Ihre lokalen Änderungen nicht benötigen.

2) Beibehaltung beider Änderungen (lokal und vom Repo)

Wenn Sie beide Änderungen beibehalten möchten (lokal vorgenommene Änderungen und im Repository vorhandene Änderungen), können Sie Ihre Änderungen hinzufügen und festschreiben. Wenn Sie ziehen, kommt es offensichtlich zu einem Zusammenführungskonflikt. Hier können Sie die Tools in Ihrer IDE (wie Difftool und Mergetool) verwenden, um die beiden Codeteile zu vergleichen und zu bestimmen, welche Änderungen beibehalten und welche entfernt werden sollen. Dies ist der mittlere Weg; Änderungen gehen erst verloren, wenn Sie sie manuell entfernen.

git add $ the_file_under_error

Git Commit

Git Pull
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.