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.

5voto

user7610 Punkte 20682

Ein weiterer Weg, um den verlorenen Commit wiederherzustellen oder sogar herauszufinden, welche Commits verloren gegangen sind, wenn der vorherige Push nicht aus Ihrem lokalen Repository stammt, ist auf Ihrer CI-Maschine zu schauen.

Wenn Sie einen Job haben, der den Master-Zweig nach jedem Commit (oder einer Serie aufeinanderfolgender Commits) testet, was Sie haben sollten, können Sie sehen, was zuletzt getestet wurde. Das ist der Commit, den Sie wiederherstellen müssen.

Die CI-Maschine speichert möglicherweise sogar einen lokalen Klon des Repositories, von dem aus Sie diese Wiederherstellung durchführen können.

Quelle: wahrscheinlich Continuous Delivery: Zuverlässige Softwarebereitstellungen durch Automatisierung von Build, Test und Bereitstellung (Addison-Wesley Signature Series (Fowler))

2voto

Pran Punkte 21

Ich habe dasselbe gemacht, während ich einen letzten Push für nur eine Datei rückgängig gemacht habe. Am Ende ging ich zurück zum ursprünglichen Zustand des Repositorys. Ich habe die Git-Befehle von Linus verwendet, da ich die lokale Kopie auf Linux hatte. Glücklicherweise war diese Kopie noch intakt.

Alles was ich gemacht habe war (nachdem ich frantically ein paar mehr Kopien des lokalen Repo erstellt hatte):

git add .
git status

(es wurde angezeigt, dass origin/master um 68 Commits voraus war, in Ordnung ... das waren alle Commits, die ich gelöscht hatte)

git remote set-url origin 
git push

Und alles wurde wiederhergestellt, wie es vor dem erzwungenen Push war. Das Wichtigste, woran man sich erinnern sollte, ist niemals ein git checkout . durchzuführen, nachdem man erzwungen gepusht hat. Aber die beste Praxis ist, die Push-Option zu deaktivieren. Ich werde sie nie wieder verwenden. Habe meine Lektion gelernt!!

2voto

Anthony Krivonos Punkte 4294

Für Menschen in wirklich schlechten Situationen wie ich es war (zum Beispiel, wenn du schlechte Objekt Fehler bekommst beim Ausführen von git reset --hard):

Ich habe ein Skript namens Treesaver geschrieben, das als letzte Möglichkeit alle deine Dateien von der GitHub API abruft. So wird es benutzt:

  1. Klone das treesaver Skript und wechsle zu ihm.
  2. Finde den SHA String des Baums, den du wiederherstellen möchtest, indem du https://api.github.com/repos///events aufrufst.
  3. In der payload Eigenschaft, die deinem Push-Ereignis entspricht, finde den commit, zu dem du zurückkehren möchtest, und klicke auf dessen url.
  4. Unter commit.tree, kopiere die url des Baums.
  5. Führe python3 main.py aus.

Zum Beispiel würde ich in meinem Fall folgendes ausführen:

python3 main.py https://api.github.com/repos/anthonykrivonos/mein-repo/git/trees/1234567 .

Natürlich sind Pull Requests willkommen.

0voto

Andrey Punkte 91

Hier können Sie Entscheidungen lesen https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it

Der zweite hat mir geholfen. Ich habe diese Befehle falsch gemacht

1) (some-branch) git pull -> der richtige Befehl war git pull origin some-branch

2) (some-branch) git push -f origin some-branch

Nach diesen Befehlen habe ich drei Commits verloren. Um sie wiederherzustellen, habe ich in der Konsole nachgeschaut, wo ich 'git pull' falsch gemacht habe und dort folgende Ausgabe gesehen habe

60223bf...0b258eb some-branch -> origin/some-branch

Der zweite Hash 0b258eb war genau das, was ich brauchte. Also habe ich diesen Hash genommen und den Befehl ausgeführt

git push --force origin 0b258eb:some-branch

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