Passer au contenu
GitTree

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.

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

  • 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É

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>
  </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

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">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

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">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

Sortie
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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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 :

Command · bash
git switch --create private/reset

Enregistrez SARA sous index.html, puis :

Command · bash
git add -- index.html
git commit --quiet -m "feat: reset snapshot example"
git branch rescue/before-reset

Enregistrez 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 :

Command · bash
TARGET_SHA="$(git rev-parse rescue/before-reset^)"

Copie électronique uniquement :

Command · bash
git reset --quiet --soft "$TARGET_SHA"

Copie mixte uniquement :

Command · bash
git reset --quiet --mixed "$TARGET_SHA"

Copie papier uniquement, dans sa copie jetable :

Command · bash
git reset --quiet --hard "$TARGET_SHA"

Dans chaque exemplaire lire :

Command · bash
git rev-parse HEAD
git show :index.html
git status --short

Chaque 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 :

Sortie
MM index.html
?? docs/signup-hint.md

Mixte :

Sortie
 M index.html
?? docs/signup-hint.md

Difficile :

Sortie
?? docs/signup-hint.md

La 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.

  1. Question 1 de 6

    Quel mode de réinitialisation déplace uniquement la branche et laisse l'index et vos fichiers tels qu'ils étaient ?

    Choisissez une réponse.

  2. Question 2 de 6

    Lesquelles de ces affirmations sont vraies pour une réinitialisation matérielle ?

    Choisissez chaque réponse qui s'applique.

  3. Question 3 de 6
    Obligatoire

    Dans la copie mixte, vous réinitialisez private/reset sur M. Qu'imprime git status --short ?

    Choisissez une réponse.

  4. Question 4 de 6

    Modifiez l'entrée : vous n'avez pas enregistré la modification et la note en dehors de Git, et vous exécutez la réinitialisation matérielle dans le terminal. D'où pouvez-vous récupérer la modification ?

    Choisissez une réponse.

  5. Question 5 de 6
    Obligatoire

    Après une réinitialisation, git status --short imprime MM index.html. Quel mode a été exécuté et que contient l'index ?

    Choisissez une réponse.

  6. Question 6 de 6
    Obligatoire

    Après la réinitialisation matérielle de sa copie jetable, quelles relectures montrent qu'il 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

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.

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
  1. Reculez une branche et choisissez combien sinon ça change.
  2. Soft déplace la branche. Mixed ajoute le indice. Hard ajoute vos fichiers.
  3. La différence est donc échelonnée, non échelonnée, ou parti.
  4. Construire un départ : un commit, un sauvetage branche, une modification non enregistrée et une note.
  5. Faites trois copies identiques et écrivez en bas de l'identité de M.
  6. La modification n'a jamais été validée. Conserver une copie en dehors de Git.
  7. Le graphique montre M, puis C, et le sauvetage branche sur C.
  8. Cliquez avec le bouton droit sur M, ouvrez le sous-menu de réinitialisation et choisissez Doux.
  9. La boîte de dialogue indique que chaque changement reste par étapes, et aucun changement de fichier.
  10. La succursale est sur M maintenant. C est toujours sur le branche de sauvetage.
  11. La liste par étapes contient l'ancien commit. Le la liste non mise en scène a votre modification.
  12. Le fichier sur le disque contient toujours votre modification.
  13. Copie mixte : même menu, choisissez Mixte.
  14. Cette boîte de dialogue indique que les modifications restent, sans mise en scène.
  15. Désormais, index.html n'est plus mis en scène.
  16. Votre modification est toujours dans le fichier.
  17. Avant de commencer, enregistrez la modification et la note ailleurs.
  18. Copie papier : choisissez Papier, avec les points qui signifie un avertissement.
  19. 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.
  20. Choisissez de supprimer et de réinitialiser.
  21. Il ne reste que la note. La page est celle de M encore une fois.
  22. Dans le terminal, la première lecture est le commettre. Tous les trois sont M.
  23. git show avec deux points lit l'index. Soft conserve l'ancienne page.
  24. Le statut est différent dans chaque copie.
  25. La branche de secours est toujours sur l'ancienne commettre.
  26. Et le fichier sur disque : votre édition deux fois, M's se diriger une fois.
  27. Modifier l'entrée : pas de copie externe, et dur dans le terminal.
  28. Le reflog répertorie les commits. La modification non enregistrée n'y est nulle part.
  29. Et écrase en dur un fichier non suivi, si la cible en a un là-bas.
  30. Le doux et le mixte ne perdent rien. Difficile dans le l'application est enregistrée en premier.
  31. Pratique : remplir une table de branche, index et fichier pour chaque mode.
  32. Ensuite, annulez un commit partagé sans réécrire l'histoire, avec revert.