Vai al contenuto
GitTree

Lezione 22 · Storia e integrazione

Riordina, schiaccia, riformula ed elimina i commit locali

Trasforma cinque commit privati grezzi in due puliti: sposta una correzione dipendente, riformula un messaggio, piega e schiaccia i passaggi, elimina solo il rumore e controlla che il risultato contenga esattamente i file che intendevi.

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 un piano di riproduzione: prima il passaggio più vecchio, applicato dall'alto verso il basso.
  • Scegli l'azione giusta: riformula, schiaccia, aggiusta o rilascia.
  • Sposta un passo senza interrompere il passo da cui dipende.
  • Successivamente verificare i nuovi commit, i file e il ramo di salvataggio.

Prima di iniziare

Il tuo ramo private/signup-polish ha cinque commit che esistono solo sul tuo computer, sopra il commit M. L'albero di lavoro è pulito e rescue/before-polish punta al quinto commit. In ordine, prima il più vecchio:

PassoImpegnarsiCosa fa
C1caratteristica: aggiungi bozza di iscrizioneaggiunge il modulo di registrazione
C2documenti: spiegare la revisione della registrazioneaggiunge docs/replay-a.md
C3documenti: spiegare la convalidaaggiunge docs/replay-b.md
C4sistemare! caratteristica: aggiungi bozza di iscrizionecorregge l'etichetta del modulo
C5lavoretto: nota temporaneaaggiunge docs/temporary-review.md

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 e non riscrivere mai i commit che altre persone hanno già.

Apporta le modifiche in GitTree o con i comandi Git nativi, non entrambi sulla 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 rebase interattivo è un piano, non un gioco di smistamento. Git riproduce i commit elencati uno per uno sulla base, dall'alto dell'elenco verso il basso, quindi il passaggio più vecchio viene prima. Ogni azione dice a Git cosa fare in un solo passaggio:

  • Pick mantiene il commit così com'è.
  • Reword mantiene il suo contenuto e ti consente di scrivere un nuovo messaggio.
  • Squash ripiega il commit nel commit mantenuto sopra di esso e ti consente di scrivere un messaggio combinato.
  • Anche Fixup lo ripiega, ma butta via il proprio messaggio.
  • Drop lascia completamente fuori la modifica del commit.

L'ordine conta. Un passaggio che dipende da un altro (qui la correzione dell'etichetta necessita del modulo da C1) deve rimanere sotto di esso. L'editor ti consentirà di spostarlo sopra, quindi il replay si fermerà con un conflitto. GitTree rifiuta anche i piani che Git non può eseguire: un piano che elimina ogni commit, uno squash senza nulla sopra in cui ripiegarsi e un messaggio vuoto.

Ogni commit riprodotto ottiene un nuovo ID, perché il suo genitore cambia. Solo questo ramo viene riscritto; il ramo di salvataggio mantiene i vecchi cinque. I commit già presenti su un remoto sono contrassegnati come "Su un remoto" e per riscriverli è necessaria una conferma esplicita. Questa lezione non lo conferma mai.

Il piano che costruirai trasforma cinque commit in due:

PassoImpegnarsiAzioneRisultato
1C1Riformulareimpresa: completa il modulo di registrazione locale
2C4Correzioneripiegato nel passaggio 1
3C3Sceglimantenuto; il bersaglio della zucca
4C2Zuccadocumenti: spiega la revisione e la convalida della registrazione
5C5Lascia cadereandato

Preparare lo stato esatto del progetto

Inizia da una copia ordinaria separata del progetto così come lo ha lasciato la lezione 18. Lascia intatto il tuo gittree-features originale. Costruisci i cinque commit seguenti su un nuovo ramo, un file alla volta, e salva ciascun corpo completo solo nel passaggio denominato.

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 — ISCRIVITI

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>
    <section aria-labelledby="signup-title">
      <h2 id="signup-title">Try the demo form</h2>
      <form id="signup-form" novalidate>
        <label for="demo-email">Demo email</label>
        <input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
        <p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
        <button type="submit">Check the address locally</button>
        <p id="signup-result" role="status"></p>
      </form>
    </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/replay-a.md — DOC_A

