Passer au contenu
GitTree

Leçon 25 · Histoire et intégration

Appliquer les commits sélectionnés avec Cherry-pick

Copiez le correctif d'un coéquipier sur votre branche de publication sans fusionner toute sa branche, puis vérifiez le nouveau commit, son auteur, ses fichiers et ce qui est resté.

Progression enregistrée dans ce navigateur.

La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).

Narration en anglais · English and Arabic légendes

Ouvrez la page vidéoRegarder sur YouTube

Ce que vous apprendrez

  • Choisissez celui à copier et voyez pourquoi son parent ne vient pas.
  • Prédisez l'ID, l'auteur et le committer du nouveau commit.
  • Reconnaissez une dépendance manquante ou une modification déjà appliquée avant de forcer quoi que ce soit.
  • Vérifiez le résultat par rapport à la branche source.

Avant de commencer

La branche priya/label de Priya contient deux commits au-dessus d'une ligne de base partagée B (la page d'inscription). La première est une note sans rapport, "docs : note source non liée", qui ajoute docs/temporary-review.md. La seconde est son correctif, "correctif : clarifier l'étiquette d'e-mail fictive", qui modifie l'étiquette dans index.html. Votre branche release/label part de la même ligne de base B et possède son propre commit, "docs: record target review", qui ajoute docs/integration-note.md. release/label est extrait et l'arborescence de travail est propre. Vous voulez sa solution sur votre branche, mais pas sa note.

Tout est local et sur le forfait gratuit (GitTree vous demande de vous connecter) : pas de compte d'hébergement, pas de fournisseur, pas d'Internet. Chaque identité est fictive (exemple.com). N'exécutez jamais cette leçon dans un projet réel.

Apportez les modifications dans GitTree ou avec les commandes Git natives, pas les deux dans la même copie. La lecture du résultat est toujours sûre. Les étiquettes de menu proviennent des propres chaînes de GitTree 2.0 et les commandes natives ont été exécutées avec Git 2.43 dans des copies jetables. Les étapes GitTree n'ont pas été exécutées le macOS, Windows ou Linux.

Effets de concept et d'état

Cherry-pick prend la modification apportée par un commit, mesurée par rapport à son propre parent, et l'applique à la branche sur laquelle vous vous trouvez en tant que commit new. Il n’amène pas le parent, ni les commits devant lui. C'est exactement pourquoi vous pouvez prendre la solution de Priya et laisser sa note derrière vous.

Le commit source n’est pas touché. Le nouveau commit a un nouvel identifiant, car il a un nouveau parent, mais il conserve l'auteur et le message d'origine. Le committer, la personne qui a commis ce commit, c'est vous. Le même changement avec le même message est toujours un commit différent.

Les dépendances comptent toujours. Le correctif modifie une ligne du formulaire d'inscription, la branche cible doit donc déjà disposer de ce formulaire. Si ce n'est pas le cas, Git s'arrête avec un conflit. Si la cible contient déjà la même modification, la sélection sera vide et Git s'arrêtera à nouveau. Dans les deux cas, regardez ce que dit l’opération ; ne forcez pas un commit vide juste pour le dépasser.

Seule la branche cible bouge. priya/label et tout sur un serveur reste tel qu'il était. Le nouveau commit ajoute le changement d'étiquette à release/label et rien d'autre.

Préparer l’état exact du projet

Commencez à partir d'une copie ordinaire distincte du projet telle que la leçon 18 l'a laissé et laissez votre gittree-features original intact. Enregistrez SIGNUP comme référence, puis créez les deux branches. Les corps ci-dessous sont la page de base (SIGNUP), la note sans rapport (DOC_NOISE), la page fixe (SIGNUP_LABEL) et votre propre note (DOC_MERGE).

Entrées de fichiers complètes

Enregistrez uniquement à la phase nommée ci-dessous. Ce sont des corps UTF-8/LF complets avec une nouvelle ligne finale ; ne collez jamais les clôtures Markdown. Les fichiers exécutables inchangés héritent de l'entrée nommée. Les versions dans des variantes distinctes ne doivent pas écraser l'original.

index.html — INSCRIPTION

Extrait de fichier · 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

Sortie
Temporary rehearsal note, deliberately dropped.

index.html — SIGNUP_LABEL

Extrait de fichier · 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

Sortie
# Integration review

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

Dans GitTree

