Leçon 27 · Récupération
Réinitialisation : douce, mixte et dure
Déplacez une branche en arrière d'un commit de trois manières et voyez ce que chaque mode fait à la branche, à la zone de préparation et à vos fichiers, afin de choisir celui qui conserve le travail que vous souhaitez.
- Niveau: Avancé
- 12 minutes de lecture
- 6 minutes de vidéo
- Mis à jour
- Avant cette leçon: Prédisez ce que contiendra votre prochain commit, Lire l'historique sans bouger la TÊTE
Progression enregistrée dans ce navigateur.
La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).
Ce que vous apprendrez
- Dites ce que chaque mode de réinitialisation déplace : la branche, l'index et les fichiers sur le disque.
- Protéger le travail engagé et le travail non engagé avant un mode destructeur.
- Lisez la sortie d'état que chaque mode laisse derrière lui.
- Sachez quels fichiers une réinitialisation matérielle peut écraser, y compris ceux qui ne sont pas suivis.
Avant de commencer
Vous êtes sur private/reset, une branche qui commence à la page fusionnée M de la leçon 18 (« Voyez clairement votre travail. »). Il comporte un commit au-dessus de M, C, ce qui modifie le titre en « Examiner les modifications en toute confiance ». Une branche rescue/before-reset pointe déjà vers C. Après cette validation, vous avez à nouveau modifié la page pour "Comprendre chaque modification enregistrée.", et vous ne l'avez pas planifié ni validé. Vous avez également une note non suivie, docs/signup-hint.md. Vous souhaitez déplacer private/reset vers M.
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. La copie réinitialisée est jetable.
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
Une réinitialisation déplace la branche actuelle vers un autre commit. Le mode décide à quel point il touche davantage. Soft déplace uniquement la branche : l'index et vos fichiers restent tels qu'ils étaient, la différence apparaît donc sous forme de modifications échelonnées. Mixed déplace la branche et remplace l'index par la cible : vos fichiers restent, donc la différence apparaît sous forme de modifications non planifiées. Hard déplace la branche, remplace l'index et réécrit vos fichiers suivis vers la cible. Vos modifications non validées sur les fichiers suivis ont disparu.
La branche de sauvetage conserve le commit C, donc l'en-tête commit peut être retrouvé. Il ne conserve pas la modification la plus récente, qui n'a jamais été validée. Les commits peuvent être trouvés via le reflog ; les modifications non enregistrées ne le peuvent pas, car elles n'ont jamais été dans Git. Protégez-les vous-même avant tout mode destructeur.
La réinitialisation matérielle écrase également un fichier non suivi lorsque la cible a un fichier suivi sur le même chemin. Un fichier non suivi qui ne gêne pas, comme docs/signup-hint.md ici, est laissé seul. Il s’agit d’une observation sur ce projet, pas d’une promesse sur chaque fichier non suivi.
Dans les trois modes, la branche est la seule référence qui bouge : rescue/before-reset, les autres branches et tout ce qui se trouve sur un serveur restent tels qu'ils étaient.
GitTree demande en premier. Sa boîte de dialogue de réinitialisation indique ce qui restera, et pour une réinitialisation matérielle, elle indique que tout ce qu'il supprime est d'abord enregistré sous refs/ogt/trash afin qu'Annuler puisse le restaurer. Une réinitialisation effectuée dans le terminal ne crée aucun instantané de ce type.
Préparer l’état exact du projet
Commencez à partir d’une copie ordinaire séparée du résultat fusionné M de la leçon 18 et laissez votre original intact. Créez la branche, enregistrez SARA en tant que commit d'en-tête et branchez-y la référence de secours. Enregistrez ensuite OMAR sans mise en scène et DOC_HINT en tant que nouveau fichier. Conservez une copie d'OMAR et de la note en dehors de Git, puis faites trois copies identiques, une pour chacune des versions logicielle, mixte et matérielle.
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 — FUSIONNÉ
<!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>
</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>index.html — LEP
<!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">Review changes with confidence.</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>
</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>index.html — OMAR
<!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">Understand each saved change.</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>
</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/signup-hint.md — DOC_HINT
Unfinished signup hint: use fictional data only.Dans GitTree
Ouvrez la palette avec Commande+Maj+P (Ctrl+Maj+P sur Ubuntu). La réinitialisation se trouve dans le menu contextuel d'un commit, sous le sous-menu Reset private/reset to This Commit.
- Construisez la branche, la référence de secours, la modification non mise en scène et la note comme le montre la section suivante. Conservez une copie de la modification et de la note en dehors de Git. Faites trois copies identiques et ouvrez-les dans trois onglets.
- Soft copy. Dans le graphique, cliquez avec le bouton droit sur M (le commit en dessous de C, pas la pointe de la branche) et ouvrez Reset private/reset to This Commit. Choisissez Soft: Keep All Changes Staged. La boîte de dialogue de confirmation indique que chaque modification depuis lors reste intermédiaire et qu'aucun fichier ne change. Choisissez Reset private/reset.
- Vérifiez le résultat logiciel : la branche est sur M, la page sur le disque indique toujours "Comprendre chaque modification enregistrée.", et les listes préparées et non préparées contiennent toutes deux
index.html. - Mixed copy. Choisissez Mixed: Keep Changes in the Working Folder sur M. La boîte de dialogue indique que chaque modification reste dans votre copie de travail, sans préparation. Choisissez Reset private/reset. La branche est sur M, la page sur le disque est la même modification et la modification est uniquement non mise en scène.
- Hard copy. Seulement après avoir enregistré la modification et la note ailleurs, choisissez Hard: Discard All Changes… sur M. La boîte de dialogue est un avertissement : elle répertorie ce qui est supprimé et indique qu'il est d'abord conservé sous
refs/ogt/trash. Lisez-le. La valeur par défaut est Annuler. Choisissez Discard and reset private/reset. - Vérifiez le résultat concret : la branche est sur M, la page est l'en-tête de M et la liste des modifications affiche uniquement la note non suivie. L'avis indique "Réinitialiser à" et le commit.
- Comparez les trois copies et
rescue/before-reset, qui est toujours sur C. N'en poussez aucune.
Les commandes de réinitialisation sont désactivées sur le commit sur lequel la branche est déjà active et lorsqu'aucune branche n'est extraite.
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 :
git switch --create private/resetEnregistrez SARA sous index.html, puis :
git add -- index.html
git commit --quiet -m "feat: reset snapshot example"
git branch rescue/before-resetEnregistrez OMAR sous index.html sans transfert et DOC_HINT sous docs/signup-hint.md. Conservez une copie des deux en dehors de Git, puis faites trois copies identiques. Dans chacun :
TARGET_SHA="$(git rev-parse rescue/before-reset^)"Copie électronique uniquement :
git reset --quiet --soft "$TARGET_SHA"Copie mixte uniquement :
git reset --quiet --mixed "$TARGET_SHA"Copie papier uniquement, dans sa copie jetable :
git reset --quiet --hard "$TARGET_SHA"Dans chaque exemplaire lire :
git rev-parse HEAD
git show :index.html
git status --shortChaque HEAD est M. L'index contient SARA après soft et la page de M après mixte et hard. Le fichier sur le disque est OMAR après soft et mixé et la page de M après hard. Les statuts étaient :
Doux :
MM index.html
?? docs/signup-hint.mdMixte :
M index.html
?? docs/signup-hint.mdDifficile :
?? docs/signup-hint.mdLa réinitialisation du terminal n'a créé aucun instantané GitTree. git reflog répertorie toujours C, mais OMAR n'y figure nulle part. Dans un laboratoire de sauvegarde distinct, une réinitialisation matérielle d'un commit comportant un docs/signup-hint.md suivi a écrasé un fichier non suivi sur ce chemin.
Résultat
Where you end: les trois branches sont sur M. Soft : l'index contient SARA et le fichier contient OMAR. Mixte : l'index contient M et le fichier contient OMAR. Difficile : les deux contiennent M. La note non suivie reste dans chaque copie et rescue/before-reset est toujours sur C.
Erreurs courantes
- Traiter la branche de sauvetage comme une sauvegarde d'un travail plus récent et non engagé.
- Utiliser la réinitialisation matérielle pour ranger une caisse sans enregistrer les modifications au préalable.
- Je m'attends à ce qu'une réinitialisation logicielle ne laisse rien de prévu.
- Réinitialiser une branche que vous avez déjà poussée, puis la pousser sur le travail d'un coéquipier.
Si quelque chose ne va pas
Utilisez la référence de secours pour retrouver le titre validé et vos copies externes pour la modification et la note. Dans GitTree, une réinitialisation matérielle effectuée via l'application a d'abord enregistré un instantané afin que l'annulation puisse le restaurer. Une réinitialisation effectuée dans le terminal ne l'a pas fait.
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
Exécutez les trois relectures dans chaque copie et remplissez un tableau : où pointe la branche, ce que contient l'index, ce que contient le fichier. Dites ensuite quel mode vous utiliseriez pour refaire le message du commit, lequel pour tout supprimer et lequel pour tout supprimer.
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
- Soft déplace uniquement la branche.
- Mixed réinitialise également l'index.
- Hard réécrit également vos fichiers.
En rapport
Termes du glossaire introduits
Réinitialiser — إعادة تعيين; doux — ناعمة; mixte — مختلطة; dur — كاملة; branche de sauvetage — فرع حفظ.
Transcription vidéo
La narration de la vidéo, repère par repère.
Afficher la transcription
- Reculez une branche et choisissez combien sinon ça change.
- Soft déplace la branche. Mixed ajoute le indice. Hard ajoute vos fichiers.
- La différence est donc échelonnée, non échelonnée, ou parti.
- Construire un départ : un commit, un sauvetage branche, une modification non enregistrée et une note.
- Faites trois copies identiques et écrivez en bas de l'identité de M.
- La modification n'a jamais été validée. Conserver une copie en dehors de Git.
- Le graphique montre M, puis C, et le sauvetage branche sur C.
- Cliquez avec le bouton droit sur M, ouvrez le sous-menu de réinitialisation et choisissez Doux.
- La boîte de dialogue indique que chaque changement reste par étapes, et aucun changement de fichier.
- La succursale est sur M maintenant. C est toujours sur le branche de sauvetage.
- La liste par étapes contient l'ancien commit. Le la liste non mise en scène a votre modification.
- Le fichier sur le disque contient toujours votre modification.
- Copie mixte : même menu, choisissez Mixte.
- Cette boîte de dialogue indique que les modifications restent, sans mise en scène.
- Désormais, index.html n'est plus mis en scène.
- Votre modification est toujours dans le fichier.
- Avant de commencer, enregistrez la modification et la note ailleurs.
- Copie papier : choisissez Papier, avec les points qui signifie un avertissement.
- La boîte de dialogue répertorie ce qui est supprimé et indique il est enregistré en premier. Annuler est la valeur par défaut.
- Choisissez de supprimer et de réinitialiser.
- Il ne reste que la note. La page est celle de M encore une fois.
- Dans le terminal, la première lecture est le commettre. Tous les trois sont M.
- git show avec deux points lit l'index. Soft conserve l'ancienne page.
- Le statut est différent dans chaque copie.
- La branche de secours est toujours sur l'ancienne commettre.
- Et le fichier sur disque : votre édition deux fois, M's se diriger une fois.
- Modifier l'entrée : pas de copie externe, et dur dans le terminal.
- Le reflog répertorie les commits. La modification non enregistrée n'y est nulle part.
- Et écrase en dur un fichier non suivi, si la cible en a un là-bas.
- Le doux et le mixte ne perdent rien. Difficile dans le l'application est enregistrée en premier.
- Pratique : remplir une table de branche, index et fichier pour chaque mode.
- Ensuite, annulez un commit partagé sans réécrire l'histoire, avec revert.