Frage Wie erzwinge ich einen Git Push?


Ich habe ein Remote-nicht-bare "Haupt" -Repo eingerichtet und es auf meinen Computer geklont. Ich habe einige lokale Änderungen vorgenommen, mein lokales Repository aktualisiert und die Änderungen zurück in mein Remote-Repository übertragen. Bis dahin war alles in Ordnung.

Jetzt musste ich etwas im Remote-Repo ändern. Dann habe ich etwas in meinem lokalen Repo geändert. Ich erkannte, dass der Wechsel zum Remote Repo nicht nötig war. Also habe ich es versucht git push von meinem lokalen Repo zu meinem Remote Repo, aber ich habe einen Fehler wie:

Um zu verhindern, dass Sie den Verlauf verlieren, wurden nicht schnelle Aktualisierungen vorgenommen   abgelehnt Die Remote-Änderungen zusammenführen, bevor Sie erneut drücken. Siehe 'Hinweis   über den Schnellvorlauf von git push --help für Details.

Ich dachte das wahrscheinlich a

git push --force

würde meine lokale Kopie erzwingen, um Änderungen an die entfernte zu übertragen und dasselbe zu machen. Es erzwingt das Update, aber wenn ich zum Remote-Repo zurückgehe und einen Commit mache, bemerke ich, dass die Dateien veraltete Änderungen enthalten (solche, die der Haupt-Remote-Repo zuvor hatte).

Wie ich schon erwähnte Kommentare zu einer der Antworten:

[Ich] habe versucht, zu forcen, aber wenn ich zum Master-Server zurückgehe, um die Änderungen zu speichern, bekomme ich eine veraltete Staging-Version. Also, wenn ich die Repositorys begehe, sind die nicht identisch. Und wenn ich versuche, git push wieder zu benutzen, bekomme ich den gleichen Fehler.

Wie kann ich dieses Problem beheben?


908
2018-04-01 05:35


Ursprung


Antworten:


Mach einfach:

git push origin <your_branch_name> --force

oder wenn Sie ein bestimmtes Repo haben:

git push https://git.... --force

Dies wird Ihre vorherigen Commits löschen und Ihre aktuelle Commit (s) schieben.

Es mag nicht korrekt sein, aber wenn jemand auf diese Seite stolpert, dachten sie, dass sie vielleicht eine einfache Lösung wollen ...

Kurze Flagge

Beachten Sie auch das -f Kurzform für --force, damit

git push origin <your_branch_name> -f

wird auch funktionieren.


1726
2017-09-26 21:31



Und wenn push --force funktioniert nicht, können Sie tun push --delete. Schau dir 2 annd Zeile für diese Instanz:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

Aber Vorsicht...

Gehe nie wieder in eine öffentliche GIT-Geschichte!

Mit anderen Worten:

  • Nicht immer force auf ein öffentliches Repository drücken.
  • Tun Sie das nicht, oder irgendetwas, das jemanden verletzen kann pull.
  • Nicht immer reset oder rewrite Geschichte in einem Repo jemand könnte schon gezogen haben.

Natürlich gibt es außergewöhnlich seltene Ausnahmen auch für diese Regel, aber in den meisten Fällen ist es nicht notwendig, und es wird Probleme für alle anderen erzeugen.

Tun Sie stattdessen eine Rückstellung.

Und sei immer vorsichtig mit dem, was du zu einem öffentlichen Repo treibst. Zurückkehren:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

In der Tat, beide Herkunft HEADS (von der zurückkehren und von der Böser Reset) enthält die gleichen Dateien.


Bearbeiten, um aktualisierte Informationen und weitere Argumente hinzuzufügen push --force

Denken Sie daran, die Kraft mit Pacht zu pushen anstatt zu pushen, aber bevorzugen Sie immer noch Rückstellung

Ein weiteres Problem push --force kann bringen wenn jemand etwas vor dir drängt, aber nachdem du schon geholt hast. Wenn Sie drücken, zwingen Sie Ihre rebasiert Version jetzt wirst du ersetzen Sie Arbeit von anderen.

