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é.
- Niveau: Intermédiaire
- 11 minutes de lecture
- 5 minutes de vidéo
- Mis à jour
- Avant cette leçon: Lire l'historique sans bouger la TÊTE, Résoudre les conflits de fusion et de rebase
Progression enregistrée dans ce navigateur.
La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).
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
<!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
Temporary rehearsal note, deliberately dropped.index.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/integration-note.md — DOC_MERGE
# 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.
- Construisez la ligne de base et les deux branches comme le montre la section suivante. Consultez
release/labelet confirmez que l'arborescence de travail est propre. - 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. - 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.
- 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.
- 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. - Ouvrez
index.html: il s'agit de SIGNUP_LABEL.docs/temporary-review.mdn'est pas là et le vôtredocs/integration-note.mdl'est.priya/labelnomme toujours son ancienne astuce. - Laissez
release/labelpropre. Ne poussez pas et ne fusionnez paspriya/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 :
git switch --create label-baseEnregistrez SIGNUP sous index.html, puis :
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/labelEnregistrez DOC_NOISE sous docs/temporary-review.md, puis :
git add -- docs/temporary-review.md
git commit --quiet -m "docs: unrelated source note"Enregistrez SIGNUP_LABEL sous index.html, puis :
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 :
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"Choisissez maintenant le correctif et lisez le résultat :
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 --shortfix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.htmlL'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.
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.
En rapport
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
- Prenez un correctif d'une autre branche, et laisse le reste.
- Cherry-pick copie le changement d'un commit fait, comme un nouveau commit ici.
- La copie a un nouvel identifiant, mais conserve le l'auteur et le message.
- Construisez une ligne de base, la branche de Priya avec un note et un correctif, et votre branche de version.
- Ouvrez le dossier. Le graphique montre les deux branches à partir de la même ligne de base.
- Le correctif de Priya s'ajoute à un problème sans rapport remarque. Nous voulons seulement la solution.
- Sélectionnez le correctif. Un chemin modifié : index.html.
- Assurez-vous que l'étiquette de version est à jour et l'arbre de travail est propre.
- Cliquez avec le bouton droit sur le correctif et choisissez Engagement Cherry-Pick.
- Il n’y a pas de sélecteur de branches. Il s'applique à la branche sur laquelle vous vous trouvez.
- Sur le commit actuel lui-même, la commande est désactivé.
- Exécutez-le et attendez le vrai résultat.
- Un nouveau commit se trouve sur l’étiquette de version.
- Son identifiant diffère de celui de Priya, car son le parent est différent.
- L'auteur est toujours Priya. Le commiteur c'est toi.
- La page porte l'étiquette clarifiée.
- La note sans rapport n’est pas arrivée. Votre propre note est toujours là.
- La branche de Priya est exactement telle qu'elle était.
- Dans le terminal, git log avec un format montre le sujet, l'auteur et l'auteur.
- git diff-tree répertorie les chemins celui-ci le commit a changé.
- Le statut est vide. Il ne restait plus rien derrière.
- Avec l'option x, le message enregistre d'où vient la pioche.
- Choisissez à nouveau le même commit et Git s'arrête : la pioche est vide.
- Changer l'entrée : la cible n'a pas d'inscription forme.
- La pioche s'arrête sur un conflit. Résoudre et continuer, ou abandonner.
- Un changement peut dépendre de commits que vous n'avez pas effectués prendre. Testez la cible.
- Abandonner remet la branche en place. La source est jamais modifié.
- Pratique : signaler la nouvelle pièce d'identité, l'auteur, committer et fichiers.
- Ensuite, mettez de côté le travail inachevé en toute sécurité avec cachette.