Lezione 24 · Recupero
Continua, salta o interrompi un'operazione attiva
Quando un'unione o un rebase si interrompe, hai tre vie d'uscita: continuare, saltare o interrompere. Scopri quale si adatta, cosa butta via ciascuno e come controllare successivamente il repository.
- Livello: Intermedio
- 13 minuti di lettura
- 7 minuti di video
- Aggiornato
- Prima di questa lezione: Risolvere i conflitti di unione e rebase
Avanzamenti salvati in questo browser.
La riproduzione carica il video da YouTube (modalità ottimizzata per la privacy).
Cosa imparerai
- Indica quale operazione è attiva prima di toccare qualsiasi cosa.
- Continuare solo dopo che ogni conflitto è stato risolto e contrassegnato.
- Spiega cosa Skip lascia fuori e quando è lo strumento sbagliato.
- Interrompere un'operazione e verificare di essere tornati all'inizio.
Prima di iniziare
Utilizzi la divergenza dalla lezione 23: conflict/sara (titolo di Sara "Rivedi le modifiche con sicurezza.") e conflict/omar (titolo di Omar "Comprendi ogni modifica salvata"), entrambi dal commit M. Creane tre copie pulite, denominate gittree-continue, gittree-abort e gittree-skip. In ognuno, conflict/sara è stato estratto e non è in esecuzione nulla. Interromperai la stessa operazione in tutti e tre e lascerai ognuno in un modo diverso.
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 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'operazione interrotta è uno stato a sé stante. Fino al termine, il repository ricorda cosa stava facendo e non è necessario avviare un'altra unione o rebase sopra di esso. Per prima cosa scopri cosa è attivo. Il banner di GitTree lo dice chiaramente: "Unire... in...", o "Ribasare... su..." (con il numero del passaggio quando ce ne sono diversi) e il numero di conflitti rimasti. In un terminale, git status inizia con "Hai percorsi non uniti" e un suggerimento per un'unione, o "rebase interattivo in corso; su..." per un rebase, quindi elenca i comandi che puoi utilizzare.
Continue continua una volta risolto ogni conflitto e messo in scena il suo risultato. Non è un nuovo tentativo di unione o rebase originale: termina il commit dell'unione o sposta un rebase al commit successivo.
Skip esiste per le operazioni che riproducono i commit, come un rebase. Lascia completamente fuori dal risultato la modifica del commit corrente. In questa lezione Skip elimina l'intestazione di Sara e il ramo termina sul commit di Omar. Non è un modo per "accettare il file" o per rinviare un conflitto, ed è lo strumento sbagliato ogni volta che si desidera ancora quel cambiamento. Un'unione non ha Salta, perché un'unione è un passaggio: o la finisci o la interrompi.
Abort torna al punto in cui è iniziata l'operazione. Qualunque cosa tu abbia risolto finora viene abbandonata. GitTree salva uno snapshot di ripristino di ciò che rilascia per primo e il repository ritorna al commit, all'indice e ai file esatti che aveva prima. È la via d'uscita quando non sei sicuro di cosa stai facendo.
| Scelta | Il risultato | Quanto costa |
|---|---|---|
| Continua | Commit di unione effettuato o commit successivo riprodotto | niente, una volta risolto tutto |
| Salta | La modifica del commit corrente viene tralasciata | quel cambiamento, finché non lo ritrovi |
| Interrompere | Il repository è tornato all'inizio | il lavoro svolto durante l'operazione |
Preparare lo stato esatto del progetto
Costruisci i rami di Sara e Omar una volta, poi crea tre copie. Inizia da una copia ordinaria separata del progetto così come lo ha lasciato la lezione 18 e lascia intatto il tuo gittree-features originale. Le versioni della pagina: MERGED è la base condivisa, SARA e OMAR sono le versioni concorrenti e RESOLVED è il risultato che salvi nella copia continua.
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>indice.html — RISOLTO
<!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 each change 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>Tra GitTree
Apri la tavolozza con Comando+Maiusc+P (Ctrl+Maiusc+P su Ubuntu). Le azioni su un ramo con nome utilizzano il menu di scelta rapida di quel ramo.
- Costruisci le tre copie come mostra la sezione successiva. In ognuno di essi,
conflict/saraè estratto e lo stato è vuoto. Annotare l'ID completo diconflict/saranella copia interrotta. - Continue copy. Apri gittree-continue. Fai clic con il pulsante destro del mouse su
conflict/omare scegli Merge conflict/omar into conflict/sara, con Always a merge commit. Si ferma. Sul banner scegli Resolve, apriindex.html, scegli Edit Output, scriviReview each change with confidence.e scegli Save and Mark Resolved. - Controlla che non sia rimasto alcun conflitto, quindi scegli Continue sul banner una volta. L'avviso dice "Fatto". e lo striscione se ne va. Il nuovo commit ha due genitori.
- Abort copy. Apri gittree-abort e avvia la stessa unione. Lasciare il conflitto irrisolto. Sul banner scegli Abort…. La finestra di dialogo "Interrompere l'operazione?" spiega che il ramo, l'indice e i file tornano a quello che erano e che ciò che viene eliminato viene prima conservato negli snapshot di ripristino. Scegli Abort. L'avviso dice "Interrotto. La modifica eliminata viene mantenuta in refs/ogt/trash/…; Annulla la ripristina." (quando l'interruzione non rilascia nulla, viene visualizzato il messaggio "Interrotto. Il repository è tornato dov'era prima.")
- Controlla l'interruzione:
conflict/saraè ancora l'ID che hai annotato, la pagina è l'intestazione completa di Sara e non c'è nessun banner. - Skip copy. Apri gittree-skip. Fai clic con il pulsante destro del mouse su
conflict/omare scegli Rebase conflict/sara onto conflict/omar. Lascia le opzioni disattivate e scegli Rebase conflict/sara. Si ferma. Il banner ora offre Skip accanto a Continue e Abort…; il banner di unione non aveva Salta. - Leggi quale commit viene riprodotto (quello di Sara), accetta che saltando lasci fuori la sua intestazione e scegli Skip una volta. L'avviso dice "Passaggio saltato".
- Controlla il salto: la pagina mostra l'intestazione di Omar,
conflict/saraora punta al commit di Omar e non viene visualizzato alcun banner. Confronta i tre risultati e tienili separati.
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 e pulita del risultato della lezione 18:
git switch --create conflict/sara
BASE_SHA="$(git rev-parse HEAD)"Salva SARA come index.html, quindi:
git add -- index.html
git -c user.name="Sara Lindqvist" -c user.email=sara@example.com commit --quiet -m "feat: Sara clarifies the hero"
git switch --quiet --create conflict/omar "$BASE_SHA"Salva OMAR come index.html, quindi:
git add -- index.html
git -c user.name="Omar Haddad" -c user.email=omar@example.com commit --quiet -m "feat: Omar explains the hero"
git switch --quiet conflict/saraCrea tre copie pulite di questo stato (gittree-continue, gittree-abort, gittree-skip). Per prima cosa, guarda cosa è attivo ogni volta che non sei sicuro:
git statusContinue copy. L'unione si interrompe con il codice di uscita 1. Salva RESOLVED come index.html, quindi:
git merge --no-ff --no-edit conflict/omar
git add -- index.html
git -c core.editor=true merge --continue
git ls-files --unmerged
git status --shortGli ultimi due comandi non stampano nulla. Abort copy:
git rev-parse conflict/sara
git merge --no-edit conflict/omar
git merge --abort
git rev-parse HEAD conflict/sara
git status --shortL'unione si interrompe e git merge --abort la termina. I due ID stampati da git rev-parse HEAD conflict/sara sono uguali, index.html è la pagina intera di Sara e lo stato è vuoto. Un rebase interrotto viene lasciato allo stesso modo con git rebase --abort. Skip copy:
git rebase conflict/omar
git rebase --skip
git rev-parse HEAD conflict/omar
git status --shortIl rebase si ferma; git rebase --skip termina con "Ribasato con successo". I due ID sono uguali, quindi il ramo di Sara ora si trova sul commit di Omar, la pagina è di Omar e lo stato è vuoto. Il commit saltato di Sara non è più sul ramo, ma Git ce l'ha ancora per un po' (il reflog, lezione 29). Non leggere quel risultato come una risoluzione che ha mantenuto entrambi gli input.
Risultato
Where you end: tre copie, tre risultati diversi. La copia continua ha un commit di unione a due genitori con l'intestazione combinata. La copia interrotta è esattamente al punto in cui è iniziata, con l'intestazione Sara. La copia saltata ha l'intestazione di Omar e il ramo di Sara sul commit di Omar. In tutti e tre l'operazione è terminata e lo stato è pulito.
Errori comuni
- Usare Skip per "superare" un conflitto. Elimina la modifica del commit dal risultato.
- Avvio di un'altra unione o rebase mentre uno è ancora interrotto.
- Utilizzo di
git reset --hardper scappare, invece digit merge --abortogit rebase --abort. - Interrompere quando manca un clic alla fine o continuare quando non si è sicuri di cosa sia stato messo in scena.
Se qualcosa va storto
Se ti perdi, leggi prima il banner o git status e decidi di nuovo. L'interruzione è sempre il modo sicuro per tornare all'inizio. Se hai saltato per errore, non ricominciare da capo alla cieca: il commit saltato è ancora raggiungibile per un po' dal reflog (lezione 29), e la lezione 30 mostra cosa può ripristinare l'Undo di GitTree.
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
In ogni copia dichiarare l'operazione, la scelta e la prova: per Continue i due genitori e la lista vuota e non unita, per Abort gli ID uguali e la pagina di Sara, per Skip la pagina di Omar e il ramo sul suo commit. Quindi prevedere il motivo per cui Salta non viene offerto per un'unione.
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
- Scopri cosa è attivo prima di agire.
- Continua dopo la risoluzione, salta solo per lasciare fuori un commit, interrompi per tornare indietro.
- Successivamente controlla il commit, i file e lo stato.
Relativo
Termini del glossario introdotti
Continua — متابعة; salta: تخطّي; interrompere: إيقاف; operazione — عملية.
Trascrizione video
La narrazione del video, spunto per spunto.
Mostra la trascrizione
- Una fusione o un rebase si interrompe. Ne hai tre vie d'uscita.
- Continua lo termina. Salta ne lascia uno impegnarsi. L'interruzione torna indietro.
- Innanzitutto, scopri sempre quale operazione è attivo.
- Lo striscione lo nomina. In un terminale, git lo stato sì.
- Costruisci i rami di Sara e Omar, e tre copie identiche.
- Stesso inizio, tre finali diversi.
- Copiane uno: continuiamo. Inizia l'unione, e si ferma.
- Risolvi, apri il file e scrivi il file rubrica combinata.
- Salva e contrassegna come risolto, quindi Git vede il file file come fatto.
- Continua è ora disponibile. Sceglilo una volta.
- Fatto. Il nuovo commit ha due genitori e lo striscione è sparito.
- Copia due: abortiamo. Inizia la stessa unione.
- Lascia stare il conflitto e scegli Interrompere.
- La finestra di dialogo spiega cosa ritorna e cosa viene tenuto per primo.
- Il deposito è tornato dov'era prima.
- La punta del ramo ha lo stesso ID e il file la pagina è di nuovo di Sara.
- Copia tre: saltiamo. Questo è un rebase.
- Ribasare il ramo di Sara su quello di Omar. Si ferma con un conflitto.
- Ora il banner ha un pulsante Salta. Una fusione non ne ho mai avuto uno.
- Skip lascia il commit di Sara fuori dal file risultato. Dillo ad alta voce.
- Scegli Salta una volta.
- La pagina mostra l'intestazione di Omar. Quello di Sara branch ora si trova sul suo commit.
- Salta non è una risoluzione. Ha cancellato Il cambiamento di Sara rispetto a questo risultato.
- Nel terminale, git status mostra di cosa si tratta attivo e i comandi.
- L'unione: aggiungi il file risolto, quindi git unisci continua.
- L'interruzione: la punta del ramo è la stessa prima e dopo.
- Lo skip: git rebase skip e il branch siede sul mandato di Omar.
- In ogni copia, lo stato è vuoto e nulla viene lasciato non unito.
- Cambia l'input: risolvi il file, quindi scegli invece Interrompi.
- La tua risoluzione viene abbandonata, dopo a lo snapshot di ripristino viene salvato.
- Non utilizzare mai il ripristino difficile per scappare. L'interruzione è la via d'uscita sicura.
- Se hai saltato per errore, il commit lo è ancora nel reflog.
- Esercizio: nominare l'operazione, la scelta, e la prova, per ogni copia.
- Successivamente, copia un singolo commit su un altro ramo con plettro.