138 Stimmen

Wie kann ich mich von einem fehlerhaften git push -f origin master erholen?

Ich habe gerade die falsche Quelle zu meinem Projekt unter Verwendung der --force Option committet.

Ist es möglich, das rückgängig zu machen? Ich verstehe, dass alle vorherigen Branches unter Verwendung der -f Option überschrieben wurden, also habe ich möglicherweise meine früheren Revisionen durcheinander gebracht.

0 Stimmen

0 Stimmen

Hast du die Ausgabe des Befehls gespeichert? Es zeigt dir den alten Committish.

75voto

Cameron Skinner Punkte 48467

Git wirft im Allgemeinen nichts weg, aber das Wiederherstellen kann dennoch knifflig sein.

Wenn Sie die korrekte Quelle haben, können Sie sie einfach mit der Option --force in das Remote-Repository schieben. Git hat keine Branches gelöscht, es sei denn, Sie haben es ihm gesagt. Wenn Sie tatsächlich Commits verloren haben, werfen Sie einen Blick auf dieser nützliche Leitfaden zur Wiederherstellung von Commits. Wenn Sie die SHA-1 der gewünschten Commits kennen, sind Sie wahrscheinlich in Ordnung.

Das Beste, was Sie tun können: Sichern Sie alles und prüfen Sie, was sich noch in Ihrem lokalen Repository befindet. Machen Sie dasselbe bei Bedarf im Remote-Repository. Verwenden Sie git fsck, um zu sehen, ob Sie Dinge wiederherstellen können, und vor allem FÜHREN SIE NICHT git gc AUS.

Vor allem verwenden Sie die Option --force niemals, es sei denn, Sie meinen es wirklich, wirklich ernst.

89 Stimmen

Sie können wahrscheinlich einfach auf die Reflogs schauen, um herauszufinden, wo sich die Remote-Branches ursprünglich befanden. Zum Beispiel git reflog show remotes/origin/master. Sie sollten Ihren Push dort sehen können; der Commit in der vorherigen Zeile ist, wo er vor Ihrem Fehler war. Sie können dann einfach diese Revision (mit --force) nach origin pushen und sind wieder dort, wo Sie waren!

0 Stimmen

@David: Oh. Du hast in deiner Frage nicht erwähnt, dass du das Repo nicht hast. (Das ist natürlich etwas, was man nie machen möchte.) Wenn du jedoch Zugriff auf das Dateisystem hast, wo du gepusht hast, könntest du das trotzdem dort alles machen.

1 Stimmen

@David: Oops. Immer gut, Ihr aktuelles Verzeichnis als Teil Ihres Eingabeaufforderungs zu haben, um solche Dinge zu vermeiden.

69voto

user1094125 Punkte 619

Wenn Sie den Commit-Hash kennen, ist es einfach, einfach Ihren Zweig neu zu erstellen.

5794458...b459f069 master -> master (erzwungenes Update)

Löschen Sie den Remote-Zweig:

git push origin :master

Erstellen Sie dann Ihren Zweig mit den folgenden Befehlen neu:

git checkout 5794458
git branch master
git push origin master

0 Stimmen

Alternativ können Sie Ihren Remote-Zweig nicht löschen (nur zur Sicherheit), sondern stattdessen den lokalen Zweig löschen und dann einen Force-Push durchführen.

0 Stimmen

Sie können direkt zum Drücken eines Commits springen (git push --force origin 5794458:master); alle anderen Befehle sind unnötig.

67voto

Abdelhafid Punkte 707

Die Lösung ist bereits erwähnt hier

# Arbeit an lokalem Hauptzweig
git checkout main

# Zurücksetzen auf den vorherigen Zustand von origin/main, wie im Reflog aufgezeichnet
git reset --hard origin/main@{1}

# Überprüfen Sie an dieser Stelle, ob dies tatsächlich der gewünschte Commit ist.
# (falls erforderlich, verwenden Sie git reflog, um den richtigen zu finden, und
# git reset --hard auf diesen)

# Schließlich den Hauptzweig (und nur den Hauptzweig) auf den Server pushen
git push -f origin main

0 Stimmen

Vielen Dank, das hat bei mir funktioniert. Ich hatte keinen Zugriff auf "delete master", daher ist der genehmigte Kommentar fehlgeschlagen.

0 Stimmen

Ja, und git reflog show remotes/origin/master wenn git reflog erforderlich ist (wie von @Cascabel oben erwähnt)

2 Stimmen

Das ist die richtige Antwort, danke für die Verlinkung zur richtigen.

44voto

YaaKouB Punkte 650

Ja, du kannst Commits nach git push -f your_branch wiederherstellen

Text aus der Dokumentation:

Lösche Einträge, die älter als die angegebene Zeit sind. Wenn diese Option nicht angegeben wird, wird die Ablaufzeit aus der Konfigurationseinstellung gc.reflogExpire übernommen, die wiederum standardmäßig auf 90 Tage gesetzt ist. --expire=all löscht Einträge unabhängig von ihrem Alter; --expire=never schaltet das Beschneiden erreichbarer Einträge aus (aber siehe --expire-unreachable).

Also kannst du Folgendes tun:

1- git reflog

Bildbeschreibung hier eingeben

2- Du wählst Head_Number aus, den du mit git reset –hard HEAD@{HEAD-NUMMER} wiederherstellen möchtest

Bildbeschreibung hier eingeben

3- Du kannst alle Commits auf diesem Branch sehen mit git cherry -v branch_name

4- Am Ende solltest du einen Force Push machen git push -f branch_name

ODER

1- Hol dir die SHA-Nummer von deinem GIT-Client (Interface)

git reset --hard commit_SHA

2- Force Push

git push -f your_branch

Ich hoffe, das hilft

1 Stimmen

Bilder sind nicht verfügbar (mehr?). Könnten Sie sie wieder hinzufügen oder Verweise entfernen?

0 Stimmen

Ich kann die Bilder sehen, kann das jemand bestätigen, bitte Leute?

0 Stimmen

Entschuldigung, mein Fehler, es lag an den Netzwerkeinstellungen, die ich verwendet habe.

10voto

Pierrick HYMBERT Punkte 617

Wenn Sie nicht auf diesem lokalen Repository sind, von dem der Zwangspush ausgegangen ist, gibt es auf der Ebene origin/master keine Möglichkeit zur Wiederherstellung. Aber wenn Sie glücklich genug sind, GitHub oder GitHub oder GitHub für Unternehmen zu verwenden, können Sie einen Blick auf die REST API werfen und den verlorenen Commit als Patch abrufen, Beispiel:

  1. Ereignisse auflisten und den Commit SHA1 langen Format finden

https://api.github.com/repos/apache/logging-log4j2/events

  1. Den verlorenen Commit herunterladen und den zugehörigen Patch im json-Pfad .files[]/patch abrufen

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. Lokal anwenden und erneut pushen

git apply patch.patch && git commit -m "wiederhergestellter Commit" && git push origin master

0 Stimmen

Das ist die tatsächliche Antwort auf die Frage. Danke.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X