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.
- Livello: Avanzato
- 8 minuti di lettura
- 5 minuti di video
- Aggiornato
- Prima di questa lezione: Reset: morbido, misto e duro
Avanzamenti salvati in questo browser.
La riproduzione carica il video da YouTube (modalità ottimizzata per la privacy).
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
# 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).
- Costruisci la prova come mostra la sezione successiva e annota l'oggetto del commit perduto.
- 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.
- 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.
- 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.
- Tornando alla finestra di dialogo, seleziona la stessa voce, digita
rescue/signupin New branch name e scegli Restore as Branch. L'avviso dice "Creato salvataggio/registrazione del ramo. Annulla lo rimuove di nuovo". - Controlla il risultato:
rescue/signuppunti al commit perso, il ramo corrente è ancoraprivate/lost-signupsu M e i tuoi file sono invariati. Seleziona il commit ripristinato e apri il suo filedocs/signup-recovery.md: è DOC_LOST. - 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:
git switch --create private/lost-signupSalva DOC_LOST come docs/signup-recovery.md, quindi:
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 noteElenca i candidati con i loro documenti d'identità e controlla quello che ritieni sia perso:
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:
git branch rescue/signup "<lost-sha>"
git show rescue/signup:docs/signup-recovery.md
git symbolic-ref --short HEAD
git status --shortIl 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.
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.
Relativo
Termini del glossario introdotti
Reflog — سجل المراجع; ramo di salvataggio: فرع حفظ; selettore — محدِّد.
Trascrizione video
La narrazione del video, spunto per spunto.
Mostra la trascrizione
- Un commit sembra andato. Git ricorda ancora dov'era.
- Il reflog è un diario locale di cui HEAD e i rami sono stati.
- Un commit senza nomi di rami può ancora essere elencato in esso.
- In una copia usa e getta: commetti una nota e quindi reimpostarlo manualmente.
- Il grafico mostra solo M. La nota è non si vede da nessuna parte.
- Non reimpostare o pulire adesso. Guarda prima.
- Apri la tavolozza ed esegui Visualizza Reflog.
- La finestra di dialogo si apre su HEAD. La mossa più recente è il primo.
- La riga più recente è il ripristino. Appena sotto è il commit perso.
- Se l'elenco è lungo, mostra le voci più vecchie.
- È possibile alternare tra HEAD e ramo.
- Non memorizzare HEAD all'una. Leggi la voce invece.
- Seleziona la voce di commit. Nuove scelte apparire.
- Mostra nel grafico non può posizionarlo: nessun ramo raggiunge questo commit.
- Quindi ripristinalo prima come ramo, quindi leggi il suo file.
- Torna indietro e seleziona la stessa voce.
- Assegna un nome al ramo di salvataggio tramite la barra "Iscrizione".
- Ripristinalo come ramo. Lo dice l'avviso annulla lo rimuove di nuovo.
- Il ramo di salvataggio è sul commit perduto. Sei ancora su M.
- I tuoi file non sono cambiati.
- Nel terminal ci sono le due linee più recenti il ripristino e il commit.
- Con gli ID, prendiamo il commit in base alla sua riga.
- git show con un percorso da cui legge il file che si impegna.
- git branch crea il ramo di salvataggio. Il nostro la cassa rimane ferma.
- Lo stato è vuoto e il file è sicuro sul ramo.
- Una modifica che non è mai stata confermata non è inclusa il reinserimento.
- Le iscrizioni scadono. Non eseguire la pulizia mentre ti riprendi.
- È locale. Gli altri cloni non hanno il tuo diario.
- Esercizio: riportare le linee, l'ID, il prima riga e il ramo.
- Successivamente, Annulla e Ripeti di GitTree.