Lektion 29 · Erholung
Finden Sie einen verlorenen Commit mit Reflog
Suchen Sie im lokalen Reflog nach einem Commit, den ein Hard-Reset zurückgelassen hat, überprüfen Sie seine Datei, bevor Sie ihm vertrauen, und fügen Sie einen Zweig darauf ein, ohne Ihren aktuellen Checkout zu verschieben.
- Ebene: Fortgeschritten
- 8 Min. gelesen
- 5 Min. Video
- Aktualisiert
- Vor dieser Lektion: Zurücksetzen: weich, gemischt und hart
In diesem Browser gespeicherter Fortschritt.
Beim Abspielen wird das Video von YouTube geladen (erweiterter Datenschutzmodus).
Englische Erzählung · English and Arabic Bildunterschriften
Öffnen Sie die VideoseiteAuf YouTube ansehenWas Sie lernen werden
- Lesen Sie das Reflog als Aufzeichnung dieses Repositorys darüber, wo HEAD und Branches waren.
- Überprüfen Sie den Inhalt eines Kandidaten-Commits, bevor Sie ihn retten.
- Erstellen Sie beim gemessenen Commit einen Zweig, ohne ihn auszuchecken.
- Sagen Sie, was das Reflog nicht zurückbringen kann: nicht festgeschriebene Arbeit und abgelaufene Einträge.
Bevor Sie beginnen
Sie befinden sich auf private/lost-signup, einem Zweig aus dem Ergebnis M von Lektion 18. Sie haben eine Notiz festgeschrieben, „Dokumente: Bewahren Sie die Anmeldewiederherstellungsnotiz auf“, die docs/signup-recovery.md hinzugefügt hat, und haben dann einen Commit zurück einen Hard-Reset ausgeführt. Die Notiz ist aus der Filiale, aus der Grafik und aus Ihren Dateien verschwunden. Sie haben noch keinen Rettungszweig und haben sonst nichts geändert.
Alles ist lokal und im kostenlosen Plan (GitTree fordert Sie auf, sich anzumelden): kein Hosting-Konto, kein Anbieter, kein Internet. Jede Identität ist fiktiv (example.com). Führen Sie diese Lektion niemals in einem echten Projekt aus. Der Hard-Reset in der Vorbereitung ist eine Probe in einer Wegwerfkopie.
Nehmen Sie die Änderungen in GitTree oder mit den nativen Git-Befehlen vor, nicht beides in derselben Kopie. Das Ablesen des Ergebnisses ist immer sicher. Die Menübezeichnungen stammen aus den eigenen Strings von GitTree 2.0 und die nativen Befehle wurden mit Git 2.43 in Einwegkopien ausgeführt. Die GitTree-Schritte wurden nicht auf macOS, Windows oder Linux ausgeführt.
Konzept und Zustandswirkungen
Das Reflog ist ein lokales Tagebuch der Ref-Bewegungen. HEAD hat einen, und jeder Zweig auch. Es zeichnet „Commit“, „Checkout“, „Reset“ und dergleichen auf, wobei das Commit jeweils auf dem gelandet ist. Ein anderer Klon hat Ihr Tagebuch nicht. Ein Commit, bei dem keine Zweignamen mehr existieren dürfen, und das Reflog ist, wie Sie es finden.
Selektoren wie HEAD@{1} zählen Einträge von jetzt an zurück, sodass sie sich bei jedem späteren Vorgang ändern. Lesen Sie die Aktion, die Zeit, den Ausweis und die Akte eines Kandidaten, bevor Sie ihn verwenden. Merken Sie sich einen Offset nicht als Rezept.
Das Reflog findet Commits, die gespeichert wurden. Es kann keine Bearbeitung gefunden werden, die nie festgeschrieben wurde, wie Lektion 27 gezeigt hat. Einträge verfallen: Standardmäßig behält Git Einträge für Commits, die kein Zweig erreicht, etwa dreißig Tage lang bei, und ein Repository kann dies ändern. Führen Sie während der Wiederherstellung keine Bereinigungs- oder Ablaufbefehle aus.
Durch das Erstellen eines Zweigs beim Commit wird eine Referenz hinzugefügt und sonst nichts. Der aktuelle Zweig, der Index und Ihre Dateien bleiben dort, wo sie sind.
Bereiten Sie den genauen Projektstand vor
Beginnen Sie mit einer separaten gewöhnlichen Kopie des Ergebnisses M aus Lektion 18 und lassen Sie Ihr Original unberührt. Erstellen Sie den Zweig, speichern Sie DOC_LOST, schreiben Sie ihn fest und setzen Sie einen Festschreibungsvorgang zurück. Dieses zerstörerische Präparat ist nur für eine Wegwerfkopie bestimmt.
Vollständige Dateieingaben
Speichern Sie nur in der unten genannten Phase. Dabei handelt es sich um vollständige UTF-8/LF-Körper mit einem abschließenden Zeilenumbruch; Fügen Sie niemals Markdown-Zäune ein. Unveränderte ausführbare Dateien erben die benannte Eingabe. Versionen in separaten Varianten dürfen das Original nicht überschreiben.
docs/signup-recovery.md – DOC_LOST
# Recovered signup work
Keep a branch name before leaving useful experimental work.In GitTree
Öffnen Sie die Palette mit Befehl+Umschalt+P (Strg+Umschalt+P bei Ubuntu).
- Bauen Sie die Probe auf, wie im nächsten Abschnitt gezeigt, und notieren Sie sich das Thema des verlorenen Commits.
- Öffnen Sie die Palette und führen Sie View Reflog… aus. Der Dialog „Reflog“ wird geöffnet, wobei Reflog of auf HEAD gesetzt ist; Die neuesten Einträge werden zuerst aufgelistet.
- Lesen Sie die Top-Einträge. Die neueste Version lautet „Zurücksetzen“ und die darunter liegende Version lautet „Commit“ mit dem Betreff „Dokumente: Bewahren Sie die Wiederherstellungsnotiz für die Anmeldung auf“. Verwenden Sie Show Older Entries, wenn die Liste lang ist. Gehen Sie nicht davon aus, dass die zweite Reihe immer die richtige ist.
- Wählen Sie den Commit-Eintrag aus. Das Dialogfeld zeigt Show in Graph und New branch name. Show in Graph kann nur einen Commit platzieren, den ein Zweig erreicht. Daher wird für diesen verlorenen Commit der Dialog geschlossen und das Diagramm bleibt auf M: Öffnen Sie das Reflog erneut für den nächsten Schritt. Sie lesen die Datei des Commits, nachdem Sie sie wiederhergestellt haben.
- Zurück im Dialog wählen Sie denselben Eintrag aus, geben
rescue/signupin New branch name ein und wählen Restore as Branch. In der Benachrichtigung steht: „Zweigrettung/Anmeldung erstellt. Durch Rückgängigmachen wird es wieder entfernt.“ - Überprüfen Sie das Ergebnis:
rescue/signupzeigt auf den verlorenen Commit, der aktuelle Zweig ist immer nochprivate/lost-signupauf M und Ihre Dateien bleiben unverändert. Wählen Sie den wiederhergestellten Commit aus und öffnen Sie seine Dateidocs/signup-recovery.md: Sie lautet DOC_LOST. - Lassen Sie den Rettungszweig an Ort und Stelle. Führen Sie keine Bereinigung durch, um das Diagramm aufzuräumen.
Für jeden gewöhnlichen Commit im Kurs: Summary ist das angegebene Subjekt, Description ist leer und die Optionen Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit und Allow Empty Commit bleiben ausgeschaltet.
Im Terminal
Nur in einer separaten, sauberen Kopie des Ergebnisses von Lektion 18:
git switch --create private/lost-signupSpeichern Sie DOC_LOST als docs/signup-recovery.md, dann:
git add -- docs/signup-recovery.md
git commit --quiet -m "docs: keep the signup recovery note"
git reset --hard HEAD~1
git reflog show --format=%gs -2 HEADreset: moving to HEAD~1
commit: docs: keep the signup recovery noteListen Sie die Kandidaten mit ihren Ausweisen auf und überprüfen Sie den, den Sie für verloren halten:
git reflog show --format='%H %gs' HEAD
git show "<lost-sha>:docs/signup-recovery.md"Ersetzen Sie <lost-sha> durch die ID in der Zeile „commit: docs: keep the signup Recovery Note“. In diesem unmittelbaren Beispiel ist HEAD@{1} derselbe Commit, aber dieser Offset ist keine Regel. Erstellen Sie den Rettungszweig, ohne ihn auszuchecken:
git branch rescue/signup "<lost-sha>"
git show rescue/signup:docs/signup-recovery.md
git symbolic-ref --short HEAD
git status --shortDie Datei ist DOC_LOST, der gedruckte Zweig ist private/lost-signup und der Status ist leer. In Ihren Dateien wird der Hinweis nicht angezeigt, da HEAD auf M verblieben ist. Hierzu gehört kein Ablauf- oder Bereinigungsbefehl.
Ergebnis
Where you end: rescue/signup zeigt auf den verlorenen Commit und seine Datei ist DOC_LOST. Der aktuelle Zweig, der Index und Ihre Dateien sind genau so, wie sie nach dem Zurücksetzen waren, und es wurde nichts gepusht.
Häufige Fehler
HEAD@{1}als festes Rezept verwenden, anstatt den Eintrag zu lesen.- Durch Zurücksetzen oder erneutes Auschecken vor dem Speichern eines Zweigs werden weitere Einträge hinzugefügt und der gewünschte vergraben.
- Es wird erwartet, dass das Reflog eine Bearbeitung enthält, die nie festgeschrieben wurde.
- Bereinigungsbefehle ausführen, während nach etwas gesucht wird.
Wenn etwas schief geht
Wenn der Commit nicht in der Liste enthalten ist, suchen Sie möglicherweise nach der falschen Referenz: Wechseln Sie Reflog of zwischen HEAD und dem Zweig und verwenden Sie Show Older Entries. Wenn es wirklich weg ist, ist es abgelaufen oder wurde nie festgeschrieben. In der App lautet der Hinweis nach Restore as Branch, dass „Rückgängig“ den Zweig wieder entfernt.
Überprüfen Sie Ihr Verständnis
Beantworten Sie jede Frage und lesen Sie dann, warum. Mit „erforderlich“ gekennzeichnete Fragen zählen zum Abschluss der Lektion.
0 von 6 korrekt
Beantworten Sie die erforderlichen Fragen richtig, um die Lektion abzuschließen.
In diesem Browser überprüft.
Üben
Melden Sie die beiden neuesten Reflog-Zeilen, die ID des verlorenen Commits, die erste Zeile der wiederhergestellten Datei und den Zweig, in dem sich Ihr Checkout befindet. Sagen Sie dann, was das Reflog für eine Änderung anzeigen würde, die Sie nie vorgenommen haben.
Ihre eigene Bestätigung: Die Website kann Ihren Computer nicht sehen.
Um die Lektion abzuschließen, beantworten Sie die erforderlichen Fragen richtig und bestätigen Sie die praktische Übung.
Zusammenfassung
- Das Reflog ist ein lokales Tagebuch der Schiedsrichterbewegungen.
- Überprüfen Sie den Kandidaten und verzweigen Sie dann von ihm.
- Es findet Commits, keine nicht gespeicherten Änderungen.
Verwandt
Glossarbegriffe eingeführt
Reflog – سجل المراجع; Rettungszweig – فرع حفظ; Selektor – محدِّد.
Videotranskript
Die Erzählung des Videos, Stichwort für Stichwort.
Zeigen Sie das Transkript
- Ein Commit scheint weg zu sein. Git erinnert sich noch wo es war.
- Das Reflog ist ein lokales Tagebuch von where HEAD und Zweige waren.
- Bei einem Commit können weiterhin keine Filialnamen festgelegt werden darin aufgeführt.
- In einer Einwegkopie: Machen Sie eine Notiz und Dann setzen Sie es hart zurück.
- Die Grafik zeigt nur M. Die Notiz ist nirgendwo zu sehen.
- Jetzt nicht zurücksetzen oder aufräumen. Schauen Sie zuerst.
- Öffnen Sie die Palette und führen Sie View Reflog aus.
- Der Dialog öffnet sich auf HEAD. Der neueste Schritt ist zuerst.
- Die neueste Zeile ist der Reset. Direkt darunter ist der verlorene Commit.
- Wenn die Liste lang ist, zeigen Sie ältere Einträge an.
- Sie können zwischen HEAD und dem wechseln Zweig.
- Merken Sie sich HEAD nicht auf einmal. Lesen Sie den Eintrag stattdessen.
- Wählen Sie den Commit-Eintrag aus. Neue Möglichkeiten erscheinen.
- Show in Graph kann es nicht platzieren: Kein Zweig erreicht diesen Commit.
- Stellen Sie es also zuerst als Zweig wieder her. Dann lesen Sie die Datei.
- Gehen Sie zurück und wählen Sie denselben Eintrag aus.
- Benennen Sie die Branch-Rescue-Slash-Anmeldung.
- Stellen Sie es als Zweig wieder her. In der Bekanntmachung heißt es Mit „Rückgängig“ wird es wieder entfernt.
- Der Rettungszweig befindet sich im verlorenen Commit. Du bist immer noch auf M.
- Ihre Dateien haben sich nicht geändert.
- Im Terminal befinden sich die beiden neuesten Linien das Zurücksetzen und das Festschreiben.
- Bei IDs wählen wir den Commit anhand seiner Zeile aus.
- git show mit einem Pfad liest die Datei aus das begehen.
- Git Branch erstellt den Rettungszweig. Unser Kasse bleibt stehen.
- Der Status ist leer und die Datei ist sicher auf dem Ast.
- Eine Bearbeitung, die nie festgeschrieben wurde, ist nicht vorhanden der Reflog.
- Einträge verfallen. Führen Sie währenddessen keine Bereinigung durch du erholst dich.
- Es ist lokal. Andere Klone haben deine nicht Tagebuch.
- Übung: Melden Sie die Zeilen, die ID, die erste Zeile und der Zweig.
- Als nächstes erfolgt das Rückgängigmachen und Wiederherstellen von GitTree.