Mein Git-Repository ist irgendwie wackelig geworden - ich habe heute Morgen msysgit geladen und anstatt den Filialnamen nach dem aktuellen Verzeichnis anzuzeigen, heißt es "((ref: re ...))", 'git status' meldet alles als Neue Datei, 'Git Log' und 'Git Reflog' sagen mir "fatal: schlechte Standardrevision 'HEAD'" und so weiter.
Wenn ich 'git reflog --all' oder 'gitk --all' mache, sehe ich, dass der Rest des Repositorys intakt ist, aber es sieht so aus, als wäre der Zweig, an dem ich gearbeitet habe, gerade verschwunden, was erklärt, warum HEAD nicht zu existieren scheint / auf irgendetwas zeigen.
Ich weiß, dass git alle Arten von Informationen enthält, und ich gehe davon aus, dass meine Commits gerade irgendwie verwaist sind. Gibt es also einen Befehl, der mir diese Commits anzeigt, damit ich HEAD auf sie zurücksetzen kann?
EDIT: Oh je. Ich habe 'git fsck' entdeckt und 'git fsck --full' meldet "fatal: Objekt 03ca4 ... ist beschädigt". Was zum Teufel kann ich dagegen tun?
EDIT: Oh je, oh je. Ich habe einen anderen Zweig ausgecheckt und dann versucht, den ursprünglichen Zweig mit demselben Namen mithilfe von 'git checkout -b lostbranchname' neu zu erstellen. Git sagt "Fehler: Referenzreferenzen / Köpfe / verlorener Zweigname können nicht aufgelöst werden: Kein Fehler, schwerwiegend: Fehlgeschlagen Ref für Update sperren: Kein Fehler ". 'Kein Fehler' muss ein besonders böser Fehler sein. Es sieht also so aus, als ob es immer noch herumhängt, aber nicht benutzt und nicht getötet werden kann.
EDIT: Super Duper oh je. Ich habe einige Dinge entpackt, neu gepackt und ersetzt, wie hier vorgeschlagen: Wie kann ich Git-Objekte wiederherstellen, die durch einen Festplattenausfall beschädigt wurden? , aber jetzt bekomme ich einen weiteren Hash, der als korrupt gemeldet wird, für etwas so Unschädliches wie "Git-Status". Ich denke, das Ganze ist abgespritzt. Git ist reizend und alles, aber ich sollte mich nicht mit so etwas befassen müssen.
git checkout -b lostbranchname
- wenn Sie nur über den Namen der Branche (nicht der Inhalt davon) kümmern, können Sie manuell löschen (oder umbenennen).git/refs/heads/lostbranchname
-, die den Trick hoffentlich tun wird.Antworten:
Anstatt dies offen zu lassen, denke ich, werde ich eine Antwort auf meine eigene Frage geben. Die Verwendung
git reflog --all
ist eine gute Möglichkeit, verwaiste Commits zu durchsuchen. Mit den SHA1-Hashes können Sie den Verlauf rekonstruieren.In meinem Fall war das Repository jedoch beschädigt, sodass dies nicht half.
git fsck
kann Ihnen helfen, Fehler im Repository selbst zu finden und manchmal zu beheben.quelle
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(Bearbeiten: Stellen Sie sich diese doppelten Backticks vor, bei denen einzelne - Flucht hier nicht zu funktionieren scheint)Mit git 2.9.x / 2.10 (Q3 2016) müssen Sie nicht
git reflog --all
mehr verwenden,git reflog
wird ausreichen.Siehe Commit 71abeb7 (03. Juni 2016) von SZEDER Gábor (
szeder
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 7949837 , 06. Juli 2016)quelle
Ein gutes Merkmal von Git ist, dass es Korruption erkennt. Es enthält jedoch keine Fehlerkorrektur zum Schutz vor Beschädigung.
Ich hoffe, dass Sie den Inhalt dieses Repositorys auf einen anderen Computer übertragen haben oder dass Sie Backups haben, um die beschädigten Teile wiederherzustellen.
Ich habe keine Erfahrung mit Git unter Windows, habe aber noch nie ein solches Verhalten mit Git unter Linux oder OS X gesehen.
quelle
Ich finde die
git reflog
Ausgabe normalerweise verwirrend. Es ist für mich viel einfacher, ein Commit-Diagramm zu verstehen ausgit log --graph --reflog
:und es ist klar, dass
e3124bf
und6a7a52e
sind nicht referenzierte Waisen, und es gibt Kontext von ihren Vorfahren Commits.quelle
git reflog --all
nicht verschoben wurden, wird nicht angezeigt , dagit log --graph --reflog
sie sehr gut sichtbar waren ...