Vai al contenuto
GitTree

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.

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

  • 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

Estratto del file · html
<!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

Estratto del file · html
<!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

Estratto del file · html
<!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

Uscita
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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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:

Command · bash
git switch --create private/reset

Salva SARA come index.html, quindi:

Command · bash
git add -- index.html
git commit --quiet -m "feat: reset snapshot example"
git branch rescue/before-reset

Salva 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:

Command · bash
TARGET_SHA="$(git rev-parse rescue/before-reset^)"

Solo copia digitale:

Command · bash
git reset --quiet --soft "$TARGET_SHA"

Solo copia mista:

Command · bash
git reset --quiet --mixed "$TARGET_SHA"

Solo copia cartacea, nella sua copia usa e getta:

Command · bash
git reset --quiet --hard "$TARGET_SHA"

In ogni copia leggi:

Command · bash
git rev-parse HEAD
git show :index.html
git status --short

Ogni 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:

Uscita
MM index.html
?? docs/signup-hint.md

Misto:

Uscita
 M index.html
?? docs/signup-hint.md

Difficile:

Uscita
?? docs/signup-hint.md

Il 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.

  1. Domanda 1 di 6

    Quale modalità di ripristino sposta solo il ramo e lascia l'indice e i file com'erano?

    Scegli una risposta.

  2. Domanda 2 di 6

    Quali di questi sono veri per un hard reset?

    Scegli ogni risposta applicabile.

  3. Domanda 3 di 6
    Obbligatorio

    Nella copia mista reimposti private/reset su M. Cosa stampa git status --short?

    Scegli una risposta.

  4. Domanda 4 di 6

    Modifica l'input: non hai salvato la modifica e la nota all'esterno di Git ed hai eseguito l'hard reset nel terminale. Da dove puoi recuperare la modifica?

    Scegli una risposta.

  5. Domanda 5 di 6
    Obbligatorio

    Dopo un ripristino, git status --short stampa MM index.html. Quale modalità è stata eseguita e cosa contiene l'indice?

    Scegli una risposta.

  6. Domanda 6 di 6
    Obbligatorio

    Dopo l'hard reset nella sua copia usa e getta, quali riletture mostrano che ha fatto ciò che 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

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.

Termini del glossario introdotti

Ripristina — إعادة تعيين; morbido: ناعمة; misto: مختلطة; duro: كاملة; ramo di salvataggio — فرع حفظ.

Trascrizione video

La narrazione del video, spunto per spunto.

Mostra la trascrizione
  1. Sposta indietro un ramo e scegli quanto altrimenti cambia.
  2. Soft sposta il ramo. Misto aggiunge il indice. Hard aggiunge i tuoi file.
  3. Quindi la differenza è messa in scena, non messa in scena o andato.
  4. Costruisci un inizio: un impegno, un salvataggio ramo, una modifica non salvata e una nota.
  5. Fai tre copie identiche e scrivi giù l'ID di M.
  6. La modifica non è mai stata confermata. Conservane una copia fuori Git.
  7. Il grafico mostra M, poi C e il salvataggio ramo su C.
  8. Fare clic con il tasto destro su M, aprire il sottomenu di ripristino e scegli Morbido.
  9. La finestra di dialogo dice che ogni cambiamento rimane graduale, e nessuna modifica al file.
  10. La filiale è su M ora. C è ancora sul ramo di salvataggio.
  11. L'elenco organizzato ha il vecchio commit. Il l'elenco non organizzato ha la tua modifica.
  12. Il file sul disco contiene ancora la tua modifica.
  13. Copia mista: stesso menu, scegli Misto.
  14. Questa finestra di dialogo dice che le modifiche rimangono, non messo in scena.
  15. Ora index.html è solo senza stage.
  16. La tua modifica è ancora nel file.
  17. Prima di tutto, salva la modifica e la nota da qualche altra parte.
  18. Copia cartacea: scegli Difficile, con i punti quello significa un avvertimento.
  19. La finestra di dialogo elenca ciò che è stato rimosso e dice viene salvato prima. Annulla è l'impostazione predefinita.
  20. Scegli scarta e ripristina.
  21. È rimasta solo la nota. La pagina è di M di nuovo.
  22. Nel terminale, la prima lettura è il impegnarsi. Tutti e tre sono M.
  23. git show con i due punti legge l'indice. Soft mantiene la vecchia pagina.
  24. Lo stato è diverso in ogni copia.
  25. Il ramo di salvataggio è ancora sul vecchio impegnarsi.
  26. E il file su disco: la tua modifica due volte, M's dirigendosi una volta.
  27. Modificare l'input: nessuna copia esterna e difficile nel terminale.
  28. Il reflog elenca i commit. La modifica non salvata non c'è da nessuna parte.
  29. E sovrascrive duramente un file non tracciato, se il bersaglio ne ha uno lì.
  30. Morbidi e misti non perdono nulla. Difficile nel l'app viene salvata per prima.
  31. Esercizio: compilare una tabella di ramo, indice e file per ciascuna modalità.
  32. Successivamente, annulla un commit condiviso senza riscrivere la storia, con revert.