Lezione 30 · Recupero
GitTree Annulla, ripristina e istantanee di ripristino
Annulla un commit dalla barra degli strumenti di GitTree, ripetilo e scopri cosa l'app può e non può ripristinare, quando rifiuta e perché conserva gli snapshot di ripristino.
- Livello: Intermedio
- 9 minuti di lettura
- 6 minuti di video
- Aggiornato
- Prima di questa lezione: Reset: morbido, misto e duro, Trova un commit perso con reflog
Avanzamenti salvati in questo browser.
La riproduzione carica il video da YouTube (modalità ottimizzata per la privacy).
Cosa imparerai
- Leggi cosa farebbe il prossimo Annulla o Ripeti prima di premerlo.
- Prevedi che l'annullamento di un commit manterrà le sue modifiche in fase e che Redo potrà ripristinare il commit.
- Riconosci il motivo per cui l'app rifiuta un'operazione Annulla o Ripeti: il ramo è stato spostato, i file sono stati modificati, un telecomando è stato modificato.
- Scopri cosa sono gli snapshot di ripristino e come eliminare deliberatamente quelli vecchi.
Prima di iniziare
Ti trovi su private/undo-demo, un ramo del risultato M della lezione 18 con un albero di lavoro pulito. Creerai una piccola nota, docs/signup-recovery.md, e la committerai through GitTree, perché l'annullamento di GitTree funziona dai passaggi che registra da solo. Un commit effettuato in un terminale è una cosa diversa e non rientra in quel record.
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.
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, i suggerimenti e gli avvisi provengono dalle stringhe e dalla fonte di GitTree 2.0. I comandi nativi sono stati eseguiti con Git 2.43 in copie usa e getta e mostrano solo il modello Git, non il record dell'app. I passaggi GitTree non sono stati eseguiti su macOS, Windows o Linux.
Effetti del concetto e dello stato
GitTree conserva un journal dei passaggi eseguiti. Annulla inverte il passaggio più recente e Ripeti ripete l'ultimo passaggio annullato. La descrizione comando della barra degli strumenti assegna un nome al passaggio, ad esempio "Annulla: commit...". Leggilo prima: se nomina qualcosa di diverso da quello che ti aspetti, fermati.
Prima di un passaggio distruttivo, GitTree salva un recovery snapshot in refs/ogt/trash/* e scrive la voce del diario. Annulla i ripristini da quel record e solo se da allora non è cambiato nulla: un ramo viene spostato indietro solo se punta ancora al punto in cui lo ha lasciato il passaggio e i file vengono ripristinati solo se nessuno li ha modificati successivamente. Altrimenti l'annullamento viene rifiutato con una motivazione e l'istantanea viene conservata.
L'annullamento di un commit sposta il ramo indietro e mantiene le modifiche salvate, quindi nulla va perso. La ripetizione di quel commit sposta nuovamente il ramo in avanti allo stesso commit. Non tutti i passaggi possono essere ripetuti e alcuni non possono essere annullati: una spinta forzata ha cambiato un telecomando ("premi di nuovo per ripristinarlo"); una scorta eliminata viene conservata come istantanea ma non ancora annullata; il primo commit non ha uno stato precedente. Un passaggio interrotto parzialmente non presenta alcun risultato completo da annullare.
Le istantanee non vengono eliminate in base a una pianificazione. Il comando Delete Old Recovery Snapshots… ti consente di scegliere un'età, mostra esattamente quali istantanee sono più vecchie ed elimina solo quelle dopo la conferma. L'eliminazione di uno snapshot rimuove il percorso indietro per quel passaggio.
Annulla e Ripeti modificano solo il repository locale. Non viene pubblicato nulla.
Preparare lo stato esatto del progetto
Inizia da una copia ordinaria separata del risultato M della lezione 18 di cui ti fidi e lascia intatto il tuo originale. Crea il ramo e prendi la nota. DOC_LOST è il contenuto della nota.
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). Undo e Redo sono nella barra degli strumenti e nella tavolozza; le scorciatoie sono Comando+Z per Annulla e Comando+Maiusc+Z o Comando+Y per Ripeti (Ctrl su Windows e Linux).
- In una copia separata, crea il ramo
private/undo-demoe salva DOC_LOST comedocs/signup-recovery.md. Apri l'elenco delle modifiche: il file è nuovo. - Metti in stage solo quel file e committalo con il Riepilogo
docs: demonstrate a reversible local commit. Aspetta il risultato reale. - Passa il mouse su Undo nella barra degli strumenti. La descrizione comando recita "Annulla: commit...". Se indica un altro passaggio, fermati: non annullare qualcosa che non avevi intenzione di fare.
- Scegli Undo una volta. L'avviso dice "Annulla: commit". Il ramo è tornato su M e la nota è staged, non eliminata.
- Passa il mouse su Redo. La descrizione comando recita "Ripeti: commit...". Scegli Redo una volta. L'avviso dice "Redid: commit". Il commit è tornato e l'albero di lavoro è pulito.
- Separate stale-state copy. In una seconda copia, ripeti i passaggi da 1 a 4, quindi, all'esterno di GitTree, conferma la nota preparata con
git commit -m "docs: external move after app undo". Guarda Redo: è disabilitato e il suo motivo è "Il ramo si è spostato da allora; l'annullamento sovrascriverebbe quella modifica." Non forzarlo. - Apri la tavolozza ed esegui Delete Old Recovery Snapshots…. Lascia Older than (days) a 30 e scegli Find. Leggi cosa dice l'elenco: "Nessuna istantanea è così vecchia". o un elenco di quelli vecchi. Chiudi la finestra di dialogo; non cancellare nulla per finire la lezione.
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
Il terminale non utilizza il journal dell'app. Questo è il semplice modello Git di ciò che fa il commit undo, in una different copia pulita del risultato della lezione 18:
git switch --create private/undo-demo
BEFORE_SHA="$(git rev-parse HEAD)"Salva DOC_LOST come docs/signup-recovery.md, quindi:
git add -- docs/signup-recovery.md
git commit --quiet -m "docs: demonstrate a reversible local commit"
AFTER_SHA="$(git rev-parse HEAD)"
git reset --soft "$BEFORE_SHA"
git status --shortA docs/signup-recovery.mdIl ramo è tornato e il file è messo in scena. Andiamo avanti ancora:
git reset --soft "$AFTER_SHA"
git status --shortLo stato è vuoto. Questi comandi not chiamano l'annullamento o il ripristino dell'app, registrano una GitTree voce del diario o creano un'istantanea; git for-each-ref refs/ogt/trash non stampa nulla in questa copia. In una ripresa creata dall'app elenca i nomi reali delle istantanee, che puoi leggere senza modificarli.
La guardia contro un passo stantio è un confronto e scambio. Git ha la stessa idea in update-ref, che sposta un riferimento solo se contiene ancora il valore previsto. Dopo un commit esterno:
git update-ref refs/heads/private/undo-demo "$AFTER_SHA" "$BEFORE_SHA"Git rifiuta con "impossibile bloccare il riferimento... è a... ma previsto...". Il rifiuto di GitTree è quello nel tooltip: "Il ramo si è spostato da allora; l'annullamento sovrascriverebbe quella modifica."
Risultato
Where you end: nella prima copia la nota è stata confermata, annullata (messa in scena, ramo su M) e rifatta (ramo sul commit, albero pulito). Nella copia obsoleta, Redo è stato rifiutato perché il ramo è stato spostato e il commit esterno è stato lasciato intatto. Hai aperto la finestra di dialogo dell'istantanea e l'hai chiusa senza eliminare nulla.
Errori comuni
- Premendo Annulla senza leggere la descrizione comando e annullando un passaggio non previsto.
- Supponendo che ogni azione possa essere annullata o ripetuta: una spinta forzata e una scorta eliminata non lo sono e la maggior parte dei passaggi non prevede la ripetizione.
- È previsto l'annullamento per coprire le modifiche apportate in un editor esterno a GitTree.
- Eliminazione di vecchie istantanee per riordinare, il che rimuove la via del ritorno.
Se qualcosa va storto
Se Annulla è disabilitato, leggi il motivo nella descrizione comando: il ramo è stato spostato, i file sono stati modificati da allora, è stato cambiato un telecomando o non c'è nulla da annullare. Se un passaggio viene rifiutato, la sua istantanea di ripristino viene conservata in refs/ogt/trash/*; non eliminarlo se non sei sicuro. Per i commit effettuati al di fuori di GitTree, utilizza il reflog della lezione 29.
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
Annota cosa dice il tooltip Annulla, come apparivano il ramo e l'elenco in scena dopo Annulla e cosa ha fatto Ripeti. Nella copia vecchia, scrivi il motivo fornito da Redo. Quindi indica un passaggio che l'app non può annullare e spiega il motivo.
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
- Leggere la descrizione comando prima di premere.
- L'annullamento di un commit mantiene le modifiche in fase.
- Un ramo spostato o un file modificato fanno sì che l'annullamento venga rifiutato; vengono conservate le istantanee.
Relativo
Termini del glossario introdotti
Annulla: تراجع; Ripeti: إعادة; giornale: سجل العمليات; istantanea di ripristino: لقطة استعادة.
Trascrizione video
La narrazione del video, spunto per spunto.
Mostra la trascrizione
- GitTree può fare qualche passo indietro. Ecco come e dove si ferma.
- GitTree tiene un diario dei propri passi. Annulla inverte quello più recente.
- Prima di un passo rischioso, si salva una ripresa prima un'istantanea.
- Abbiamo un ramo e una nuova nota.
- Metti in scena solo quel file.
- Scrivi il riassunto. Tutte le opzioni rimangono spento.
- Impegnati una volta, in GitTree stesso.
- Un commit effettuato in un terminale non è presente in questo registrare.
- Passa il mouse su Annulla. La descrizione comando nomina il passaggio: impegnarsi.
- Se nomina qualcos'altro, fermati.
- Scegli Annulla una volta. L'avviso dice che è stato annullato impegnarsi.
- La filiale è tornata su M.
- E la nota viene messa in scena, non cancellata. Niente è perduto.
- Ora Redo nomina lo stesso commit.
- Scegli Ripeti una volta. L'impegno è tornato.
- L'albero di lavoro è di nuovo pulito.
- In una seconda copia, commettiamo e annulliamo il file allo stesso modo.
- Ora affida la nota messa in scena all'esterno GitTree.
- La ripetizione è disabilitata. Da allora la filiale si è trasferita.
- Lascia da solo il tuo impegno. Non forzare mai esso.
- Altri motivi: file modificati, telecomando cambiato, il primo commit.
- Ora le istantanee. Esegui Elimina vecchio ripristino Istantanee.
- Dice che solo le istantanee elencate lo sono cancellato.
- Lascia trenta giorni e scegli Trova.
- Chiudilo. Niente scade da solo.
- In una semplice copia Git, viene fornito un soft reset la stessa forma.
- Avanti ancora, l'albero è pulito e non esiste un'istantanea dell'app.
- Git protegge un rif allo stesso modo: spostalo solo se contiene ciò che ti aspetti.
- L'annullamento non è un riavvolgimento globale. Si inverte passaggi registrati dall'app.
- Esercizio: scrivere il tooltip, il risultato dell' Annulla, Ripeti e il motivo obsoleto.
- Successivamente, cosa significa una TESTA distaccata.