Vai al contenuto
GitTree

Lezione 32 · Recupero

Recuperare gli errori dopo aver spinto

Ripara un errore che altri potrebbero già avere: preferisci un nuovo commit e, quando devi riscrivere un ramo di tua proprietà, forza con un lease fissato all'esatto suggerimento remoto che hai esaminato.

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

  • Scegli tra una riparazione additiva e una riscrittura per un errore forzato.
  • Spiegare cosa controlla un lease e perché il commit previsto è importante.
  • Prevedi il rifiuto di un contratto di locazione obsoleto e mantieni il lavoro di un compagno di squadra.
  • Scopri cosa conserva GitTree prima di forzare le spinte.

Prima di iniziare

Due situazioni su un server di prova locale. Il giorno shared è già stato eseguito il push di un commit errato e altri potrebbero averlo. Il giorno lease, hai inviato una bozza e poi l'hai riscritta localmente, ma nel frattempo Leo ha inviato un commit più recente allo stesso ramo.

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

Se i compagni di squadra potrebbero avere un commit errato, riparalo con un nuovo commit (un ripristino, lezione 28) e spingi normalmente: la cronologia mantiene l'errore e il clone di nessuno viene invalidato. Riscrivi un ramo pubblicato solo quando ne sei il proprietario.

Un lease rende condizionale un push forzato: Git sostituisce il ramo remoto solo se punta ancora dove ti aspetti. --force-with-lease=<ref>:<commit> nomina il commit previsto. Un semplice --force-with-lease utilizza il tuo riferimento di tracciamento remoto e un git fetch sposta quel riferimento, quindi il recupero e il successivo push possono sovrascrivere ciò che hai appena scaricato. GitTree blocca l'ultimo commit recuperato, lo mostra nella sua finestra di dialogo e mantiene il suggerimento sostituito sotto refs/ogt/trash.

Un lease non decide se puoi sovrascrivere il lavoro di un compagno di squadra. Ti protegge solo dalla sovrascrittura di qualcosa che non hai visto.

Preparare lo stato esatto del progetto

Inizia da una copia ordinaria separata del risultato della lezione 18 con un nuovo repository locale come unico remoto. RECOVERY_BAD è il foglio di stile errato; LEASE_A, LEASE_B e LEASE_REWRITE sono le tre versioni di una nota.

Completare gli input del file

Salva ogni file di seguito esattamente come mostrato: UTF-8, terminazioni di riga LF e un fine riga finale, senza le linee di recinzione Markdown. I file non elencati mantengono il loro contenuto da M.

stili.css — RECOVERY_BAD

Estratto del file · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #f7f8fa;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

docs/lease-note.md — LEASE_A

Uscita
# Private release rehearsal

The reviewed draft is still private.

docs/lease-note.md — LEASE_B

Uscita
# Private release rehearsal

Leo added a review that must not be overwritten.

docs/lease-note.md — LEASE_REWRITE

Uscita
# Private release rehearsal

This alternative draft has not seen Leo's review.

Tra GitTree

Apri la tavolozza con Comando+Maiusc+P (Ctrl+Maiusc+P su Ubuntu).

  1. Costruisci la prova come mostra la sezione successiva: il commit errato è stato inviato a shared e il ramo lease con il commit più recente di Leo sul server.
  2. Additive repair. Su shared, fai clic con il pulsante destro del mouse sul commit errato e scegli Revert Commit, quindi fai clic su Push. Questa è una spinta normale; non scegliere Force Push (con leasing)….
  3. Stale lease. Su private/lease, riscrivi la bozza localmente in modo che il ramo non contenga più il commit inviato e prova a inviarlo con la barra degli strumenti Push. GitTree chiede prima dove spingere, perché private/lease traccia origin/lease sotto un altro nome: scegli Push to origin/lease. Una finestra di dialogo intitolata "Il telecomando ha rifiutato privato/locazione" offre quindi Fetch Only, Rebase and Push, Merge and Push e Force Push….
  4. Scegli prima Fetch Only e leggi il grafico: il ramo remoto ora ha il commit di Leo, che la tua riscrittura non contiene. Questo è il lavoro di un compagno di squadra.
  5. Apri Force Push…. La finestra di dialogo "Forza push privato/lease all'origine/lease?" dice che i commit che mancano al tuo ramo verranno rimossi dal telecomando, che il push va avanti solo mentre il telecomando è ancora al commit mostrato e che il suggerimento sostituito viene mantenuto sotto refs/ogt/trash. Cancellare; Non spetta a te sostituire il lavoro di Leo.
  6. Riconcilia invece: Rebase and Push mette la tua bozza sopra quella di Leo oppure chiediglielo prima. Se è stata eseguita una spinta forzata reale, l'avviso dice " Spinta forzata. Il puntale del telecomando sostituito viene mantenuto su ..." e Undo tratta una spinta forzata come una modifica a un telecomando che si preme nuovamente per tornare indietro.

Nel terminale

Dopo il ripristino, il giorno shared:

Command · bash
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?

La risposta è 0: l'errore rimane nella storia e nessuno è stato costretto a riparare un clone.

