Leçon 22 · Histoire et intégration
Réorganiser, écraser, reformuler et supprimer les commits locaux
Transformez cinq commits privés approximatifs en deux commits propres : déplacez un correctif dépendant, reformulez un message, pliez et écrasez les étapes, supprimez uniquement le bruit et vérifiez que le résultat contient exactement les fichiers souhaités.
- Niveau: Avancé
- 13 minutes de lecture
- 7 minutes de vidéo
- Mis à jour
- Avant cette leçon: Rebaser un travail inédit sur une nouvelle base
Progression enregistrée dans ce navigateur.
La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).
Ce que vous apprendrez
- Lire un plan de replay : étape la plus ancienne en premier, appliquée de haut en bas.
- Choisissez la bonne action : reformuler, écraser, corriger ou supprimer.
- Déplacer un pas sans casser le pas dont il dépend.
- Vérifiez ensuite les nouveaux commits, les fichiers et la branche de secours.
Avant de commencer
Votre branche private/signup-polish comporte cinq commits qui n'existent que sur votre ordinateur, en plus du commit M. L'arborescence de travail est propre et rescue/before-polish pointe vers le cinquième commit. Dans l'ordre, le plus ancien en premier :
| Étape | S'engager | Ce que ça fait |
|---|---|---|
| C1 | exploit : ajouter un brouillon d'inscription | ajoute le formulaire d'inscription |
| C2 | docs : expliquer l'examen de l'inscription | ajoute docs/replay-a.md |
| C3 | docs : expliquer la validation | ajoute docs/replay-b.md |
| C4 | réparation! exploit : ajouter un brouillon d'inscription | corrige l'étiquette du formulaire |
| C5 | corvée : note temporaire | ajoute docs/temporary-review.md |
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 et ne réécrivez jamais les engagements que d'autres personnes ont déjà.
Apportez les modifications dans GitTree ou avec les commandes Git natives, pas les deux sur 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
Un rebase interactif est un plan, pas un jeu de tri. Git relit les commits répertoriés un par un sur la base, du haut de la liste vers le bas, donc l'étape la plus ancienne vient en premier. Chaque action indique à Git quoi faire en une seule étape :
- Pick conserve le commit tel quel.
- Reword conserve son contenu et vous permet de rédiger un nouveau message.
- Squash replie le commit dans le commit conservé au-dessus et vous permet d'écrire un message combiné.
- Fixup le plie également, mais jette son propre message.
- Drop laisse entièrement de côté la modification du commit.
L’ordre compte. Une étape qui dépend d'une autre (ici le correctif d'étiquette a besoin du formulaire de C1) doit rester en dessous. L'éditeur vous laissera le déplacer vers le haut, puis la relecture s'arrêtera avec un conflit. GitTree refuse également les plans que Git ne peut pas exécuter : un plan qui supprime chaque commit, un squash sans rien au-dessus dans lequel se replier et un message vide.
Chaque commit rejoué obtient un nouvel identifiant, car son parent change. Seule cette branche est réécrite ; la branche de secours garde les cinq anciens. Les validations déjà présentes sur une télécommande sont marquées "Sur une télécommande" et leur réécriture nécessite une confirmation explicite. Cette leçon ne le confirme jamais.
Le plan que vous construirez transforme cinq commits en deux :
| Étape | S'engager | Action | Résultat |
|---|---|---|---|
| 1 | C1 | Reformuler | exploit : remplir le formulaire d'inscription local |
| 2 | C4 | Réparation | plié à l'étape 1 |
| 3 | C3 | Choisir | conservé; la cible de la courge |
| 4 | C2 | Courge | docs : expliquez l'examen et la validation de l'inscription |
| 5 | C5 | Laisser tomber | parti |
Préparer l’état exact du projet
Commencez à partir d’une copie ordinaire séparée du projet tel que la leçon 18 l’a laissé. Laissez votre gittree-features d'origine intact. Créez les cinq commits ci-dessous sur une nouvelle branche, un fichier à la fois, et enregistrez chaque corps complet uniquement à son étape nommée.
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/replay-a.md — DOC_A
# Local signup review
Review the label and hint together.docs/replay-b.md — DOC_B
# Local validation review
No address leaves this demonstration.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/temporary-review.md — DOC_NOISE
Temporary rehearsal note, deliberately dropped.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 les cinq commits et la branche de secours comme le montre la section suivante, avec
private/signup-polishextrait et nettoyé. Notez M et les cinq sujets. - Cliquez avec le bouton droit sur M, le commit juste en dessous des cinq, et choisissez Edit History → Interactive Rebase of the Commits Above…. L'éditeur s'ouvre sur les cinq marches privées, la plus ancienne en premier.
- Sous Options for this rebase, laissez les trois options désactivées, y compris Arrange fixup!, squash! and amend! commits. Vous déplacerez la réparation vous-même.
- Concentrez la ligne C4 et appuyez deux fois sur Alt+↑, puis concentrez-vous sur C3 et appuyez une fois sur Alt+↑. L'ordre est désormais C1, C4, C3, C2, C5. En appuyant sur p, r, e, s, f ou d sur une ligne ciblée, vous définissez Pick, Reword, Edit, Squash, Fixup ou Drop.
- Définissez C1 sur Reword et tapez
feat: complete the local signup formdans son champ de message. Réglez C4 sur Fixup. - Gardez C3 comme Pick et définissez C2 sur Squash. Sous Squashed commits, le groupe « 2 commits dans les documents : expliquer la validation » affiche un message combiné. Remplacez-le par
docs: explain signup review and validation. - Réglez C5 sur Drop. Lisez à nouveau chaque ligne et le message combiné. Rien n'est marqué "Sur une télécommande", aucune confirmation n'est donc nécessaire.
- Choisissez Start Rebase une fois et attendez. S'il s'arrête, utilisez la bannière pour continuer ; ne recommencez pas tout le plan.
- Vérifiez deux nouveaux commits, le correctif d'étiquette dans la page, les deux documents et aucune note temporaire. Conservez
rescue/before-polishet laissez l'arborescence de travail propre.
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
Construisez les cinq commits sur une nouvelle branche, en sauvegardant chaque corps complet à son étape :
git switch --create private/signup-polishEnregistrez SIGNUP sous index.html, puis :
git add -- index.html
git commit --quiet -m "feat: add signup draft"Enregistrez DOC_A sous docs/replay-a.md, puis :
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"Enregistrez DOC_B sous docs/replay-b.md, puis :
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"Enregistrez SIGNUP_LABEL sous index.html, puis :
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"Enregistrez DOC_NOISE sous docs/temporary-review.md, puis :
git add -- docs/temporary-review.md
git commit --quiet -m "chore: temporary note"Protégez l'ancienne pointe et répertoriez la plage, la plus ancienne en premier :
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEADDémarrez maintenant le rebase interactif (-i est la forme abrégée de --interactive). Git ouvre votre éditeur avec la liste de tâches (vos identifiants seront différents) :
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"pick 1a2b3c4 feat: add signup draft
pick 2b3c4d5 docs: explain signup review
pick 3c4d5e6 docs: explain validation
pick 4d5e6f7 fixup! feat: add signup draft
pick 5e6f708 chore: temporary noteRéécrivez les cinq lignes dans le plan, en conservant le propre identifiant de chaque ligne, et enregistrez :
reword 1a2b3c4 feat: add signup draft
fixup 4d5e6f7 fixup! feat: add signup draft
pick 3c4d5e6 docs: explain validation
squash 2b3c4d5 docs: explain signup review
drop 5e6f708 chore: temporary noteGit ouvre ensuite l'éditeur deux fois de plus. Pour la reformulation, remplacez le message par feat: complete the local signup form. Pour la courge, il affiche les deux messages ; remplacez-les par une seule ligne, docs: explain signup review and validation. Vérifiez le résultat :
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short2
feat: complete the local signup form
docs: explain signup review and validationLe statut est vide. index.html est SIGNUP_LABEL, les deux documents existent et docs/temporary-review.md non.
Si vous mettez un squash sur la première ligne, Git s'arrête immédiatement avec error: cannot 'squash' without a previous commit. Corrigez la liste avec git rebase --edit-todo et git rebase --continue, ou quittez avec git rebase --abort. Avec --autosquash, Git effectue le déplacement et l'action pour fixup! commits pour vous ; cette leçon le désactive pour afficher le plan.
Résultat
Where you end: deux commits réécrits au-dessus de M, "feat : remplir le formulaire d'inscription local" et "docs : expliquer l'examen et la validation de l'inscription". La page a le correctif d'étiquette, les deux documents sont là et la note temporaire ne l'est pas. Les cinq anciens commits sont conservés par la branche de sauvetage et l'arborescence de travail est propre.
Erreurs courantes
- Utiliser Drop pour masquer un commit dont vous pourriez avoir besoin. Le changement n’est pas du tout dans la nouvelle histoire.
- Déplacer un correctif au-dessus du commit qu'il corrige.
- Écraser la première marche, qui n’a rien au-dessus dans lequel se replier.
- Recommencer le plan une fois qu'il est terminé, au lieu de vérifier d'abord le résultat.
Si quelque chose ne va pas
Avant de commencer, Cancel laisse la branche telle quelle. Si GitTree indique que la branche a changé depuis l'ouverture de l'éditeur, fermez l'éditeur et rouvrez-le. Si le rebase s'arrête, corrigez le conflit ou le message et continuez à partir de la bannière, ou abandonnez-le délibérément. Une fois l'opération terminée, comparez avec rescue/before-polish avant d'essayer de restaurer quoi que ce soit.
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
Expliquez le plan C1, C4, C3, C2, C5 et les deux messages qui survivent. Vérifiez l'ancienne plage 5, la nouvelle plage 2, les fichiers attendus et aucune note. Ensuite, prédisez, sans l'exécuter, pourquoi déplacer C4 au-dessus de C1 ou écraser l'étape 1 ne peut pas fonctionner.
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
- Un plan de relecture a un ordre et des dépendances.
- Squash conserve les deux messages pour que vous puissiez les combiner ; la correction supprime la sienne.
- Drop supprime le changement lui-même, donc ne supprime que le vrai bruit.
En rapport
Termes du glossaire introduits
Reformuler — إعادة صياغة; courge — ضمّ; correction - ضمّ مع تجاهل الرسالة; laisser tomber — إسقاط; plan de relecture — خطة إعادة تطبيق.
Transcription vidéo
La narration de la vidéo, repère par repère.
Afficher la transcription
- Cinq commits approximatifs deviennent deux commits propres, en toute sécurité.
- Le rebase interactif est un plan : une liste de marches, la plus ancienne en premier.
- Git rejoue la liste de haut en bas sur un socle.
- Chaque étape donne lieu à une action : choisir, reformuler, écraser, réparer ou laisser tomber.
- Tout d'abord, créez cinq commits privés et un branche de sauvetage.
- Trois sont un vrai travail. L'un est une solution, et l'autre est un bruit temporaire.
- Cliquez avec le bouton droit sur le commit en dessous d'eux, et ouvrez Modifier l'historique.
- Choisissez le rebase interactif des commits Ci-dessus.
- L'éditeur répertorie les cinq étapes, les plus anciennes d'abord.
- Laissez les trois options désactivées. Nous allons bouger la réparation nous-mêmes.
- Le correctif appartient juste après le commit ça corrige. Déplacez-le deux fois.
- Déplacez maintenant la note de validation au-dessus du note de révision.
- L'ordre est maintenant un, quatre, trois, deux, cinq.
- Définissez la première étape sur Reformuler et écrivez le nouveau message.
- Définissez l’étape de correction sur Fixup. Son message est jeté.
- Conservez la note de validation et écrasez le examinez la note dedans.
- Squash affiche les deux messages. Écrivez-en un message pour le couple.
- Supprimez la note temporaire. Son changement sera pas survivre.
- Relisez chaque ligne une fois de plus. Rien n'est sur un à distance.
- Choisissez Start Rebase une fois et attendez pour finir.
- Le graphique comporte désormais deux commits au-dessus du socle.
- Les deux ont de nouveaux identifiants. Les cinq vieux sont sur le branche de sauvetage.
- Ouvrez la page : le correctif d'étiquette est là. Le le bruit a disparu.
- Maintenant le même plan dans le terminal, avec git rebase -i.
- Git ouvre la liste des tâches. Le plus vieux en premier, tous prêt à choisir.
- Réécrivez les lignes dans notre plan : reformulez, réparer, choisir, écraser, laisser tomber.
- Git demande les deux messages. Écrivez-en un ligne pour chacun.
- Comptez les commits au-dessus de la base : deux.
- Énumérez les sujets. Ce sont les deux que nous a écrit.
- Le statut est vide et la note temporaire est parti.
- Changer l'entrée : mettre la courge sur le première étape.
- Il n'y a rien au-dessus dans lequel se plier, donc Git refuse.
- Ou déplacez le correctif au-dessus de son commit : le la relecture s'arrête avec un conflit.
- S'il s'arrête, réparez-le et continuez. Ou abandonner et rien ne change.
- La branche de secours détient toujours votre cinq commits originaux.
- Ne réécrivez jamais les commits de quelqu'un d'autre l'a déjà fait.
- Pratique : expliquer le plan et pourquoi l'étape on ne peut pas être une courge.
- Ensuite, résolvez les conflits lors d'une fusion ou d'un le rebase s'arrête.