Vai al contenuto
GitTree

Lezione 29 · Recupero

Trova un commit perso con reflog

Trova un commit lasciato indietro da un hard reset nel reflog locale, controlla il suo file prima di fidarti di esso e inserisci un ramo su di esso, senza spostare il checkout corrente.

Avanzamenti salvati in questo browser.

La riproduzione carica il video da YouTube (modalità ottimizzata per la privacy).

Narrazione in inglese · English and Arabic didascalie

Apri la pagina del videoGuarda su YouTube

Cosa imparerai

  • Leggi il reflog come la registrazione di questo repository di dove sono stati HEAD e i rami.
  • Controlla il contenuto di un commit candidato prima di salvarlo.
  • Crea un ramo nel commit misurato senza estrarlo.
  • Di' ciò che il reflog non può riportare indietro: lavoro non impegnato e voci scadute.

Prima di iniziare

Sei su private/lost-signup, un ramo del risultato M della lezione 18. Hai eseguito il commit di una nota, "docs: keep the signup recovery note", che ha aggiunto docs/signup-recovery.md, quindi hai eseguito un hard reset con un commit precedente. La nota è scomparsa dal ramo, dal grafico e dai tuoi file. Non hai ancora un ramo di salvataggio e non hai cambiato nient'altro.

Tutto è locale e nel piano gratuito (GitTree ti chiede di accedere): nessun account di hosting, nessun provider, niente Internet. Ogni identità è fittizia (esempio.com). Non eseguire mai questa lezione in un progetto reale. L'hard reset nella preparazione è una prova in copia usa e getta.

Apporta le modifiche in GitTree o con i comandi Git nativi, non entrambi nella stessa copia. Leggere il risultato è sempre sicuro. Le etichette dei menu provengono dalle stringhe proprie di GitTree 2.0 e i comandi nativi sono stati eseguiti con Git 2.43 in copie usa e getta. I passaggi GitTree non sono stati eseguiti su macOS, Windows o Linux.

Effetti del concetto e dello stato

Il reflog è un diario locale dei movimenti degli arbitri. HEAD ne ha uno, così come ogni ramo. Registra "commit", "checkout", "reset" e simili, con il commit su cui è arrivato ciascuno. Un altro clone non ha il tuo diario. Un commit in cui non possono ancora esistere nomi di rami e il reflog è il modo in cui lo trovi.

Selettori come HEAD@{1} contano le voci a ritroso da adesso, quindi cambiano con ogni operazione successiva. Leggi l'azione, l'ora, l'ID e il file di un candidato prima di utilizzarlo. Non memorizzare un offset come ricetta.

Il reflog trova i commit che sono stati salvati. Non è possibile trovare una modifica che non sia mai stata confermata, come ha mostrato la lezione 27. Le voci scadono: per impostazione predefinita Git conserva le voci per i commit che nessun ramo raggiunge per circa trenta giorni e un repository può modificarlo. Non eseguire comandi di pulizia o di scadenza durante il ripristino.

La creazione di un ramo al commit aggiunge un riferimento e nient'altro. Il ramo corrente, l'indice e i tuoi file rimangono dove sono.

Preparare lo stato esatto del progetto

Inizia da una copia ordinaria separata del risultato M della lezione 18 e lascia intatto il tuo originale. Crea il ramo, salva DOC_LOST, esegui il commit e ripristina un commit. Questa preparazione distruttiva è solo per una copia usa e getta.

Completare gli input del file

Risparmia solo nella fase denominata di seguito. Questi sono corpi UTF-8/LF completi con un ritorno a capo finale; non incollare mai le recinzioni Markdown. I file eseguibili non modificati ereditano l'input denominato. Le versioni in varianti separate non devono sovrascrivere l'originale.

docs/signup-recovery.md — DOC_LOST

Uscita
# Recovered signup work

Keep a branch name before leaving useful experimental work.

Tra GitTree

