2017-05-05 5 views
0

Ich bin neu bei Git/Github und habe angefangen, es vor kurzem zu verwenden.Wie verlorene Commit in Git wiederherstellen?

Ich habe ein Projekt in Git, das ein paar Commits hat, jedoch habe ich einen Push in Git mit Hilfe von git push -f Origin Master gezwungen und jetzt habe ich alle vorherigen Commits verloren und habe nur eine, die vor kurzem geschoben wurde.

Wie kann ich wiederherstellen mein Projekt in den vorherigen Zustand in Git wiederherstellen?

Dinge, die ich getan habe: git reflog (Das gefällt mir nicht geben vorherigen Details begehen)

213bcde [email protected]{0}: revert: Revert "V3 files" cb24c10 [email protected]{1}: reset: moving to HEAD cb24c10 [email protected]{2}: reset: moving to cb24c103e6c0400760a20098a2baceb0601bb858 cb24c10 [email protected]{3}: checkout: moving from master to master cb24c10 [email protected]{4}: commit (initial): V3> files

Ich muss eine bekommen über cb24c10 Kopf @ begehen {4}: commit (initial) : V3 Dateien

git HEAD zurückkehren --no-edit

git show Diese Details zeigt nur der aktuellen begehen SHA

git fsck --no-reflogs

Dies bietet mir einen baumelnden Blob und ich bin nicht sicher, ob dies ein Hinweis auf meine alte ist

Checking object directories: 100% (256/256), done. dangling blob e6a2438a4750e9cda68ce2d916c1b8a65dcc5384

begehen Bitte kann jemand helfen lassen Sie mich wissen, die nächsten Schritte stelle mein Projekt in den vorherigen Zustand zurück.

Leider habe ich mein Terminal-Fenster nicht geschlossen und ich kann die SHA des vorherigen Commits b0b7eba haben. Wie stelle ich diesen Zustand wieder her?

git push -f Ursprungs-Master Delta-Komprimierung mit bis zu 4 Threads. Objekte schreiben: 100% (507/507), 13,55 MiB | 7,17 MiB/s, fertig. Gesamt 507 (Delta 109), wiederverwendet 0 (Delta 0) remote: Auflösungsdeltas: 100% (109/109), fertig. Um https: http://.filename.git + b0b7eba ... cb24c10 Master -> Master (erzwungener Update)

+0

Es wäre hilfreich, wenn Sie sagen, was der Fehler, der schief gelaufen ist (ich meine, der mit der Kraft drücken) –

+0

Ich habe eine Kraft Push (git push -f Origin Master) mit den Dateien bilden mein lokales System, aber zog nicht die neueste von git –

+0

Was ist das Ergebnis dieser 'git reflog zeigen Fernbedienungen/Herkunft/Master'. Haben Sie diese Frage überprüft? http://stackoverflow.com/questions/3973994/how-can-i-recover-from-an-erronous-git-push-f-origin-master –

Antwort

1

UPDATE PRO NEW INFO IM quesiton

die ursprüngliche begehen SHA1 von b0b7eba zumindest lässt uns Gegeben versuche ein paar Dinge.

Für den Anfang

git checkout b0b7eba 

Wie unten erwähnt, ob dies ein neuer Klon ist, wird der Befehl fehl. Aber wenn es nicht fehlschlägt, sind Sie in guter Verfassung.

git branch -f master 
git push -f 

Wenn es fehlschlägt (und wenn Sie mit nicht eine ältere Repo müssen versuchen), sind wir wieder zurück zu GitHub; aber wir wissen wenigstens, was wir Github sagen sollen. Wieder muss ich Unwissenheit über die einzelnen Schritte predigen (da ich nicht wirklich viel Github mache), aber Sie sollten in der Lage sein, zu dem spezifischen Commit zu navigieren (welches fast sicher dort noch existiert) und dann entweder ...

  • Tag setzen, dann ziehen, Check-out dann den Tag, dann branch -f master, dann push -f
  • einen Zweig auf es schaffen, ...
  • nur den Master-Zweig bewegen, um sie über das Web API

