Lezione 27 · Recupero
Reset: morbido, misto e duro
Sposta un ramo indietro di un commit in tre modi e guarda cosa fa ciascuna modalità al ramo, all'area di staging e ai tuoi file, in modo da scegliere quello che mantiene il lavoro che desideri.
- Livello: Avanzato
- 12 minuti di lettura
- 6 minuti di video
- Aggiornato
- Prima di questa lezione: Prevedi cosa conterrà il tuo prossimo commit, Leggi la cronologia senza muovere la TESTA
Avanzamenti salvati in questo browser.
La riproduzione carica il video da YouTube (modalità ottimizzata per la privacy).
Cosa imparerai
- Di' cosa sposta ciascuna modalità di ripristino: il ramo, l'indice e i file sul disco.
- Proteggi il lavoro impegnato e il lavoro non impegnato prima di una modalità distruttiva.
- Leggi l'output di stato che ciascuna modalità lascia dietro di sé.
- Scopri quali file possono essere sovrascritti da un hard reset, compresi quelli non tracciati.
Prima di iniziare
Ti trovi su private/reset, un ramo che inizia nella pagina unita M della lezione 18 ("Vedi chiaramente il tuo lavoro."). Ha un commit sopra M, C, che modifica l'intestazione in "Rivedi le modifiche con sicurezza". Un ramo rescue/before-reset punta già a C. Dopo aver effettuato il commit, hai modificato nuovamente la pagina, per "Comprendere ogni modifica salvata.", e non l'hai messa in stage o impegnata. Hai anche una nota non tracciata, docs/signup-hint.md. Vuoi riportare private/reset su M.
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. La copia hard reset è 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
Un ripristino sposta il ramo corrente su un altro commit. La modalità decide quanto più tocca. Soft sposta solo il ramo: l'indice e i tuoi file rimangono com'erano, quindi la differenza si manifesta come modifiche graduali. Mixed sposta il ramo e sostituisce l'indice con la destinazione: i tuoi file rimangono, quindi la differenza viene visualizzata come modifiche non graduali. Hard sposta il ramo, sostituisce l'indice e riscrive i file tracciati nella destinazione. Le modifiche non salvate ai file tracciati sono scomparse.
Il ramo di salvataggio mantiene il commit C, quindi è possibile ritrovare l'intestazione impegnata. Non mantiene la modifica più recente, che non è mai stata confermata. I commit possono essere trovati tramite il reflog; le modifiche non salvate non possono, perché non sono mai state in Git. Proteggili tu stesso prima di qualsiasi modalità distruttiva.
L'hard reset sovrascrive anche un file non tracciato quando la destinazione ha un file tracciato nello stesso percorso. Un file non tracciato che non è d'intralcio, come docs/signup-hint.md qui, viene lasciato solo. Questa è un'osservazione su questo progetto, non una promessa su ogni file non tracciato.
In tutte e tre le modalità il ramo è l'unico riferimento che si sposta: rescue/before-reset, gli altri rami e qualsiasi cosa su un server rimangono com'erano.
GitTree chiede per primo. La finestra di dialogo di ripristino dice cosa rimarrà e, per un hard reset, dice che tutto ciò che rimuove viene prima salvato in refs/ogt/trash in modo che Annulla possa ripristinarlo. Un'esecuzione di ripristino nel terminale non crea tale istantanea.
Preparare lo stato esatto del progetto
Inizia da una copia ordinaria separata del risultato unito M della lezione 18 e lascia intatto il tuo originale. Crea il ramo, salva SARA come commit dell'intestazione e dirama il riferimento di salvataggio su di esso. Quindi salva OMAR unstaged e DOC_HINT come nuovo file. Conserva una copia di OMAR e della nota fuori Git, quindi crea tre copie identiche, una per soft, mixed e hard.
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.
index.html — UNISTO
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>indice.html — SARA
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Review changes with confidence.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>indice.html — OMAR
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Understand each saved change.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>docs/signup-hint.md — DOC_HINT
Unfinished signup hint: use fictional data only.Tra GitTree
Apri la tavolozza con Comando+Maiusc+P (Ctrl+Maiusc+P su Ubuntu). Il ripristino si trova nel menu di scelta rapida del commit, nel sottomenu Reset private/reset to This Commit.
- Costruisci il ramo, il riferimento di salvataggio, la modifica non messa in scena e la nota come mostra la sezione successiva. Conserva una copia della modifica e della nota all'esterno di Git. Crea tre copie identiche e aprile in tre schede.
- Soft copy. Nel grafico, fai clic con il pulsante destro del mouse su M (il commit sotto C, non il suggerimento del ramo) e apri Reset private/reset to This Commit. Scegli Soft: Keep All Changes Staged. La finestra di dialogo di conferma dice che ogni modifica da allora rimane in scena e nessuna modifica ai file. Scegli Reset private/reset.
- Controlla il risultato software: il ramo è su M, la pagina sul disco dice ancora "Comprendi ogni modifica salvata." e gli elenchi con stage e non con stage contengono entrambi
index.html. - Mixed copy. Scegli Mixed: Keep Changes in the Working Folder su M. La finestra di dialogo dice che ogni modifica rimane nella tua copia di lavoro, senza stage. Scegli Reset private/reset. Il ramo è su M, la pagina su disco è la stessa modifica e la modifica è solo senza stage.
- Hard copy. Solo dopo aver salvato la modifica e la nota altrove, scegli Hard: Discard All Changes… su M. La finestra di dialogo è un avviso: elenca ciò che è stato rimosso e dice che viene prima mantenuto sotto
refs/ogt/trash. Leggilo. L'impostazione predefinita è Annulla. Scegli Discard and reset private/reset. - Controlla il risultato finale: il ramo è su M, la pagina è l'intestazione di M e l'elenco delle modifiche mostra solo la nota non tracciata. L'avviso dice "Reimposta su" e il commit.
- Confronta le tre copie e
rescue/before-reset, che è ancora su C. Non spingerne nessuna.
I comandi di ripristino sono disabilitati sul commit su cui è già presente il ramo e quando nessun ramo è stato estratto.
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
In una copia separata del risultato della lezione 18:
git switch --create private/resetSalva SARA come index.html, quindi:
git add -- index.html
git commit --quiet -m "feat: reset snapshot example"
git branch rescue/before-resetSalva OMAR come index.html senza gestione temporanea e DOC_HINT come docs/signup-hint.md. Conserva una copia di entrambi all'esterno di Git, quindi crea tre copie identiche. In ognuno:
TARGET_SHA="$(git rev-parse rescue/before-reset^)"Solo copia digitale:
git reset --quiet --soft "$TARGET_SHA"Solo copia mista:
git reset --quiet --mixed "$TARGET_SHA"Solo copia cartacea, nella sua copia usa e getta:
git reset --quiet --hard "$TARGET_SHA"In ogni copia leggi:
git rev-parse HEAD
git show :index.html
git status --shortOgni HEAD è M. L'indice contiene SARA dopo soft e la pagina di M dopo mixed e hard. Il file su disco è OMAR dopo soft e mixed e M's page dopo hard. Gli stati erano:
Morbido:
MM index.html
?? docs/signup-hint.mdMisto:
M index.html
?? docs/signup-hint.mdDifficile:
?? docs/signup-hint.mdIl ripristino del terminale non ha creato alcuna istantanea GitTree. git reflog elenca ancora C, ma OMAR non è presente da nessuna parte. In un lab di backup separato, un hard reset su un commit con un docs/signup-hint.md tracciato ha sovrascritto un file non tracciato in quel percorso.
Risultato
Where you end: tutti e tre i rami sono su M. Soft: l'indice contiene SARA e il file contiene OMAR. Misto: l'indice contiene M e il file contiene OMAR. Difficile: entrambi tengono M. La nota non tracciata rimane in ciascuna copia e rescue/before-reset è ancora su C.
Errori comuni
- Trattare il ramo di salvataggio come backup del lavoro più nuovo e non impegnato.
- Utilizzo dell'hard reset per riordinare un checkout senza prima salvare le modifiche.
- Mi aspetto che il soft reset non lasci nulla in scena.
- Reimpostare un ramo che hai già inviato, quindi spostarlo sul lavoro di un compagno di squadra.
Se qualcosa va storto
Usa il riferimento di salvataggio per ritrovare l'intestazione impegnata e le tue copie esterne per la modifica e la nota. In GitTree, un hard reset effettuato tramite l'app ha salvato prima un'istantanea, quindi Annulla può ripristinarla. Un ripristino effettuato nel terminale no.
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
Esegui le tre riletture in ciascuna copia e riempi una tabella: dove punta il ramo, cosa contiene l'indice, cosa contiene il file. Quindi dì quale modalità utilizzeresti per ripetere il messaggio del commit, quale per rimuovere tutto dallo stage e quale per scartare tutto.
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
- Soft sposta solo il ramo.
- Anche il misto reimposta l'indice.
- Hard riscrive anche i tuoi file.
Relativo
Termini del glossario introdotti
Ripristina — إعادة تعيين; morbido: ناعمة; misto: مختلطة; duro: كاملة; ramo di salvataggio — فرع حفظ.
Trascrizione video
La narrazione del video, spunto per spunto.
Mostra la trascrizione
- Sposta indietro un ramo e scegli quanto altrimenti cambia.
- Soft sposta il ramo. Misto aggiunge il indice. Hard aggiunge i tuoi file.
- Quindi la differenza è messa in scena, non messa in scena o andato.
- Costruisci un inizio: un impegno, un salvataggio ramo, una modifica non salvata e una nota.
- Fai tre copie identiche e scrivi giù l'ID di M.
- La modifica non è mai stata confermata. Conservane una copia fuori Git.
- Il grafico mostra M, poi C e il salvataggio ramo su C.
- Fare clic con il tasto destro su M, aprire il sottomenu di ripristino e scegli Morbido.
- La finestra di dialogo dice che ogni cambiamento rimane graduale, e nessuna modifica al file.
- La filiale è su M ora. C è ancora sul ramo di salvataggio.
- L'elenco organizzato ha il vecchio commit. Il l'elenco non organizzato ha la tua modifica.
- Il file sul disco contiene ancora la tua modifica.
- Copia mista: stesso menu, scegli Misto.
- Questa finestra di dialogo dice che le modifiche rimangono, non messo in scena.
- Ora index.html è solo senza stage.
- La tua modifica è ancora nel file.
- Prima di tutto, salva la modifica e la nota da qualche altra parte.
- Copia cartacea: scegli Difficile, con i punti quello significa un avvertimento.
- La finestra di dialogo elenca ciò che è stato rimosso e dice viene salvato prima. Annulla è l'impostazione predefinita.
- Scegli scarta e ripristina.
- È rimasta solo la nota. La pagina è di M di nuovo.
- Nel terminale, la prima lettura è il impegnarsi. Tutti e tre sono M.
- git show con i due punti legge l'indice. Soft mantiene la vecchia pagina.
- Lo stato è diverso in ogni copia.
- Il ramo di salvataggio è ancora sul vecchio impegnarsi.
- E il file su disco: la tua modifica due volte, M's dirigendosi una volta.
- Modificare l'input: nessuna copia esterna e difficile nel terminale.
- Il reflog elenca i commit. La modifica non salvata non c'è da nessuna parte.
- E sovrascrive duramente un file non tracciato, se il bersaglio ne ha uno lì.
- Morbidi e misti non perdono nulla. Difficile nel l'app viene salvata per prima.
- Esercizio: compilare una tabella di ramo, indice e file per ciascuna modalità.
- Successivamente, annulla un commit condiviso senza riscrivere la storia, con revert.