Vai al contenuto
GitTree

Lezione 25 · Storia e integrazione

Applica i commit selezionati con il cherry-pick

Copia la correzione di un compagno di squadra sul tuo ramo di rilascio senza unire l'intero ramo, quindi controlla il nuovo commit, il suo autore, i suoi file e cosa è rimasto indietro.

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 quello da copiare e scopri perché il suo genitore non arriva.
  • Prevedere l'ID, l'autore e il committente del nuovo commit.
  • Riconosci una dipendenza mancante o una modifica già applicata prima di forzare qualsiasi cosa.
  • Confronta il risultato con il ramo di origine.

Prima di iniziare

Il ramo di Priya priya/label contiene due commit sopra una linea di base condivisa B (la pagina di registrazione). La prima è una nota non correlata, "docs: unlated source note", che aggiunge docs/temporary-review.md. La seconda è la sua correzione, "correzione: chiarisci l'etichetta email fittizia", ​​che modifica l'etichetta in index.html. Il tuo ramo release/label inizia dalla stessa linea di base B e ha un proprio commit, "docs: record target review", che aggiunge docs/integration-note.md. release/label è stato estratto e l'albero di lavoro è pulito. Vuoi che si occupi del tuo ramo, ma non del suo biglietto.

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

Cherry-pick prende la modifica apportata da un commit, misurata rispetto al proprio genitore, e la applica al ramo su cui ti trovi come commit new. Non porta il genitore e non porta i commit prima di sé. Questo è esattamente il motivo per cui puoi prendere la dose di Priya e lasciare il suo biglietto dietro.

Il commit di origine non viene toccato. Il nuovo commit ha un nuovo ID, perché ha un nuovo genitore, ma mantiene l'autore e il messaggio originali. Il committente, la persona che ha effettuato questo commit, sei tu. La stessa modifica con lo stesso messaggio è comunque un commit diverso.

Le dipendenze contano ancora. La correzione modifica una riga del modulo di iscrizione, quindi il ramo di destinazione deve già avere quel modulo. In caso contrario, Git si ferma con un conflitto. Se la destinazione contiene già la stessa modifica, la scelta sarebbe vuota e Git si fermerebbe di nuovo. In entrambi i casi guarda cosa dice l'operazione; non forzare un commit vuoto solo per superarlo.

Si muove solo il ramo di destinazione. priya/label e tutto su un server rimangono com'erano. Il nuovo commit aggiunge la modifica dell'etichetta a release/label e nient'altro.

Preparare lo stato esatto del progetto

Inizia da una copia ordinaria separata del progetto così come lo ha lasciato la lezione 18 e lascia intatto il tuo gittree-features originale. Salva SIGNUP come linea di base, quindi costruisci i due rami. I corpi sottostanti sono la pagina di base (SIGNUP), la nota non correlata (DOC_NOISE), la pagina fissa (SIGNUP_LABEL) e la tua nota (DOC_MERGE).

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/temporary-review.md — DOC_NOISE

Uscita
Temporary rehearsal note, deliberately dropped.

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/integration-note.md — DOC_MERGE

Uscita
# Integration review

This note was written on main while signup work was private.

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 la linea di base e i due rami come mostra la sezione successiva. Controlla release/label e conferma che l'albero di lavoro è pulito.
  2. Nel grafico trova il commit di Priya "correzione: chiarisci l'etichetta email fittizia", non la nota sotto di essa. Selezionalo e leggi i suoi dettagli: un percorso modificato, index.html, e il suo genitore è la nota non correlata.
  3. Fai clic con il pulsante destro del mouse sul commit e scegli Cherry-Pick Commit. Si applica immediatamente alla filiale in cui ti trovi; non esiste un selettore di rami. Il comando è disabilitato sul commit che è già quello corrente.
  4. Aspetta il risultato reale. Se un'operazione si interrompe, utilizza Resolve, Continue o Abort… sul banner invece di scegliere nuovamente.
  5. Seleziona il nuovo commit su release/label. Il suo ID è diverso da quello di Priya, l'autore è Priya Nair e il committente è GitTree Demo.
  6. Apri index.html: è SIGNUP_LABEL. docs/temporary-review.md non è presente e il tuo docs/integration-note.md sì. priya/label nomina ancora il suo vecchio suggerimento.
  7. Lascia release/label pulito. Non eseguire il push e non unire priya/label.

Se selezioni due o più commit nel grafico, il menu offre Cherry-Pick Commits e li copia in ordine. Questa lezione ne copia uno.

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, crea il ramo della linea di base prima di salvare SIGNUP:

Command · bash
git switch --create label-base

Salva ISCRIZIONE come index.html, quindi:

Command · bash
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/label

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

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

Salva SIGNUP_LABEL come index.html, quindi:

Command · bash
git add -- index.html
git -c user.name="Priya Nair" -c user.email=priya@example.com commit --quiet -m "fix: clarify the fictional email label"
PICK_SHA="$(git rev-parse HEAD)"
git switch --create release/label "$BASE_SHA"

Salva DOC_MERGE come docs/integration-note.md, quindi:

Command · bash
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"

Ora scegli la correzione e leggi il risultato:

Command · bash
git cherry-pick "$PICK_SHA"
git log -1 --format='%s%n%an <%ae>%n%cn <%ce>'
git diff-tree --no-commit-id --name-only -r HEAD
git status --short
Uscita
fix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.html