git push --force-with-lease eingeführt in der Git 1.8.5 (Danke an @VonC Kommentar zu der Frage) versucht, dieses spezifische Problem anzugehen. Im Grunde wird es einen Fehler bringen und nicht drücken, wenn die Fernbedienung seit dem letzten Abruf geändert wurde.

Das ist gut, wenn Sie sich wirklich sicher sind push --force wird benötigt, will aber immer noch mehr Probleme verhindern. Ich würde so weit gehen, um zu sagen, dass es der Standard sein sollte push --force Verhalten. Aber es ist immer noch weit davon entfernt, eine Entschuldigung zu sein, um eine zu erzwingen push. Leute die geholt vor deinem Rebase wird immer noch viele Probleme haben, die leicht vermieden werden könnten, wenn Sie hatten rückgängig gemacht stattdessen.

Und da reden wir darüber git --push Instanzen ...

Warum sollte jemand Druck machen wollen?

@linquize brachte ein gutes Push-Force-Beispiel zu den Kommentaren: sensible Daten. Sie haben fälschlicherweise Daten weitergegeben, die nicht weitergegeben werden sollten. Wenn du schnell genug bist, kannst du "Fix"* es durch einen Druck an der Spitze erzwingen.

* Das Daten werden immer noch auf der Fernbedienung sein es sei denn du machst auch einen Müll sammeln, oder Reinige es irgendwie. Es gibt auch das offensichtliche Potenzial dafür, dass es von anderen verbreitet wird geholt es schon, aber Sie bekommen die Idee.


198
2018-05-22 22:03



Zunächst würde ich direkt im Haupt-Repo keine Änderungen vornehmen. Wenn Sie wirklich ein "Haupt" Repo haben wollen, dann sollten Sie nur darauf drücken, niemals direkt ändern.

In Bezug auf den Fehler, den Sie bekommen, haben Sie es versucht git pull von Ihrem lokalen Repo und dann git push zum Hauptrepo? Was Sie gerade tun (wenn ich es gut verstanden habe), ist es, den Push zu erzwingen und dann Ihre Änderungen im "Haupt" -Repo zu verlieren. Sie sollten die Änderungen zuerst lokal zusammenführen.


17
2018-04-01 05:42



Wenn ich in meinem lokalen Zweig A bin und den lokalen Zweig B in den Ursprungszweig C drücken möchte, kann ich folgende Syntax verwenden:

git push --force origin B:C

13
2018-05-28 18:25



Ich würde wirklich empfehlen zu:

  • nur zum Haupt-Repo drücken

  • Stellen Sie sicher, dass das Hauptrepo ein ist Bare Repo, um nie Probleme mit dem Haupt - Repo - Arbeitsbaum zu haben, der nicht synchron zu seinem ist .git Base. Sehen "Wie man ein lokales Git-Repository auf einen anderen Computer überträgt"

  • Wenn Sie Änderungen im Haupt-Repo vornehmen müssen, klonen Sie es (auf dem Hauptserver), machen Sie Ihre Modifikation und drücken Sie zurück

Mit anderen Worten: Halten Sie einen blossen Repo-Zugriff sowohl vom Hauptserver als auch vom lokalen Computer aus, um einen einzelnen Upstream-Repo zu haben, von dem aus Sie ziehen / ziehen können.


10
2018-04-01 05:53



Dies war unsere Lösung für den Austausch von Master auf einem Corporate-GitHub-Repository unter Beibehaltung der Historie.

push -f Das Verwalten von Unternehmensrepositorys ist oft deaktiviert, um den Zweigverlauf zu verwalten. Diese Lösung hat für uns funktioniert.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

Drücken Sie Ihren Zweig zu desiredOrigin und erstelle eine PR


5
2018-05-26 21:31



benutze diesen folgenden Befehl:

git push -f origin master

3
2018-04-10 14:00