Uscita
# Local signup review

Review the label and hint together.

docs/replay-b.md — DOC_B

Uscita
# Local validation review

No address leaves this demonstration.

indice.html — SIGNUP_LABEL

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>
    <section aria-labelledby="signup-title">
      <h2 id="signup-title">Try the demo form</h2>
      <form id="signup-form" novalidate>
        <label for="demo-email">Fictional email address</label>
        <input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
        <p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
        <button type="submit">Check the address locally</button>
        <p id="signup-result" role="status"></p>
      </form>
    </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/temporary-review.md — DOC_NOISE

Uscita
Temporary rehearsal note, deliberately dropped.

Tra GitTree

Apri la tavolozza con Comando+Maiusc+P (Ctrl+Maiusc+P su Ubuntu). Le azioni su un commit utilizzano il menu di scelta rapida del commit.

  1. Costruisci i cinque commit e il ramo di salvataggio come mostra la sezione successiva, con private/signup-polish estratto e pulito. Nota M e i cinque soggetti.
  2. Fai clic con il pulsante destro del mouse su M, il commit appena sotto i cinque, e scegli Edit History → Interactive Rebase of the Commits Above…. L'editor si apre con i cinque passaggi privati, prima i più antichi.
  3. Sotto Options for this rebase lascia disattivate tutte e tre le opzioni, incluso Arrange fixup!, squash! and amend! commits. Sposterai tu stesso la correzione.
  4. Metti a fuoco la riga C4 e premi Alt+↑ due volte, quindi focalizza C3 e premi Alt+↑ una volta. L'ordine ora è C1, C4, C3, C2, C5. Premendo p, r, e, s, f o d su una riga selezionata si imposta Scegli, Riformula, Modifica, Squash, Correggi o Elimina.
  5. Imposta C1 su Reword e digita feat: complete the local signup form nel campo del messaggio. Imposta C4 su Fixup.
  6. Mantieni C3 su Pick e imposta C2 su Squash. Sotto Squashed commits il gruppo "2 commit in docs: spiega la validazione" mostra un messaggio combinato. Sostituiscilo con docs: explain signup review and validation.
  7. Imposta C5 su Drop. Leggi ancora una volta ogni riga e il messaggio combinato. Non c'è nulla contrassegnato come "Sul telecomando", quindi non è necessaria alcuna conferma.
  8. Scegli Start Rebase una volta e attendi. Se si interrompe utilizza il banner per proseguire; non ricominciare l'intero piano.
  9. Verifica due nuovi commit, l'etichetta corretta nella pagina, entrambi i documenti e nessuna nota temporanea. Mantieni rescue/before-polish e lascia pulito l'albero di lavoro.

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

Costruisci i cinque commit su un nuovo ramo, salvando ogni corpo completo al suo passaggio:

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

Salva ISCRIZIONE come index.html, quindi:

Command · bash
git add -- index.html
git commit --quiet -m "feat: add signup draft"

Salva DOC_A come docs/replay-a.md, quindi:

Command · bash
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"

Salva DOC_B come docs/replay-b.md, quindi:

Command · bash
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"

Salva SIGNUP_LABEL come index.html, quindi:

Command · bash
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"

Salva DOC_NOISE come docs/temporary-review.md, quindi:

Command · bash
git add -- docs/temporary-review.md
git commit --quiet -m "chore: temporary note"

Proteggi il vecchio suggerimento ed elenca l'intervallo, iniziando dal più vecchio:

Command · bash
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEAD

Ora avvia il rebase interattivo (-i è la forma abbreviata di --interactive). Git apre il tuo editor con l'elenco delle cose da fare (i tuoi ID saranno diversi):

Command · bash
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"
Uscita
pick 1a2b3c4 feat: add signup draft
pick 2b3c4d5 docs: explain signup review
pick 3c4d5e6 docs: explain validation
pick 4d5e6f7 fixup! feat: add signup draft
pick 5e6f708 chore: temporary note