L'ID del nuovo commit è diverso da PICK_SHA, index.html è SIGNUP_LABEL, docs/temporary-review.md è assente e lo stato è vuoto. Due varianti da conoscere, eseguite in copie separate, mai in quella canonica: git cherry-pick -x "$PICK_SHA" aggiunge la riga "(cherry picked from commit …)" al nuovo messaggio, che aiuta quando si scelgono rami condivisi; e su un target a cui manca il modulo di registrazione lo stesso comando si interrompe con un conflitto su index.html, che risolvi (lezione 23) o lasci con git cherry-pick --abort. Se il target ha già la modifica, Git si ferma di nuovo con una scelta vuota, e git cherry-pick --skip o --abort è la via d'uscita.

Risultato

Where you end: release/label ha un nuovo commit con la correzione di Priya, creato da Priya Nair e commit da GitTree Demo, con un nuovo ID. La pagina ha l'etichetta chiarita, la nota non correlata non è arrivata, priya/label e il server sono invariati e l'albero di lavoro è pulito.

Errori comuni

  • Pensare al cherry-pick sposta il commit. Copia il cambiamento; l'originale rimane dov'era.
  • Scegliere il commit sbagliato, la nota non correlata invece della correzione.
  • Forzare un commit vuoto quando la modifica è già sul ramo.
  • Usare il cherry-pick per copiare un'intera funzionalità, un commit alla volta, invece di unirla.

Se qualcosa va storto

Se la scelta si ferma, leggi il banner. Resolve e Continue finiscono come nella lezione 23; Abort… riporta il ramo al punto in cui si trovava. Se la scelta è stata un errore al termine, il nuovo commit è solo su release/label: annullalo lì e il ramo di origine non è mai stato toccato.

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

    Che cosa significa la copia selettiva?

    Scegli una risposta.

  2. Domanda 2 di 6

    Dopo la scelta, quali di queste sono vere riguardo al nuovo commit?

    Scegli ogni risposta applicabile.

  3. Domanda 3 di 6
    Obbligatorio

    La correzione di Priya si trova sopra un commit di note non correlato. Scegli solo la correzione su release/label. docs/temporary-review.md sarà il release/label dopo?

    Scegli una risposta.

  4. Domanda 4 di 6

    Modifica l'input: release/label non ha il modulo di registrazione modificato dalla correzione di Priya. Cosa succede quando scegli?

    Scegli una risposta.

  5. Domanda 5 di 6
    Obbligatorio

    Scegli un commit e Git si ferma con "La scelta precedente è ora vuota". La modifica è già sulla tua filiale. Cosa fai?

    Scegli una risposta.

  6. Domanda 6 di 6
    Obbligatorio

    Quali riletture mostrano che il plettro 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

Riporta l'ID, l'autore e il committente del nuovo commit, i suoi percorsi modificati e se docs/temporary-review.md esiste. Quindi prevedi cosa succede se scegli di nuovo lo stesso commit su release/label.

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

  • Cherry-pick copia la modifica di un commit come un nuovo commit.
  • Il genitore e i commit prima rimangono indietro.
  • Controlla le dipendenze e le scelte vuote prima di forzare qualsiasi cosa.

Termini del glossario introdotti

Scegli la ciliegia: انتقاء; commit del sorgente — إيداع المصدر; bersaglio: الهدف; dipendenza: اعتماد.

Trascrizione video

La narrazione del video, spunto per spunto.

Mostra la trascrizione
  1. Prendi una correzione da un altro ramo e lascia il resto.
  2. Cherry-pick copia la modifica al primo commit fatto, come nuovo commit qui.
  3. La copia ha un nuovo ID, ma mantiene il file autore e messaggio.
  4. Costruisci una linea di base, il ramo di Priya con a note e una correzione e il ramo di rilascio.
  5. Apri la cartella. Il grafico mostra entrambi rami dalla stessa linea di base.
  6. La soluzione di Priya si trova sopra una non correlata nota. Vogliamo solo la correzione.
  7. Seleziona la correzione. Uno ha cambiato percorso: indice.html.
  8. Assicurati che l'etichetta di rilascio sia aggiornata e l'albero di lavoro è pulito.
  9. Fare clic con il pulsante destro del mouse sulla correzione e scegliere Impegno di selezione.
  10. Non esiste un selettore di rami. Si applica a il ramo su cui ti trovi.
  11. Sul commit stesso, il comando è disabilitato.
  12. Eseguilo e attendi il risultato reale.
  13. Un nuovo commit si trova sull'etichetta di rilascio.
  14. Il suo ID è diverso da quello di Priya, perché its il genitore è diverso.
  15. L'autrice è ancora Priya. Il committente sei tu.
  16. La pagina ha l'etichetta chiarita.
  17. La nota non correlata non è arrivata. La tua nota è ancora qui.
  18. La filiale di Priya è esattamente com'era.
  19. Nel terminale, git log con un formato mostra l'oggetto, l'autore e il committente.
  20. git diff-tree elenca i percorsi di questo impegno cambiato.
  21. Lo stato è vuoto. Non è rimasto nulla dietro.
  22. Con l'opzione x, il messaggio viene registrato da dove viene la scelta.
  23. Scegli di nuovo lo stesso commit e Git si ferma: il plettro è vuoto.
  24. Modificare l'input: la destinazione non ha registrazione forma.
  25. La scelta si ferma con un conflitto. Risolvi e continuare o interrompere.
  26. Una modifica può dipendere da commit che non hai effettuato prendere. Testare l'obiettivo.
  27. Abort ripristina il ramo. La fonte è mai modificato.
  28. Esercizio: riportare il nuovo ID, autore, committer e file.
  29. Successivamente, metti da parte il lavoro incompiuto in modo sicuro con scorta.