Git beschädigter Master-Zweig

Git beschädigter Master-Zweig

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 verwende die grafische Benutzeroberfläche und ich glaube, dies ist das erste Mal, dass ich sie seit der Aktualisierung geöffnet habe.

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

Wenn ich tippe

git log 

ich erhalte

fatal: fehlerhafte Standardrevision „HEAD“

Aktualisieren
Nach dem Betrachten vonhttps://stackoverflow.com/questions/1545407/recovering-broken-git-repositoryIch habe es versucht

git fsck

es kam zurück:

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

Rücksendungen tätigen:

Fehler: Referenz HEAD kann nicht aufgelöst werden: Keine solche Datei oder kein solches Verzeichnis.
Schwerwiegend: HEAD-Referenz kann nicht gesperrt werden.

und Protokollieren von Master-Branch-Returns

$ git log master Warnung: Beschädigte Refs/Heads/Master werden ignoriert. Warnung: Beschädigte Refs/Heads/Master werden ignoriert. Fatal: Mehrdeutiges Argument „Master“: Unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie „--“, um Pfade von Revisionen zu trennen.

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

$ git reflog master
Warnung: Beschädigte Refs/Heads/Master werden ignoriert.
Warnung: Beschädigte Refs/Heads/Master werden ignoriert.
Fatal: Mehrdeutiges Argument „Master“: Unbekannte Revision oder Pfad nicht im Arbeitsbaum.
Verwenden Sie „--“, um Pfade von Revisionen zu trennen.

Weitere möglicherweise nützliche Informationen: Jedes Mal, wenn ich die beschädigte Datei lösche, wird sie durch eine andere ersetzt. Ich fange an zu glauben, dass es etwas damit zu tun hat, dass der Master-Zweig auf das Falsche oder so etwas zeigt. Denn ich gehe davon aus, dass der Kopf auf den Master zeigt.

Einen Tag später:
Also habe ich meinen Kumpel darauf aufmerksam gemacht, er konnte die Protokolle durchgehen und sagte, dass die Hashes in den Protokollen nicht mit den Objekten im Ordner übereinstimmen. Er hat versucht, den Master-Zweig auf die Protokolle zurückzusetzen oder so etwas, ich war ein bisschen ratlos. Hoffe, das ist hilfreich

Antwort1

Das Repository existiert, aber alle meine Commits sind verschwunden.

Was genau meinst du? Ist der Arbeitsbaum noch da? Existiert er .git/? Sind darin irgendwelche Dateien?

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

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

Wenn Sie sich in einem anderen Zweig befanden, ersetzen Sie einfach „Master“ durch den Namen des Zweigs. Wenn Sie sich nicht in einem Zweig befanden, wäre es komplizierter.

.git/logs/HEADzeichnet vergangene Zustände von HEAD auf, wobei spätere Zeilen unten stehen. Diese Beispielzeile zeigt einen Checkout: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <[email protected]> 1346938344 +0200 checkout: moving from master to MySuperBranch

Die SHA1s davor beziehen sich auf Commits. Diese solltest du beispielsweise im Branch-Log finden können .git/logs/refs/heads/master.

Die von Ihnen angegebene Git-Reflog-Ausgabe scheint refs/heads/masterebenfalls zu fehlen. Ihr einziger Inhalt sollte der SHA1 des letzten Commits (und ein Zeilenumbruch) sein. Den neuesten SHA1 finden Sie beispielsweise am Ende des Branch-Logs .git/logs/refs/heads/master.

Antwort2

Wenn .git/HEAD vorhanden ist und sein Inhalt ref: refs/heads/masterdann die Datei refs/heads/master überprüft, muss sie den SHA1 des letzten Commits enthalten.

Wenn die Datei beschädigt und voller NULL-Zeichen ist, bearbeiten Sie die Datei und fügen Sie den SHA1-Wert des letzten Commits .git/logs/HEADoder des Commits vor dem letzten Commit ein.

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

Antwort3

Es klingt, als wäre Ihr Repo beschädigt. Am einfachsten wäre es, Ihr Repo aus einem Backup wiederherzustellen oder das Repo von der Originalquelle neu zu klonen (vorausgesetzt, Sie hatten nicht Unmengen an Arbeit im Repo).

Wenn das Wiederherstellen/Klonen keine Option ist, empfehle ich Ihnen,Pro Git(kostenloses Online-Buch oder diePapierversion). 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 verstanden haben, wie Git funktioniert, werfen Sie einen Blick auf Linus‘Anweisungen zur Wiederherstellung beschädigter Objekte.

Antwort4

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

git fetch origin
git reset --hard origin/master

verwandte Informationen