Riscrivi le cinque righe nel piano, mantenendo il proprio ID di ciascuna riga, e salva:

Uscita
reword 1a2b3c4 feat: add signup draft
fixup 4d5e6f7 fixup! feat: add signup draft
pick 3c4d5e6 docs: explain validation
squash 2b3c4d5 docs: explain signup review
drop 5e6f708 chore: temporary note

Git quindi apre l'editor altre due volte. Per la riformulazione, sostituisci il messaggio con feat: complete the local signup form. Per la zucca mostra entrambi i messaggi; sostituiscili con una riga, docs: explain signup review and validation. Controlla il risultato:

Command · bash
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short
Uscita
2
feat: complete the local signup form
docs: explain signup review and validation

Lo stato è vuoto. index.html è SIGNUP_LABEL, entrambi i documenti esistono e docs/temporary-review.md no.

Se metti una zucca sulla prima riga, Git si ferma immediatamente con error: cannot 'squash' without a previous commit. Correggi l'elenco con git rebase --edit-todo e git rebase --continue o esci con git rebase --abort. Con --autosquash Git fa lo spostamento e l'azione per fixup! si impegna per te; questa lezione lo disattiva per mostrare il piano.

Risultato

Where you end: due commit riscritti sopra M, "feat: completa il modulo di registrazione locale" e "documenti: spiega la revisione e la convalida della registrazione". La pagina ha l'etichetta corretta, entrambi i documenti sono presenti e la nota temporanea no. I vecchi cinque commit sono conservati dal ramo di salvataggio e l'albero di lavoro è pulito.

Errori comuni

  • Utilizzo di Drop per nascondere un commit di cui potresti aver bisogno. Il cambiamento non è affatto nella nuova storia.
  • Spostare una correzione sopra il commit che corregge.
  • Schiacciare il primo gradino, che non ha nulla sopra in cui ripiegarsi.
  • Ricominciare il piano una volta terminato, invece di verificare prima il risultato.

Se qualcosa va storto

Prima di iniziare, Cancel lascia il ramo così com'è. Se GitTree dice che il ramo è cambiato dall'apertura dell'editor, chiudi l'editor e riaprilo. Se il rebase si interrompe, risolvi il conflitto o il messaggio e continua dal banner, oppure interrompilo deliberatamente. Al termine, confronta con rescue/before-polish prima di provare a ripristinare qualsiasi cosa.

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

    Nell'elenco delle cose da fare di un rebase interattivo, quale commit viene riprodotto per primo?

    Scegli una risposta.

  2. Domanda 2 di 6

    Quale di questi piani non può funzionare?

    Scegli ogni risposta applicabile.

  3. Domanda 3 di 6
    Obbligatorio

    Il piano è: riformulare C1, aggiustare C4, scegliere C3, schiacciare C2, eliminare C5. Dopo l'esecuzione, quanti commit sono superiori a M e dove va a finire il file della nota temporanea?

    Scegli una risposta.

  4. Domanda 4 di 6

    Cambia l'input: lasci C5 come Pick invece di Drop. Cosa c'è di diverso?

    Scegli una risposta.

  5. Domanda 5 di 6
    Obbligatorio

    Imposti il passaggio 1 su Squash e GitTree si rifiuta di iniziare: "Il passaggio 1 si schiaccia nel nulla: spostalo sotto un commit mantenuto." Cosa significa e cosa fai?

    Scegli una risposta.

  6. Domanda 6 di 6
    Obbligatorio

    Quali riletture dimostrano che il risultato è quello che il piano avrebbe dovuto produrre?

    Scegli ogni risposta applicabile.

0 di 6 corretto

Rispondi correttamente alle domande richieste per completare la lezione.

Controllato in questo browser.

Pratica