Apri la tavolozza con Comando+Maiusc+P (Ctrl+Maiusc+P su Ubuntu).

  1. Costruisci la prova come mostra la sezione successiva e annota l'oggetto del commit perduto.
  2. Apri la tavolozza ed esegui View Reflog…. La finestra di dialogo "Reflog" si apre con Reflog of impostato su HEAD; le voci vengono elencate per prime.
  3. Leggi le voci più importanti. Il più recente dice "reimposta" e quello sotto dice "impegna" con oggetto "documenti: mantieni la nota di ripristino della registrazione". Utilizza Show Older Entries se l'elenco è lungo. Non dare per scontato che la seconda riga sia sempre quella giusta.
  4. Seleziona la voce di commit. La finestra di dialogo mostra Show in Graph e New branch name. Show in Graph può inserire solo un commit raggiunto da un ramo, quindi per questo commit perso chiude la finestra di dialogo e il grafico rimane su M: riapre il reflog per il passaggio successivo. Leggi il file del commit dopo averlo ripristinato.
  5. Tornando alla finestra di dialogo, seleziona la stessa voce, digita rescue/signup in New branch name e scegli Restore as Branch. L'avviso dice "Creato salvataggio/registrazione del ramo. Annulla lo rimuove di nuovo".
  6. Controlla il risultato: rescue/signup punti al commit perso, il ramo corrente è ancora private/lost-signup su M e i tuoi file sono invariati. Seleziona il commit ripristinato e apri il suo file docs/signup-recovery.md: è DOC_LOST.
  7. Lasciare il ramo di salvataggio sul posto. Non eseguire alcuna pulizia per riordinare il grafico.

Per ogni commit ordinario nel corso: Summary è l'oggetto dichiarato, Description è vuoto e le opzioni Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit e Allow Empty Commit rimangono disattivate.

Nel terminale

Solo in una copia separata e pulita del risultato della lezione 18:

Command · bash
git switch --create private/lost-signup

Salva DOC_LOST come docs/signup-recovery.md, quindi:

Command · bash
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 HEAD
Uscita
reset: moving to HEAD~1
commit: docs: keep the signup recovery note

Elenca i candidati con i loro documenti d'identità e controlla quello che ritieni sia perso:

Command · bash
git reflog show --format='%H %gs' HEAD
git show "<lost-sha>:docs/signup-recovery.md"

Sostituisci <lost-sha> con l'ID nella riga "commit: docs: keep the signup recovery note". In questo esempio immediato HEAD@{1} è lo stesso commit, ma quell'offset non è una regola. Crea il ramo di salvataggio senza verificarlo:

Command · bash
git branch rescue/signup "<lost-sha>"
git show rescue/signup:docs/signup-recovery.md
git symbolic-ref --short HEAD
git status --short

Il file è DOC_LOST, il ramo stampato è private/lost-signup e lo stato è vuoto. I tuoi file non mostrano la nota, perché HEAD è rimasto su M. Nessun comando di scadenza o pulizia ne fa parte.

Risultato

Where you end: rescue/signup punta al commit perduto e il suo file è DOC_LOST. Il ramo corrente, l'indice e i tuoi file sono esattamente come erano dopo il ripristino e non è stato inviato nulla.

Errori comuni

  • Utilizzo di HEAD@{1} come ricetta fissa invece di leggere la voce.
  • Reimpostare o eseguire nuovamente il check-out prima di salvare un ramo, che aggiunge più voci e seppellisce quella desiderata.
  • Mi aspetto che il reflog contenga una modifica che non è mai stata confermata.
  • Esecuzione di comandi di pulizia mentre cerchi qualcosa.

Se qualcosa va storto

Se il commit non è nell'elenco, potresti guardare il riferimento sbagliato: cambia Reflog of tra HEAD e il ramo e usa Show Older Entries. Se è veramente scomparso, è scaduto o non è mai stato impegnato. Nell'app, l'avviso dopo Restore as Branch dice che Annulla rimuove nuovamente il ramo.

Controlla la tua comprensione