Il giorno private/lease, con il commit di Leo già sul server, prova il lease bloccato con il commit che hai esaminato:

Command · bash
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short
Uscita
 ! [rejected]        HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1

Git rifiuta ("informazioni obsolete"), il server nomina ancora il commit di Leo e lo stato è vuoto. Anche un semplice git push --force-with-lease origin HEAD:lease viene rifiutato mentre il tuo riferimento di tracciamento remoto è vecchio, ma dopo git fetch origin lease lo stesso comando sostituisce il commit di Leo, perché il recupero ha spostato il riferimento con cui confronta. Assegna un nome al commit che hai esaminato o riconcilialo con un rebase.

Risultato

Where you end: il commit errato è ancora nella cronologia di shared ed è stato eseguito normalmente il ripristino. Il giorno lease il push bloccato è stato rifiutato, il server conserva ancora il commit di Leo e la tua riscrittura locale è intatta. Non è stata effettuata alcuna spinta forzata.

Errori comuni

  • Riscrivere un ramo già tirato da altre persone quando sarebbe opportuno ripristinare.
  • Recupero e quindi forzamento del push con un semplice lease, che ora si fida di ciò che hai appena scaricato.
  • Trattare un lease come un permesso per sostituire il commit di un compagno di squadra.
  • Supponendo che Annulla possa invertire una spinta forzata sul server.

Se qualcosa va storto

Se un push forzato ha sostituito il tip sbagliato, il commit sostituito viene mantenuto sotto refs/ogt/trash (e, per i push nativi, nel tuo reflog e nel clone del compagno di squadra). Dillo al compagno di squadra, ripristina la punta come ramo e spingila di nuovo con il tuo consenso. Una spinta rifiutata non ha cambiato nulla.

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

    Sul ramo condiviso è già presente un commit errato. Qual è la riparazione più sicura?

    Scegli una risposta.

  2. Domanda 2 di 6

    Quali di queste sono vere riguardo a --force-with-lease? (scelta multipla)

    Scegli ogni risposta applicabile.

  3. Domanda 3 di 6
    Obbligatorio

    Hai spinto con il lease fissato al commit che hai esaminato, ma Leo ha spinto dopo. Che succede?

    Scegli una risposta.

  4. Domanda 4 di 6

    Cambia l'input: esegui git fetch origin lease e poi un semplice git push --force-with-lease origin HEAD:lease. Che succede?

    Scegli una risposta.

  5. Domanda 5 di 6
    Obbligatorio

    Un collega afferma che "la forza con locazione rende la spinta forzata sicura per tutti". Qual è la risposta corretta?

    Scegli una risposta.

  6. Domanda 6 di 6
    Obbligatorio

    Dopo la spinta bloccata, quali riletture mostrano che nulla è andato perduto? (scelta multipla)

    Scegli ogni risposta applicabile.

0 di 6 corretto

Rispondi correttamente alle domande richieste per completare la lezione.

Controllato in questo browser.

Pratica

Riporta il controllo dell'antenato su shared, il codice di uscita e il messaggio del push bloccato, il commit ls-remote mostrato per lease e se un semplice lease sarebbe stato rifiutato prima e dopo un recupero.

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

  • Preferisci un nuovo commit per qualsiasi cosa possano avere gli altri.
  • Aggiungi il lease al commit che hai esaminato.
  • Un contratto di locazione protegge te, non le intenzioni del tuo compagno di squadra.

Termini del glossario introdotti

Locazione — قفل; informazioni obsolete — معلومات قديمة; punta sostituita — الرأس المستبدَل.

Trascrizione video

La narrazione del video, spunto per spunto.

Mostra la trascrizione
  1. Hai commesso un errore. E adesso?
  2. Se altri potrebbero avere il commit, riparalo aggiungendo un commit.
  3. Un contratto di locazione dice: sostituire il telecomando solo se è ancora dove mi aspetto.
  4. Ma un recupero muove ciò che un semplice contratto di locazione si aspetta.
  5. Due rami su un server locale: condiviso, e locazione.
  6. In modalità condivisa, ripristina il commit errato.
  7. Spingi normalmente. Nessuna forza.
  8. L'errore resta nella storia, e in nessuno deve riparare un clone.
  9. In locazione, un ramo riscritto viene rifiutato.
  10. Prendi solo e guarda. L'impegno di Leo è lì.
  11. Procede solo mentre il telecomando è acceso questo commit e mantiene il vecchio suggerimento.
  12. Non spetta a te sostituire il lavoro di Leo. Ribasare su di esso, o chiediglielo.
  13. Nel terminale, l'antenato controlla condiviso è zero.
  14. Assegna un nome al commit che hai esaminato. Git dice informazioni obsolete.
  15. Il server nomina ancora il commit di Leo.
  16. Un semplice contratto di locazione dopo un recupero avrebbe funzionato lo ha sostituito.
  17. Annulla non inverte una spinta forzata su a servitore.
  18. Esercizio: riportare il codice di uscita, il server commit e lo stato.
  19. Successivamente, lavora su due rami contemporaneamente con worktrees.