Spiega il piano C1, C4, C3, C2, C5 e i due messaggi che sopravvivono. Controlla il vecchio intervallo 5, il nuovo intervallo 2, i file previsti e nessuna nota. Quindi prevedere, senza eseguirlo, perché spostare C4 sopra C1 o schiacciare il passaggio 1 non può funzionare.

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

  • Un piano di riproduzione ha un ordine e delle dipendenze.
  • Squash conserva entrambi i messaggi affinché tu possa combinarli; la correzione scarta il proprio.
  • Drop rimuove la modifica stessa, quindi rilascia solo il rumore reale.

Termini del glossario introdotti

Riformulare: إعادة صياغة; zucca: ضمّ; correzione — ضمّ مع تجاهل الرسالة; goccia: إسقاط; piano di riproduzione: خطة إعادة تطبيق.

Trascrizione video

La narrazione del video, spunto per spunto.

Mostra la trascrizione
  1. Cinque commit grezzi diventano due puliti, in sicurezza.
  2. Il rebase interattivo è un piano: un elenco di gradini, il più vecchio per primo.
  3. Git riproduce l'elenco dall'alto verso il basso una base.
  4. Ad ogni passaggio corrisponde un'azione: scegli, riformula, schiacciare, aggiustare o rilasciare.
  5. Innanzitutto, crea cinque commit privati e a ramo di salvataggio.
  6. Tre sono veri lavori. Uno è una soluzione, e uno è un rumore temporaneo.
  7. Fare clic con il pulsante destro del mouse sul commit sotto di essi e apri Modifica cronologia.
  8. Scegli Rebase interattivo dei commit Sopra.
  9. L'editor elenca i cinque passaggi, più antichi prima.
  10. Lascia disattivate tutte e tre le opzioni. Ci trasferiremo la riparazione noi stessi.
  11. La correzione avviene subito dopo il commit si risolve. Spostalo verso l'alto due volte.
  12. Ora sposta la nota di convalida sopra il file nota di revisione.
  13. L'ordine ora è uno, quattro, tre, due, cinque.
  14. Imposta il primo passaggio su Riformula e scrivi il nuovo messaggio.
  15. Impostare il passaggio di correzione su Correzione. Il suo messaggio viene buttato via.
  16. Conserva la nota di convalida e schiaccia il file rivedere la nota in esso.
  17. Squash mostra entrambi i messaggi. Scrivine uno messaggio per la coppia.
  18. Rilascia la nota temporanea. Il suo cambiamento sarà non sopravvivere.
  19. Leggi ogni riga ancora una volta. Niente è su a remoto.
  20. Scegli Start Rebase una volta e attendi per finire.
  21. Il grafico ora ha due commit sopra il file base.
  22. Entrambi hanno nuovi ID. I vecchi cinque sono sul ramo di salvataggio.
  23. Apri la pagina: la correzione dell'etichetta è lì. Il il rumore è sparito.
  24. Ora lo stesso piano nel terminal, con git rebase -i.
  25. Git apre l'elenco delle cose da fare. Prima i più vecchi, tutti impostato per scegliere.
  26. Riscrivi le righe nel nostro piano: riformula, aggiustare, raccogliere, schiacciare, rilasciare.
  27. Git richiede i due messaggi. Scrivine uno riga per ciascuno.
  28. Conta i commit sopra la base: due.
  29. Elenca gli argomenti. Questi siamo noi due ha scritto.
  30. Lo stato è vuoto e la nota temporanea lo è andato.
  31. Cambia l'input: metti la zucca sul primo passo.
  32. Non c'è niente sopra in cui ripiegarsi, quindi Git rifiuta.
  33. Oppure sposta la correzione sopra il suo commit: the la riproduzione si interrompe con un conflitto.
  34. Se si ferma, correggilo e continua. Oppure interrompi e non cambia nulla.
  35. Il ramo di salvataggio detiene ancora il tuo cinque commit originali.
  36. Non riscrivere mai commette che qualcun altro ha già.
  37. Pratica: spiegare il piano e il motivo per cui farlo non si può essere una zucca.
  38. Successivamente, risolvi i conflitti quando si verifica un'unione o un file il rebase si ferma.