Rispondi a ciascuna domanda, quindi leggi il motivo. Le domande contrassegnate come "Obbligatorio" contano ai fini del completamento della lezione.

  1. Domanda 1 di 6

    Cos'è il reflogging?

    Scegli una risposta.

  2. Domanda 2 di 6

    Quali di queste sono vere per il reflog?

    Scegli ogni risposta applicabile.

  3. Domanda 3 di 6
    Obbligatorio

    Hai trovato il commit perduto nel reflog e hai utilizzato Ripristina come ramo con il nome rescue/signup. Cosa vedi?

    Scegli una risposta.

  4. Domanda 4 di 6

    Cambia l'input: non hai mai confermato la nota e quindi hai eseguito l'hard reset. Il reflog può riportarlo indietro?

    Scegli una risposta.

  5. Domanda 5 di 6
    Obbligatorio

    Hai eseguito ancora qualche operazione, quindi hai eseguito git branch rescue HEAD@{1} e il file non è quello che volevi. Quello che è successo?

    Scegli una risposta.

  6. Domanda 6 di 6
    Obbligatorio

    Dopo aver creato il ramo di salvataggio, quali riletture mostrano che ha funzionato come dice la lezione?

    Scegli ogni risposta applicabile.

0 di 6 corretto

Rispondi correttamente alle domande richieste per completare la lezione.

Controllato in questo browser.

Pratica

Riporta le due righe di reflog più recenti, l'ID del commit perso, la prima riga del file recuperato e il ramo su cui si trova il tuo checkout. Quindi dì cosa mostrerebbe il reflog per una modifica che non hai mai eseguito.

La tua conferma: il sito non può vedere il tuo computer.

Per completare la lezione rispondere correttamente alle domande richieste e confermare l'esercizio pratico.

Riepilogo

  • Il reflog è un diario locale dei movimenti degli arbitri.
  • Controllare il candidato, quindi diramarlo.
  • Trova i commit, non le modifiche non salvate.

Termini del glossario introdotti

Reflog — سجل المراجع; ramo di salvataggio: فرع حفظ; selettore — محدِّد.

Trascrizione video

La narrazione del video, spunto per spunto.

Mostra la trascrizione
  1. Un commit sembra andato. Git ricorda ancora dov'era.
  2. Il reflog è un diario locale di cui HEAD e i rami sono stati.
  3. Un commit senza nomi di rami può ancora essere elencato in esso.
  4. In una copia usa e getta: commetti una nota e quindi reimpostarlo manualmente.
  5. Il grafico mostra solo M. La nota è non si vede da nessuna parte.
  6. Non reimpostare o pulire adesso. Guarda prima.
  7. Apri la tavolozza ed esegui Visualizza Reflog.
  8. La finestra di dialogo si apre su HEAD. La mossa più recente è il primo.
  9. La riga più recente è il ripristino. Appena sotto è il commit perso.
  10. Se l'elenco è lungo, mostra le voci più vecchie.
  11. È possibile alternare tra HEAD e ramo.
  12. Non memorizzare HEAD all'una. Leggi la voce invece.
  13. Seleziona la voce di commit. Nuove scelte apparire.
  14. Mostra nel grafico non può posizionarlo: nessun ramo raggiunge questo commit.
  15. Quindi ripristinalo prima come ramo, quindi leggi il suo file.
  16. Torna indietro e seleziona la stessa voce.
  17. Assegna un nome al ramo di salvataggio tramite la barra "Iscrizione".
  18. Ripristinalo come ramo. Lo dice l'avviso annulla lo rimuove di nuovo.
  19. Il ramo di salvataggio è sul commit perduto. Sei ancora su M.
  20. I tuoi file non sono cambiati.
  21. Nel terminal ci sono le due linee più recenti il ripristino e il commit.
  22. Con gli ID, prendiamo il commit in base alla sua riga.
  23. git show con un percorso da cui legge il file che si impegna.
  24. git branch crea il ramo di salvataggio. Il nostro la cassa rimane ferma.
  25. Lo stato è vuoto e il file è sicuro sul ramo.
  26. Una modifica che non è mai stata confermata non è inclusa il reinserimento.
  27. Le iscrizioni scadono. Non eseguire la pulizia mentre ti riprendi.
  28. È locale. Gli altri cloni non hanno il tuo diario.
  29. Esercizio: riportare le linee, l'ID, il prima riga e il ramo.
  30. Successivamente, Annulla e Ripeti di GitTree.