ORIGINAL ANTWORTEN

Eine Sache zu wissen: Wenn Sie kein lokales Repo haben, das vor dem Force Push erstellt wurde, wird dies nicht einfach sein.

Sie erwähnen Erwähnung von Reflogs, aber es klingt, als würden Sie sagen, dass sie nicht weit genug zurückgehen. Das liegt vielleicht daran, dass die älteren Reflogs abgelaufen sind, aber wenn Sie die Dinge nicht auf ungewöhnliche Weise konfiguriert haben, bezweifle ich es. Also frage ich mich, ob Sie versucht haben, dies mit einem Klon zu beheben, der nach dem Force Push erstellt wurde; weil die Sache ist, ist der Reflog lokal nur für einen einzigen Klon des Repos. Daher kann kein Klon, der nach dem Force-Push erstellt wurde, einen nützlichen Reflog-Eintrag enthalten. Wenn Sie den Klon verwenden, der für den Force-Push verwendet wurde, ist das die beste Lösung.

In ähnlicher Weise erwähnen Sie einen einzelnen baumelnden Blob zu finden. Ein Blob ist Inhalt für eine einzelne Datei; Der Objekttyp, den Sie finden möchten, ist COMMIT. Die Tatsache, dass keine dangling commits erneut angezeigt werden, deutet darauf hin, dass der Klon nach dem force push erstellt wurde (weil zu diesem Zeitpunkt die gewünschten Commits nicht erreichbar waren und nicht in dem Pack enthalten waren, der zum Initialisieren neuer Klone verwendet wurde).

(Still, wenn Sie über das Objekt neugierig sind, können Sie

git cat-file -p e6a2438a4 

tun und sehen, was es ist.)

Eine Kraft Push ist eine Geschichte neu schreiben und revert kann nicht helfen damit. (Es werden nur Änderungen innerhalb eines Commits rückgängig gemacht, wie es in der aktuellen Historie verstanden wird.)

Ihre beste Wette ist es, in das Repo zu gehen, von dem aus der Force Push durchgeführt wurde, und dessen Reflog zu überprüfen. Wenn das kein Problem ist, bist du der API von github ausgeliefert (von der ich nicht viel weiß); Es scheint, dass es hier einen nützlichen Rat geben könnte: https://objectpartners.com/2014/02/11/recovering-a-commit-from-githubs-reflog/

+0

Das git checkout führte zu einem Fehler (Fehler: pathspec 'b0b7eba' stimmte mit keiner Datei überein, die git bekannt war.), Aber ich habe eine Kopie/ein Backup der Dateien, die ich in meinem lokalen (Backup Kopieren). Bitten Sie mich, in diesen Ordner zu gelangen und ihn als git-Repository festzulegen und Ihren Schritten zu folgen? –

+0

Ok, so scheint es, dass das lokale nicht das Ziel-Commit enthält und nutzlos sein wird. Aber nein, ich schlage nicht vor, dass Sie ein neues Repo einrichten, um es erneut zu versuchen. Eine Sicherung der Arbeitsbaumdateien ist keine Hilfe. Sie benötigen eine alte Kopie des Teils des Repos, der sich im '.git'-Ordner befindet - also * ein Klon, der vor dem Force-Push * existierte. Das ist die einzige Art von lokalem Repo, die funktionieren wird.Also von dem, was Sie sagen, ich denke, Sie müssen herausfinden, wie man die Geschichte direkt über die Github-Web-Oberfläche –

+0

Die Git API hilft geholfen. Es war nur ein simples Get-and-Post, das half. Ich habe das SHa des Commits, das ich brauchte, und benutzte die Post-Methode der API, um das als einen separaten Zweig zu erstellen. –

Verwandte Themen