Ich habe ein nicht nacktes "Haupt" -Repo eingerichtet und auf meinen Computer geklont. Ich habe einige lokale Änderungen vorgenommen, mein lokales Repository aktualisiert und die Änderungen zurück auf mein Remote-Repo übertragen. Bis zu diesem Punkt war alles in Ordnung.
Jetzt musste ich etwas im Remote-Repo ändern. Dann habe ich etwas in meinem lokalen Repo geändert. Mir wurde klar, dass die Änderung am Remote-Repo nicht erforderlich war. Also habe ich versucht, git push
von meinem lokalen Repo zu meinem Remote-Repo zu wechseln, aber ich habe eine Fehlermeldung erhalten wie:
Um zu verhindern, dass Sie den Verlauf verlieren, wurden Aktualisierungen ohne schnellen Vorlauf abgelehnt. Führen Sie die Remote-Änderungen zusammen, bevor Sie sie erneut übertragen. Weitere
git push --help
Informationen finden Sie im Abschnitt "Hinweis zum Schnellvorlauf" .
Ich dachte das wahrscheinlich ein
git push --force
würde meine lokale Kopie zwingen, Änderungen an der Remote-Kopie zu übertragen und sie gleich zu machen. Das Update wird zwar erzwungen , aber wenn ich zum Remote-Repo zurückkehre und ein Commit durchführe, stelle ich fest, dass die Dateien veraltete Änderungen enthalten (die das Haupt-Remote-Repo zuvor hatte).
Wie ich in den Kommentaren zu einer der Antworten erwähnt habe :
[Ich] habe versucht zu erzwingen, aber wenn ich zum Master-Server zurückkehre, um die Änderungen zu speichern, bekomme ich veraltetes Staging. Wenn ich also festschreibe, sind die Repositorys nicht gleich. Und wenn ich versuche, Git Push erneut zu verwenden, erhalte ich den gleichen Fehler.
Wie kann ich dieses Problem beheben?
quelle
git push -force
sorgfältiger zu tun .git push --force
ist dies in der Tat eine weitere gültige Methode, um Push zu erzwingen, und es werden genauso viele Zweige wiegit push origin master --force
mit der Standardeinstellungpush.default config settings
von Git gepusht. Welche Zweige speziell verschoben werden, unterscheidet sich jedoch zwischen den Git-Versionen vor 2.0 und nach 2.0.git push --force
funktioniert heutzutage gut, FWIW ...git push --force-with-lease
funktioniert noch besser :), es wird sich weigern, einen Zweig zu aktualisieren, es sei denn, es ist der Zustand, den Sie erwarten. (siehe developer.atlassian.com/blog/2015/04/force-with-lease )Antworten:
Mach einfach:
oder wenn Sie ein bestimmtes Repo haben:
Dadurch werden Ihre vorherigen Commits gelöscht und Ihre aktuellen Commits verschoben.
Es mag nicht richtig sein, aber wenn jemand auf diese Seite stößt, dachte er, er möchte vielleicht eine einfache Lösung ...
Kurze Flagge
Beachten Sie auch, dass dies
-f
kurz--force
istwird auch funktionieren.
quelle
git push origin +master
stattdessen verwenden, wodurch Sie mehrere Referenzspezifikationen pushen können, ohne sie alle zu erzwingen.git push --force
, möglicherweise Ihrengit push --force
darin, den aktuell ausgecheckten Zweig zwangsweise auf seinen Remote-Counter-Teil zu verschieben. Wenn Sie also den Hauptzweig ausgecheckt haben, ist er identisch mitgit push origin master --force
. Es ist anders, wenn Sie diematching
Einstellung für verwendenpush.default
, die die Standardeinstellung für Git-Versionen vor 2.0 ist.matching
schiebt alle lokalen Zweige zu entfernten Zweigen, die den gleichen Namen haben, so dassgit push origin master --force
ist.merge -s ours
arbeitete für michUnd wenn
push --force
es nicht funktioniert, können Sie es tunpush --delete
. Blick auf 2 nd Linie auf dieser Instanz:Aber Vorsicht...
Gehen Sie niemals auf eine öffentliche Git-Geschichte zurück!
Mit anderen Worten:
force
auf ein öffentliches Repository.pull
.reset
oderrewrite
Geschichte in einem Repo, die jemand vielleicht schon gezogen hat.Natürlich gibt es auch bei dieser Regel außergewöhnlich seltene Ausnahmen, aber in den meisten Fällen ist dies nicht erforderlich und führt zu Problemen für alle anderen.
Führen Sie stattdessen ein Zurücksetzen durch.
Und seien Sie immer vorsichtig mit dem, was Sie zu einem öffentlichen Repo bringen . Zurücksetzen:
In der Tat, beide Herkunft HEADS (aus dem revert und aus dem bösen Reset ) die gleichen Dateien enthalten.
Bearbeiten, um aktualisierte Informationen und weitere Argumente hinzuzufügen
push --force
Ziehen Sie in Betracht, die Kraft mit Leasing anstelle von Druck zu drücken, bevorzugen Sie jedoch das Zurücksetzen
Ein weiteres Problem
push --force
kann sein, wenn jemand etwas drückt, bevor Sie es tun, aber nachdem Sie es bereits abgerufen haben. Wenn Sie Ihre neu basierte Version jetzt erzwingen, werden Sie die Arbeit anderer ersetzen .git push --force-with-lease
eingeführt in git 1.8.5 ( dank @VonC Kommentar zu der Frage) versucht, dieses spezielle Problem zu beheben . Grundsätzlich wird es einen Fehler bringen und nicht pushen, wenn die Fernbedienung seit Ihrem letzten Abruf geändert wurde.Dies ist gut, wenn Sie wirklich sicher sind, dass ein
push --force
benötigt wird, aber dennoch weitere Probleme vermeiden möchten. Ich würde so weit gehen zu sagen, dass es das Standardverhalten sein solltepush --force
. Aber es ist noch weit davon entfernt, eine Ausrede zu sein, um a zu erzwingenpush
. Personen, die vor Ihrer Rebase abgerufen wurden, haben immer noch viele Probleme, die leicht vermieden werden könnten, wenn Sie stattdessen zurückgekehrt wären .Und da es sich um
git --push
Instanzen handelt ...Warum sollte jemand Push erzwingen wollen?
@linquize brachte ein gutes Push-Force-Beispiel für die Kommentare: sensible Daten . Sie haben fälschlicherweise Daten verloren, die nicht übertragen werden sollten. Wenn Sie schnell genug sind, können Sie das Problem beheben
*
, indem Sie einen Druck auf die Oberseite erzwingen.*
Die Daten befinden sich weiterhin auf der Fernbedienung, es sei denn, Sie führen auch eine Speicherbereinigung durch oder bereinigen sie irgendwie . Es gibt auch das offensichtliche Potenzial, dass es von anderen verbreitet wird, die es bereits abgerufen haben, aber Sie haben die Idee.quelle
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
Dies löste mein Problem tatsächlich perfekt (auf einem Repo nur mit mir und meinem Freund). Vielleicht ist es falsch für öffentliche Repos, aber für private Repos ist dies ein Lebensretter.Zunächst einmal würde ich keine Änderungen direkt im "Haupt" -Repo vornehmen. Wenn Sie wirklich ein "Haupt" -Repo haben möchten, sollten Sie nur darauf drängen, es niemals direkt ändern.
Haben Sie es in Bezug auf den Fehler, den Sie erhalten,
git pull
von Ihrem lokalen Repo und danngit push
zum Haupt-Repo versucht ? Was Sie gerade tun (wenn ich es gut verstanden habe), ist den Push zu erzwingen und dann Ihre Änderungen im "Haupt" -Repo zu verlieren. Sie sollten die Änderungen zuerst lokal zusammenführen.quelle
git push -f
, aber wenn Sie Ihr Haupt-Repo erneut ändern, müssen Sie zu Ihrem lokalen Repo zurückkehren undgit pull
, damit es mit den neuesten Änderungen synchronisiert wird. Dann können Sie Ihre Arbeit erledigen und erneut drücken. Wenn Sie diesem "Push-Pull" -Workflow folgen, erhalten Sie nicht die Art von Fehler, über die Sie sich beschwert haben.Wenn ich mich in meinem lokalen Zweig A befinde und erzwingen möchte, dass der lokale Zweig B in den Ursprungszweig verschoben wird, kann CI die folgende Syntax verwenden:
quelle
git push --force origin B:C
. In meinem Fall scheint diesgit push --force origin C
nur vom lokalen Master zum Remote-C-Zweig zu führen, unabhängig davon, in welchem Zweig ich mich gerade befinde.git version 2.3.8 (Apple Git-58)
Verwenden Sie diesen folgenden Befehl:
quelle
-f
Flagge geändert ...Ich würde wirklich empfehlen:
Schieben Sie nur zum Haupt-Repo
Stellen Sie sicher, dass das Haupt-Repo ein nacktes Repo ist , um niemals Probleme damit zu haben, dass der Haupt-Repo-Arbeitsbaum nicht mit seiner
.git
Basis synchronisiert ist. Siehe " Wie kann ein lokales Git-Repository auf einen anderen Computer übertragen werden? "Wenn Sie im Haupt-Repo Änderungen vornehmen müssen, klonen Sie es (auf dem Hauptserver), nehmen Sie die Änderungen vor und drücken Sie es zurück
Mit anderen Worten, halten Sie ein nacktes Repo sowohl vom Hauptserver als auch vom lokalen Computer aus zugänglich, um ein einziges Upstream-Repo von / zu dem Sie ziehen / ziehen können.
quelle
Dies war unsere Lösung zum Ersetzen des Masters in einem gitHub-Repository eines Unternehmens unter Beibehaltung des Verlaufs.
push -f
Das Mastering in Unternehmens-Repositorys ist häufig deaktiviert, um den Filialverlauf zu verwalten. Diese Lösung hat bei uns funktioniert.Schieben Sie Ihre Niederlassung zu
desiredOrigin
und erstellen Sie eine PRquelle
Ich hatte die gleiche Frage, fand sie aber schließlich heraus. Am wahrscheinlichsten müssen Sie die folgenden zwei Git-Befehle ausführen (Hash durch die Git-Commit-Revisionsnummer ersetzen):
quelle