Ouvrez la palette avec Commande+Maj+P (Ctrl+Maj+P sur Ubuntu). Les actions sur une validation utilisent le menu contextuel de cette validation.

  1. Construisez la ligne de base et les deux branches comme le montre la section suivante. Consultez release/label et confirmez que l'arborescence de travail est propre.
  2. Dans le graphique, recherchez le commit de Priya « correctif : clarifiez l'étiquette de courrier électronique fictive », pas la note en dessous. Sélectionnez-le et lisez ses détails : un chemin modifié, index.html, et son parent est la note sans rapport.
  3. Faites un clic droit sur ce commit et choisissez Cherry-Pick Commit. Cela s'applique immédiatement à la succursale où vous vous trouvez ; il n'y a pas de sélecteur de branches. La commande est désactivée sur le commit qui est déjà celui en cours.
  4. Attendez le vrai résultat. Si une opération s'arrête, utilisez Resolve, Continue ou Abort… sur la bannière au lieu de cliquer à nouveau.
  5. Sélectionnez le nouveau commit sur release/label. Son identifiant diffère de celui de Priya, l'auteur est Priya Nair et le committer est GitTree Demo.
  6. Ouvrez index.html : il s'agit de SIGNUP_LABEL. docs/temporary-review.md n'est pas là et le vôtre docs/integration-note.md l'est. priya/label nomme toujours son ancienne astuce.
  7. Laissez release/label propre. Ne poussez pas et ne fusionnez pas priya/label.

Si vous sélectionnez deux commits ou plus dans le graphique, le menu propose Cherry-Pick Commits et les copie dans l'ordre. Cette leçon en copie une.

Pour chaque commit ordinaire du cours : Summary est le sujet indiqué, Description est vide et les options Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit et Allow Empty Commit restent désactivées.

Dans la borne

Dans une copie séparée du résultat de la leçon 18, créez la branche de base avant d'enregistrer SIGNUP :

Command · bash
git switch --create label-base

Enregistrez SIGNUP sous index.html, puis :

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

Enregistrez DOC_NOISE sous docs/temporary-review.md, puis :

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

Enregistrez SIGNUP_LABEL sous index.html, puis :

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"

Enregistrez DOC_MERGE sous docs/integration-note.md, puis :

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

Choisissez maintenant le correctif et lisez le résultat :

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
Sortie
fix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.html

L'ID du nouveau commit diffère de PICK_SHA, index.html est SIGNUP_LABEL, docs/temporary-review.md est absent et le statut est vide. Deux variantes à connaître, exécutées dans des copies séparées, jamais dans la copie canonique : git cherry-pick -x "$PICK_SHA" ajoute la ligne "(cherry picks from commit …)" au nouveau message, ce qui est utile lorsque vous choisissez parmi des branches partagées ; et sur une cible qui n'a pas le formulaire d'inscription, la même commande s'arrête avec un conflit sur index.html, que vous résolvez (leçon 23) ou quittez avec git cherry-pick --abort. Si la cible a déjà le changement, Git s'arrête à nouveau avec un choix vide, et git cherry-pick --skip ou --abort est la solution.

Résultat

Where you end: release/label a un nouveau commit avec le correctif de Priya, rédigé par Priya Nair et validé par GitTree Demo, avec un nouvel identifiant. La page a l'étiquette clarifiée, la note sans rapport n'est pas arrivée, priya/label et le serveur sont inchangés et l'arborescence de travail est propre.

Erreurs courantes

  • Penser que le choix des cerises déplace le commit. Il copie le changement ; l'original reste là où il était.
  • Choisir le mauvais commit, la note sans rapport au lieu du correctif.
  • Forcer un commit vide lorsque le changement est déjà sur la branche.
  • Utiliser le choix cerise pour copier une fonctionnalité entière, une validation à la fois, au lieu de la fusionner.

Si quelque chose ne va pas

Si la sélection s'arrête, lisez la bannière. Resolve et Continue terminent-le comme dans la leçon 23 ; Abort… renvoie la branche là où elle se trouvait. Si le choix était une erreur une fois terminé, le nouveau commit n'est que sur release/label : annulez-le ici, et la branche source n'a jamais été touchée.

Vérifiez votre compréhension

