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.
- Livello: Avanzato
- 12 minuti di lettura
- 7 minuti di video
- Aggiornato
- Prima di questa lezione: Ribasare il lavoro inedito su una nuova base
Avanzamenti salvati in questo browser.
La riproduzione carica il video da YouTube (modalità ottimizzata per la privacy).
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:
| Passo | Impegnarsi | Cosa fa |
|---|---|---|
| C1 | caratteristica: aggiungi bozza di iscrizione | aggiunge il modulo di registrazione |
| C2 | documenti: spiegare la revisione della registrazione | aggiunge docs/replay-a.md |
| C3 | documenti: spiegare la convalida | aggiunge docs/replay-b.md |
| C4 | sistemare! caratteristica: aggiungi bozza di iscrizione | corregge l'etichetta del modulo |
| C5 | lavoretto: nota temporanea | aggiunge 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:
| Passo | Impegnarsi | Azione | Risultato |
|---|---|---|---|
| 1 | C1 | Riformulare | impresa: completa il modulo di registrazione locale |
| 2 | C4 | Correzione | ripiegato nel passaggio 1 |
| 3 | C3 | Scegli | mantenuto; il bersaglio della zucca |
| 4 | C2 | Zucca | documenti: spiega la revisione e la convalida della registrazione |
| 5 | C5 | Lascia cadere | andato |
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
<!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
# Local signup review
Review the label and hint together.docs/replay-b.md — DOC_B
# Local validation review
No address leaves this demonstration.indice.html — SIGNUP_LABEL
<!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
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.
- Costruisci i cinque commit e il ramo di salvataggio come mostra la sezione successiva, con
private/signup-polishestratto e pulito. Nota M e i cinque soggetti. - 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.
- Sotto Options for this rebase lascia disattivate tutte e tre le opzioni, incluso Arrange fixup!, squash! and amend! commits. Sposterai tu stesso la correzione.
- 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.
- Imposta C1 su Reword e digita
feat: complete the local signup formnel campo del messaggio. Imposta C4 su Fixup. - 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. - 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.
- Scegli Start Rebase una volta e attendi. Se si interrompe utilizza il banner per proseguire; non ricominciare l'intero piano.
- Verifica due nuovi commit, l'etichetta corretta nella pagina, entrambi i documenti e nessuna nota temporanea. Mantieni
rescue/before-polishe 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:
git switch --create private/signup-polishSalva ISCRIZIONE come index.html, quindi:
git add -- index.html
git commit --quiet -m "feat: add signup draft"Salva DOC_A come docs/replay-a.md, quindi:
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"Salva DOC_B come docs/replay-b.md, quindi:
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"Salva SIGNUP_LABEL come index.html, quindi:
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"Salva DOC_NOISE come docs/temporary-review.md, quindi:
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:
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEADOra 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):
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"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 noteRiscrivi le cinque righe nel piano, mantenendo il proprio ID di ciascuna riga, e salva:
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 noteGit 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:
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short2
feat: complete the local signup form
docs: explain signup review and validationLo 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.
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.
Relativo
Termini del glossario introdotti
Riformulare: إعادة صياغة; zucca: ضمّ; correzione — ضمّ مع تجاهل الرسالة; goccia: إسقاط; piano di riproduzione: خطة إعادة تطبيق.
Trascrizione video
La narrazione del video, spunto per spunto.
Mostra la trascrizione
- Cinque commit grezzi diventano due puliti, in sicurezza.
- Il rebase interattivo è un piano: un elenco di gradini, il più vecchio per primo.
- Git riproduce l'elenco dall'alto verso il basso una base.
- Ad ogni passaggio corrisponde un'azione: scegli, riformula, schiacciare, aggiustare o rilasciare.
- Innanzitutto, crea cinque commit privati e a ramo di salvataggio.
- Tre sono veri lavori. Uno è una soluzione, e uno è un rumore temporaneo.
- Fare clic con il pulsante destro del mouse sul commit sotto di essi e apri Modifica cronologia.
- Scegli Rebase interattivo dei commit Sopra.
- L'editor elenca i cinque passaggi, più antichi prima.
- Lascia disattivate tutte e tre le opzioni. Ci trasferiremo la riparazione noi stessi.
- La correzione avviene subito dopo il commit si risolve. Spostalo verso l'alto due volte.
- Ora sposta la nota di convalida sopra il file nota di revisione.
- L'ordine ora è uno, quattro, tre, due, cinque.
- Imposta il primo passaggio su Riformula e scrivi il nuovo messaggio.
- Impostare il passaggio di correzione su Correzione. Il suo messaggio viene buttato via.
- Conserva la nota di convalida e schiaccia il file rivedere la nota in esso.
- Squash mostra entrambi i messaggi. Scrivine uno messaggio per la coppia.
- Rilascia la nota temporanea. Il suo cambiamento sarà non sopravvivere.
- Leggi ogni riga ancora una volta. Niente è su a remoto.
- Scegli Start Rebase una volta e attendi per finire.
- Il grafico ora ha due commit sopra il file base.
- Entrambi hanno nuovi ID. I vecchi cinque sono sul ramo di salvataggio.
- Apri la pagina: la correzione dell'etichetta è lì. Il il rumore è sparito.
- Ora lo stesso piano nel terminal, con git rebase -i.
- Git apre l'elenco delle cose da fare. Prima i più vecchi, tutti impostato per scegliere.
- Riscrivi le righe nel nostro piano: riformula, aggiustare, raccogliere, schiacciare, rilasciare.
- Git richiede i due messaggi. Scrivine uno riga per ciascuno.
- Conta i commit sopra la base: due.
- Elenca gli argomenti. Questi siamo noi due ha scritto.
- Lo stato è vuoto e la nota temporanea lo è andato.
- Cambia l'input: metti la zucca sul primo passo.
- Non c'è niente sopra in cui ripiegarsi, quindi Git rifiuta.
- Oppure sposta la correzione sopra il suo commit: the la riproduzione si interrompe con un conflitto.
- Se si ferma, correggilo e continua. Oppure interrompi e non cambia nulla.
- Il ramo di salvataggio detiene ancora il tuo cinque commit originali.
- Non riscrivere mai commette che qualcun altro ha già.
- Pratica: spiegare il piano e il motivo per cui farlo non si può essere una zucca.
- Successivamente, risolvi i conflitti quando si verifica un'unione o un file il rebase si ferma.