Git beschädigten Master-Zweig

9

Ich öffne mein Git-Repository mit gitExtensions unter Windows 7 für ein Visual Studio-Projekt. Es ist plötzlich leer. Das Repository existiert, aber alle meine Commits sind verschwunden.

Ich benutze die grafische Benutzeroberfläche und glaube, dass dies das erste Mal ist, dass ich sie geöffnet habe, seit sie sie aktualisiert haben.

Ich bin mir nicht sicher, was ich tun soll, um meine Commits zurückzuerhalten.

Wenn ich tippe

git log 

ich erhalte

fatal: schlechte Standardrevision 'HEAD'

Update
Nachdem ich mir https://stackoverflow.com/questions/1545407/recovering-broken-git-repository angesehen habe, habe ich es versucht

git fsck

es kam zurück:

Fehler: Ungültiger HEAD-Fehler: Das
lose Objekt 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (gespeichert in .git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31) ist beschädigt

Festschreiben von Renditen:

Fehler: Referenz HEAD
kann nicht aufgelöst werden : Keine solche Datei oder Verzeichnis ist fatal: HEAD ref kann nicht gesperrt werden

und Protokollieren der Master-Verzweigungsrückgabe

$ git log master Warnung: Ignoriere defekte refs / heads / master. Warnung: Ignorieren von defekten Refs / Heads / Master. fatal: mehrdeutiges Argument 'master': unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie '-', um Pfade von Revisionen zu trennen

Ich werde einfach weiter Dinge einfügen, die relevant sein könnten

$ git-Reflog-Master-
Warnung: Unterbrochene Refs / Köpfe / Master werden ignoriert.
Warnung: Ignorieren von defekten Refs / Heads / Master.
fatal: mehrdeutiges Argument 'master': unbekannte Revision oder Pfad nicht im Arbeitsbaum.
Verwenden Sie '-', um Pfade von Revisionen zu trennen

Weitere nützliche Informationen: Jedes Mal, wenn ich die beschädigte Datei lösche, findet eine neue statt. Ich beginne zu denken, dass es etwas mit dem Hauptzweig zu tun hat, der auf das Falsche oder etwas zeigt. denn ich nehme an, der kopf zeigt auf master.

Ein Tag später:
Also habe ich meinen Kumpel dazu gebracht, er konnte die Protokolle durchgehen und er sagte, dass die Hashes in den Protokollen nicht mit den Objekten im Ordner übereinstimmen. Er hat versucht, den Hauptzweig auf die Protokolle zurückzusetzen, oder so, ich habe mich ein bisschen verlaufen. Hoffe das ist hilfreich

MrJD
quelle
1
@heavyd überprüfen Sie bitte Update
MrJD

Antworten:

2

Das Repository existiert, aber alle meine Commits sind verschwunden.

Was genau meinst du? Ist der Arbeitsbaum noch da? Gibt .git/es Gibt es irgendwelche Dateien darin?

Die von Ihnen geposteten Nachrichten weisen darauf hin, dass die Datei .git/HEADnicht vorhanden ist. Es definiert den erwarteten Zustand des Arbeitsbaums (was Sie ausgecheckt hatten). Wenn diese Datei weg ist, weiß git nicht, wo Sie waren.

Sie können versuchen, die Datei mit folgendem Inhalt selbst zu erstellen: ref: refs/heads/master

Wenn Sie sich in einem anderen Zweig befanden, ersetzen Sie einfach "master" durch den Namen des Zweigs. Wenn Sie nicht in einem Zweig wären, wäre es komplizierter.

.git/logs/HEADZeichnet vergangene HEAD-Zustände mit späteren Zeilen unten auf. Diese Beispielzeile zeigt eine Kaufabwicklung: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <[email protected]> 1346938344 +0200 checkout: moving from master to MySuperBranch

Die vorangestellten SHA1s beziehen sich auf Commits. Sie sollten diese beispielsweise im Zweigprotokoll finden .git/logs/refs/heads/master.

Die Ausgabe des Git-Reflogs, die Sie angegeben haben, scheint ebenfalls zu refs/heads/masterfehlen. Sein einziger Inhalt soll der SHA1 des neuesten Commits (und eine neue Zeile) sein. Sie finden den neuesten SHA1 beispielsweise am Ende des Verzweigungsprotokolls .git/logs/refs/heads/master.

Rainer Blome
quelle
2

Wenn .git / HEAD existiert und sein Inhalt ref: refs/heads/masterüberprüft wird, muss die Datei refs / heads / master den sha1 des letzten Commits enthalten.

Wenn diese Datei beschädigt und voll mit NULL-Zeichen war Bearbeiten Sie diese Datei und geben Sie den Wert 1 des letzten Commits von .git/logs/HEADoder den Wert 1 vor dem letzten Commit ein.

Dann mach git reset --hard 'sha1 of the commit that you selected'

zaki
quelle
es war in der Tat voll mit NULL-Zeichen, also habe ich sha1 des vorherigen Commits eingegeben, aber dann führte das Zurücksetzen des Git zu "Fehler: update_ref für Ref 'HEAD' fehlgeschlagen: Ref 'HEAD' kann nicht gesperrt werden: Referenz HEAD kann nicht aufgelöst werden: Ungültiges Argument "
fantabolischer
0

Es klingt wie Ihr Repo beschädigt wurde. Am einfachsten ist es, Ihr Repo von einem Backup wiederherzustellen oder das Repo von der ursprünglichen Quelle erneut zu klonen (vorausgesetzt, Sie hatten nicht viel Arbeit im Repo).

Wenn Resotring / Cloning keine Option ist, würde ich empfehlen, Pro Git (kostenloses Online-Buch oder Papierversion ) zu lesen . Das ganze Buch ist sehr informativ, aber werfen Sie vor allem einen Blick auf das letzte Kapitel, um zu verstehen, wie Git intern funktioniert. Wenn Sie sich mit der Funktionsweise von Git vertraut gemacht haben, lesen Sie die Anweisungen von Linus zum Wiederherstellen beschädigter Objekte .

heavyyd
quelle
Also, leider habe ich keine versteckten Dateien gesichert, .git war versteckt. Ich habe nicht wirklich genug Zeit, um ein ganzes Buch zu lesen. Gibt es etwas, von dem du denkst, dass ich es versuchen könnte?
MrJD
"Lies ein Buch über die Interna" mag ein allgemeiner Rat sein, aber es hilft nicht, das spezifische Problem und die anstehende Frage anzusprechen.
Burhan Ali
0

Nachdem ich eine Weile im Internet gesurft hatte, fand ich das endlich und es funktionierte.

git fetch origin
git reset --hard origin/master
Leye Odumuyiwa
quelle