Répondez à chaque question, puis lisez pourquoi. Les questions marquées « Obligatoire » comptent pour terminer la leçon.

  1. Question 1 de 6

    Qu'est-ce que la copie triée sur le volet ?

    Choisissez une réponse.

  2. Question 2 de 6

    Après la sélection, lesquelles sont vraies à propos du nouveau commit ?

    Choisissez chaque réponse qui s'applique.

  3. Question 3 de 6
    Obligatoire

    Le correctif de Priya se trouve au-dessus d'un commit de note sans rapport. Vous sélectionnez uniquement le correctif sur release/label. Est-ce que docs/temporary-review.md est sur release/label ensuite ?

    Choisissez une réponse.

  4. Question 4 de 6

    Modifiez l'entrée : release/label n'a pas le formulaire d'inscription modifié par le correctif de Priya. Que se passe-t-il lorsque vous choisissez ?

    Choisissez une réponse.

  5. Question 5 de 6
    Obligatoire

    Vous choisissez un commit et Git s'arrête avec "Le choix précédent est maintenant vide". Le changement est déjà sur votre branche. Que fais-tu?

    Choisissez une réponse.

  6. Question 6 de 6
    Obligatoire

    Quelles relectures montrent que le choix a fait ce que dit la leçon ?

    Choisissez chaque réponse qui s'applique.

0 sur 6 corrects

Répondez correctement aux questions requises pour terminer la leçon.

Vérifié dans ce navigateur.

Pratique

Signalez l'ID, l'auteur et le committer du nouveau commit, ses chemins modifiés et si docs/temporary-review.md existe. Prédisez ensuite ce qui se passera si vous choisissez à nouveau le même commit sur release/label.

Votre propre confirmation : le site ne peut pas voir votre ordinateur.

Pour terminer la leçon, répondez correctement aux questions demandées et confirmez l'exercice pratique.

Récapitulatif

  • Cherry-pick copie la modification d'un commit en tant que nouveau commit.
  • Le parent et les commits avant restent en arrière.
  • Vérifiez les dépendances et les choix vides avant de forcer quoi que ce soit.

Termes du glossaire introduits

Choix de cerises — انتقاء ; validation source — إيداع المصدر ; cible — الهدف; dépendance — اعتماد.

Transcription vidéo

La narration de la vidéo, repère par repère.

Afficher la transcription
  1. Prenez un correctif d'une autre branche, et laisse le reste.
  2. Cherry-pick copie le changement d'un commit fait, comme un nouveau commit ici.
  3. La copie a un nouvel identifiant, mais conserve le l'auteur et le message.
  4. Construisez une ligne de base, la branche de Priya avec un note et un correctif, et votre branche de version.
  5. Ouvrez le dossier. Le graphique montre les deux branches à partir de la même ligne de base.
  6. Le correctif de Priya s'ajoute à un problème sans rapport remarque. Nous voulons seulement la solution.
  7. Sélectionnez le correctif. Un chemin modifié : index.html.
  8. Assurez-vous que l'étiquette de version est à jour et l'arbre de travail est propre.
  9. Cliquez avec le bouton droit sur le correctif et choisissez Engagement Cherry-Pick.
  10. Il n’y a pas de sélecteur de branches. Il s'applique à la branche sur laquelle vous vous trouvez.
  11. Sur le commit actuel lui-même, la commande est désactivé.
  12. Exécutez-le et attendez le vrai résultat.
  13. Un nouveau commit se trouve sur l’étiquette de version.
  14. Son identifiant diffère de celui de Priya, car son le parent est différent.
  15. L'auteur est toujours Priya. Le commiteur c'est toi.
  16. La page porte l'étiquette clarifiée.
  17. La note sans rapport n’est pas arrivée. Votre propre note est toujours là.
  18. La branche de Priya est exactement telle qu'elle était.
  19. Dans le terminal, git log avec un format montre le sujet, l'auteur et l'auteur.
  20. git diff-tree répertorie les chemins celui-ci le commit a changé.
  21. Le statut est vide. Il ne restait plus rien derrière.
  22. Avec l'option x, le message enregistre d'où vient la pioche.
  23. Choisissez à nouveau le même commit et Git s'arrête : la pioche est vide.
  24. Changer l'entrée : la cible n'a pas d'inscription forme.
  25. La pioche s'arrête sur un conflit. Résoudre et continuer, ou abandonner.
  26. Un changement peut dépendre de commits que vous n'avez pas effectués prendre. Testez la cible.
  27. Abandonner remet la branche en place. La source est jamais modifié.
  28. Pratique : signaler la nouvelle pièce d'identité, l'auteur, committer et fichiers.
  29. Ensuite, mettez de côté le travail inachevé en toute sécurité avec cachette.