CINXE.COM
Git - Reset démystifié
<!DOCTYPE html> <html lang="fr"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - Reset démystifié</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-Tools-Reset-Demystified">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git-Al%c9%99tl%c9%99ri-Reset-Demystified">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Tools-Reset-entzaubert">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Herramientas-de-Git-Reiniciar-Desmitificado">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Utilitaires-Git-Reset-d%c3%a9mystifi%c3%a9">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git-%e3%81%ae%e3%81%95%e3%81%be%e3%81%96%e3%81%be%e3%81%aa%e3%83%84%e3%83%bc%e3%83%ab-%e3%83%aa%e3%82%bb%e3%83%83%e3%83%88%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e8%a9%b3%e8%aa%ac">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Reset-%eb%aa%85%ed%99%95%ed%9e%88-%ec%95%8c%ea%b3%a0-%ea%b0%80%ea%b8%b0">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Tools-Reset-ontrafeld">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%98%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-Git-%d0%a0%d0%b0%d1%81%d0%ba%d1%80%d1%8b%d1%82%d0%b8%d0%b5-%d1%82%d0%b0%d0%b9%d0%bd-reset">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Orodja-Git-Demistifikacija-ponastavitve">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Git-na-Kasangkapan-Ang-Reset-Demystified">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%86%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b8-Git-%d0%a3%d1%81%d0%b2%d1%96%d0%b4%d0%be%d0%bc%d0%bb%d0%b5%d0%bd%d0%bd%d1%8f-%d1%81%d0%ba%d0%b8%d0%b4%d0%b0%d0%bd%d0%bd%d1%8f-reset">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e9%87%8d%e7%bd%ae%e6%8f%ad%e5%af%86">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Tools-Reset-Demystified">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/Git-%d0%90%d0%bb%d0%b0%d1%82%d0%ba%d0%b8-Reset-Demystified">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Narz%c4%99dzia-Gita-Reset-Demystified">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b0%d0%bb%d0%b0%d1%82%d0%b8-%d0%94%d0%b5%d0%bc%d0%b8%d1%81%d1%82%d0%b8%d1%84%d0%b8%d0%ba%d0%be%d0%b2%d0%b0%d0%bd%d0%b8-%d1%80%d0%b5%d1%81%d0%b5%d1%82">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Tools-Reset-Demystified">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-%e5%b7%a5%e5%85%b7-Reset-Demystified">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Tools-Reset-Demystified">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Tools-Reset-Demystified" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Tools-Reset-Demystified">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Tools-Reset-Demystified">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Tools-Reset-Demystified">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Git-Tools-Reset-Demystified">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ferramentas-do-Git-Reset-Demystified">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Tools-Reset-Demystified">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Reset-Komutunun-Gizemleri">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-fr">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/fr/v2/D%c3%a9marrage-rapide-%c3%80-propos-de-la-gestion-de-version">Démarrage rapide</a></h2> <ol> <li> 1.1 <a href="/book/fr/v2/D%c3%a9marrage-rapide-%c3%80-propos-de-la-gestion-de-version">À propos de la gestion de version</a> </li> <li> 1.2 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Une-rapide-histoire-de-Git">Une rapide histoire de Git</a> </li> <li> 1.3 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Rudiments-de-Git">Rudiments de Git</a> </li> <li> 1.4 <a href="/book/fr/v2/D%c3%a9marrage-rapide-La-ligne-de-commande">La ligne de commande</a> </li> <li> 1.5 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Installation-de-Git">Installation de Git</a> </li> <li> 1.6 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Param%c3%a9trage-%c3%a0-la-premi%c3%a8re-utilisation-de-Git">Paramétrage à la première utilisation de Git</a> </li> <li> 1.7 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Obtenir-de-l%e2%80%99aide">Obtenir de l’aide</a> </li> <li> 1.8 <a href="/book/fr/v2/D%c3%a9marrage-rapide-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/fr/v2/Les-bases-de-Git-D%c3%a9marrer-un-d%c3%a9p%c3%b4t-Git">Les bases de Git</a></h2> <ol> <li> 2.1 <a href="/book/fr/v2/Les-bases-de-Git-D%c3%a9marrer-un-d%c3%a9p%c3%b4t-Git">Démarrer un dépôt Git</a> </li> <li> 2.2 <a href="/book/fr/v2/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%c3%a9p%c3%b4t">Enregistrer des modifications dans le dépôt</a> </li> <li> 2.3 <a href="/book/fr/v2/Les-bases-de-Git-Visualiser-l%e2%80%99historique-des-validations">Visualiser l’historique des validations</a> </li> <li> 2.4 <a href="/book/fr/v2/Les-bases-de-Git-Annuler-des-actions">Annuler des actions</a> </li> <li> 2.5 <a href="/book/fr/v2/Les-bases-de-Git-Travailler-avec-des-d%c3%a9p%c3%b4ts-distants">Travailler avec des dépôts distants</a> </li> <li> 2.6 <a href="/book/fr/v2/Les-bases-de-Git-%c3%89tiquetage">Étiquetage</a> </li> <li> 2.7 <a href="/book/fr/v2/Les-bases-de-Git-Les-alias-Git">Les alias Git</a> </li> <li> 2.8 <a href="/book/fr/v2/Les-bases-de-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/fr/v2/Les-branches-avec-Git-Les-branches-en-bref">Les branches avec Git</a></h2> <ol> <li> 3.1 <a href="/book/fr/v2/Les-branches-avec-Git-Les-branches-en-bref">Les branches en bref</a> </li> <li> 3.2 <a href="/book/fr/v2/Les-branches-avec-Git-Branches-et-fusions%c2%a0:-les-bases">Branches et fusions : les bases</a> </li> <li> 3.3 <a href="/book/fr/v2/Les-branches-avec-Git-Gestion-des-branches">Gestion des branches</a> </li> <li> 3.4 <a href="/book/fr/v2/Les-branches-avec-Git-Travailler-avec-les-branches">Travailler avec les branches</a> </li> <li> 3.5 <a href="/book/fr/v2/Les-branches-avec-Git-Branches-de-suivi-%c3%a0-distance">Branches de suivi à distance</a> </li> <li> 3.6 <a href="/book/fr/v2/Les-branches-avec-Git-Rebaser-Rebasing">Rebaser (Rebasing)</a> </li> <li> 3.7 <a href="/book/fr/v2/Les-branches-avec-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/fr/v2/Git-sur-le-serveur-Protocoles">Git sur le serveur</a></h2> <ol> <li> 4.1 <a href="/book/fr/v2/Git-sur-le-serveur-Protocoles">Protocoles</a> </li> <li> 4.2 <a href="/book/fr/v2/Git-sur-le-serveur-Installation-de-Git-sur-un-serveur">Installation de Git sur un serveur</a> </li> <li> 4.3 <a href="/book/fr/v2/Git-sur-le-serveur-G%c3%a9n%c3%a9ration-des-cl%c3%a9s-publiques-SSH">Génération des clés publiques SSH</a> </li> <li> 4.4 <a href="/book/fr/v2/Git-sur-le-serveur-Mise-en-place-du-serveur">Mise en place du serveur</a> </li> <li> 4.5 <a href="/book/fr/v2/Git-sur-le-serveur-D%c3%a9mon-Daemon-Git">Démon (Daemon) Git</a> </li> <li> 4.6 <a href="/book/fr/v2/Git-sur-le-serveur-HTTP-intelligent">HTTP intelligent</a> </li> <li> 4.7 <a href="/book/fr/v2/Git-sur-le-serveur-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/fr/v2/Git-sur-le-serveur-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/fr/v2/Git-sur-le-serveur-Git-h%c3%a9berg%c3%a9">Git hébergé</a> </li> <li> 4.10 <a href="/book/fr/v2/Git-sur-le-serveur-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/fr/v2/Git-distribu%c3%a9-D%c3%a9veloppements-distribu%c3%a9s">Git distribué</a></h2> <ol> <li> 5.1 <a href="/book/fr/v2/Git-distribu%c3%a9-D%c3%a9veloppements-distribu%c3%a9s">Développements distribués</a> </li> <li> 5.2 <a href="/book/fr/v2/Git-distribu%c3%a9-Contribution-%c3%a0-un-projet">Contribution à un projet</a> </li> <li> 5.3 <a href="/book/fr/v2/Git-distribu%c3%a9-Maintenance-d%e2%80%99un-projet">Maintenance d’un projet</a> </li> <li> 5.4 <a href="/book/fr/v2/Git-distribu%c3%a9-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/fr/v2/GitHub-Configuration-et-param%c3%a9trage-d%e2%80%99un-compte">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/fr/v2/GitHub-Configuration-et-param%c3%a9trage-d%e2%80%99un-compte">Configuration et paramétrage d’un compte</a> </li> <li> 6.2 <a href="/book/fr/v2/GitHub-Contribution-%c3%a0-un-projet">Contribution à un projet</a> </li> <li> 6.3 <a href="/book/fr/v2/GitHub-Maintenance-d%e2%80%99un-projet">Maintenance d’un projet</a> </li> <li> 6.4 <a href="/book/fr/v2/GitHub-Gestion-d%e2%80%99un-regroupement">Gestion d’un regroupement</a> </li> <li> 6.5 <a href="/book/fr/v2/GitHub-%c3%89criture-de-scripts-pour-GitHub">Écriture de scripts pour GitHub</a> </li> <li> 6.6 <a href="/book/fr/v2/GitHub-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/fr/v2/Utilitaires-Git-S%c3%a9lection-des-versions">Utilitaires Git</a></h2> <ol> <li> 7.1 <a href="/book/fr/v2/Utilitaires-Git-S%c3%a9lection-des-versions">Sélection des versions</a> </li> <li> 7.2 <a href="/book/fr/v2/Utilitaires-Git-Indexation-interactive">Indexation interactive</a> </li> <li> 7.3 <a href="/book/fr/v2/Utilitaires-Git-Remisage-et-nettoyage">Remisage et nettoyage</a> </li> <li> 7.4 <a href="/book/fr/v2/Utilitaires-Git-Signer-votre-travail">Signer votre travail</a> </li> <li> 7.5 <a href="/book/fr/v2/Utilitaires-Git-Recherche">Recherche</a> </li> <li> 7.6 <a href="/book/fr/v2/Utilitaires-Git-R%c3%a9%c3%a9crire-l%e2%80%99historique">Réécrire l’historique</a> </li> <li> 7.7 <a href="/book/fr/v2/Utilitaires-Git-Reset-d%c3%a9mystifi%c3%a9" class="active">Reset démystifié</a> </li> <li> 7.8 <a href="/book/fr/v2/Utilitaires-Git-Fusion-avanc%c3%a9e">Fusion avancée</a> </li> <li> 7.9 <a href="/book/fr/v2/Utilitaires-Git-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/fr/v2/Utilitaires-Git-D%c3%a9boguer-avec-Git">Déboguer avec Git</a> </li> <li> 7.11 <a href="/book/fr/v2/Utilitaires-Git-Sous-modules">Sous-modules</a> </li> <li> 7.12 <a href="/book/fr/v2/Utilitaires-Git-Empaquetage-bundling">Empaquetage (bundling)</a> </li> <li> 7.13 <a href="/book/fr/v2/Utilitaires-Git-Replace">Replace</a> </li> <li> 7.14 <a href="/book/fr/v2/Utilitaires-Git-Stockage-des-identifiants">Stockage des identifiants</a> </li> <li> 7.15 <a href="/book/fr/v2/Utilitaires-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/fr/v2/Personnalisation-de-Git-Configuration-de-Git">Personnalisation de Git</a></h2> <ol> <li> 8.1 <a href="/book/fr/v2/Personnalisation-de-Git-Configuration-de-Git">Configuration de Git</a> </li> <li> 8.2 <a href="/book/fr/v2/Personnalisation-de-Git-Attributs-Git">Attributs Git</a> </li> <li> 8.3 <a href="/book/fr/v2/Personnalisation-de-Git-Crochets-Git">Crochets Git</a> </li> <li> 8.4 <a href="/book/fr/v2/Personnalisation-de-Git-Exemple-de-politique-g%c3%a9r%c3%a9e-par-Git">Exemple de politique gérée par Git</a> </li> <li> 8.5 <a href="/book/fr/v2/Personnalisation-de-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Git-comme-client">Git et les autres systèmes</a></h2> <ol> <li> 9.1 <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Git-comme-client">Git comme client</a> </li> <li> 9.2 <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Migration-vers-Git">Migration vers Git</a> </li> <li> 9.3 <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/fr/v2/Les-tripes-de-Git-Plomberie-et-porcelaine">Les tripes de Git</a></h2> <ol> <li> 10.1 <a href="/book/fr/v2/Les-tripes-de-Git-Plomberie-et-porcelaine">Plomberie et porcelaine</a> </li> <li> 10.2 <a href="/book/fr/v2/Les-tripes-de-Git-Les-objets-de-Git">Les objets de Git</a> </li> <li> 10.3 <a href="/book/fr/v2/Les-tripes-de-Git-R%c3%a9f%c3%a9rences-Git">Références Git</a> </li> <li> 10.4 <a href="/book/fr/v2/Les-tripes-de-Git-Fichiers-group%c3%a9s">Fichiers groupés</a> </li> <li> 10.5 <a href="/book/fr/v2/Les-tripes-de-Git-La-refspec">La refspec</a> </li> <li> 10.6 <a href="/book/fr/v2/Les-tripes-de-Git-Les-protocoles-de-transfert">Les protocoles de transfert</a> </li> <li> 10.7 <a href="/book/fr/v2/Les-tripes-de-Git-Maintenance-et-r%c3%a9cup%c3%a9ration-de-donn%c3%a9es">Maintenance et récupération de données</a> </li> <li> 10.8 <a href="/book/fr/v2/Les-tripes-de-Git-Les-variables-d%e2%80%99environnement">Les variables d’environnement</a> </li> <li> 10.9 <a href="/book/fr/v2/Les-tripes-de-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Interfaces-graphiques">Annexe A: Git dans d’autres environnements</a></h2> <ol> <li> A1.1 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Interfaces-graphiques">Interfaces graphiques</a> </li> <li> A1.2 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Visual-Studio">Git dans Visual Studio</a> </li> <li> A1.3 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Visual-Studio-Code">Git dans Visual Studio Code</a> </li> <li> A1.4 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-IntelliJ-/-PyCharm-/-WebStorm-/-PhpStorm-/-RubyMine">Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine</a> </li> <li> A1.5 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Sublime-Text">Git dans Sublime Text</a> </li> <li> A1.6 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Bash">Git dans Bash</a> </li> <li> A1.7 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Zsh">Git dans Zsh</a> </li> <li> A1.8 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-PowerShell">Git dans PowerShell</a> </li> <li> A1.9 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Git-en-ligne-de-commande">Annexe B: Embarquer Git dans vos applications</a></h2> <ol> <li> A2.1 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Git-en-ligne-de-commande">Git en ligne de commande</a> </li> <li> A2.2 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-JGit">JGit</a> </li> <li> A2.4 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-go-git">go-git</a> </li> <li> A2.5 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/fr/v2/Commandes-Git-Installation-et-configuration">Commandes Git</a></h2> <ol> <li> A3.1 <a href="/book/fr/v2/Commandes-Git-Installation-et-configuration">Installation et configuration</a> </li> <li> A3.2 <a href="/book/fr/v2/Commandes-Git-Obtention-et-cr%c3%a9ation-des-projets">Obtention et création des projets</a> </li> <li> A3.3 <a href="/book/fr/v2/Commandes-Git-Capture-d%e2%80%99instantan%c3%a9-basique">Capture d’instantané basique</a> </li> <li> A3.4 <a href="/book/fr/v2/Commandes-Git-Cr%c3%a9ation-de-branches-et-fusion">Création de branches et fusion</a> </li> <li> A3.5 <a href="/book/fr/v2/Commandes-Git-Partage-et-mise-%c3%a0-jour-de-projets">Partage et mise à jour de projets</a> </li> <li> A3.6 <a href="/book/fr/v2/Commandes-Git-Inspection-et-comparaison">Inspection et comparaison</a> </li> <li> A3.7 <a href="/book/fr/v2/Commandes-Git-D%c3%a9bogage">Débogage</a> </li> <li> A3.8 <a href="/book/fr/v2/Commandes-Git-Patchs">Patchs</a> </li> <li> A3.9 <a href="/book/fr/v2/Commandes-Git-Courriel">Courriel</a> </li> <li> A3.10 <a href="/book/fr/v2/Commandes-Git-Syst%c3%a8mes-externes">Systèmes externes</a> </li> <li> A3.11 <a href="/book/fr/v2/Commandes-Git-Administration">Administration</a> </li> <li> A3.12 <a href="/book/fr/v2/Commandes-Git-Commandes-de-plomberie">Commandes de plomberie</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>7.7 Utilitaires Git - Reset démystifié</h1> <div> <h2 id="s_git_reset">Reset démystifié</h2> <div class="paragraph"> <p>Avant d’aborder des outils plus spécialisés, parlons un instant de <code>reset</code> et <code>checkout</code>. Ces commandes sont deux des plus grandes sources de confusion à leur premier contact. Elles permettent de faire tant de choses et il semble impossible de les comprendre et les employer correctement. Pour ceci, nous vous recommandons une simple métaphore.</p> </div> <div class="sect3"> <h3 id="_les_trois_arbres">Les trois arbres</h3> <div class="paragraph"> <p>Le moyen le plus simple de penser à <code>reset</code> et <code>checkout</code> consiste à représenter Git comme un gestionnaire de contenu de trois arborescences différentes. Par « arborescence », il faut comprendre « collection de fichiers », pas spécifiquement structure de données. Il existe quelques cas pour lesquels l’index ne se comporte pas exactement comme une arborescence, mais pour ce qui nous concerne, c’est plus simple de l’imaginer de cette manière pour le moment.</p> </div> <div class="paragraph"> <p>Git, comme système, gère et manipule trois arbres au cours de son opération normale :</p> </div> <table class="tableblock frame-all grid-all stretch"> <colgroup> <col style="width: 33.3333%;"> <col style="width: 66.6667%;"> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Arbre</th> <th class="tableblock halign-left valign-top">Rôle</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">HEAD</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">instantané de la dernière validation, prochain parent</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">Index</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">instantané proposé de la prochaine validation</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock">Répertoire de travail</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">bac à sable</p></td> </tr> </tbody> </table> <div class="sect4"> <h4 id="_head">HEAD</h4> <div class="paragraph"> <p>HEAD est un pointeur sur la référence de la branche actuelle, qui est à son tour un pointeur sur le dernier <em>commit</em> réalisé sur cette branche. Ceci signifie que HEAD sera le parent du prochain <em>commit</em> à créer. C’est généralement plus simple de penser HEAD comme l’instantané de <strong>votre dernière validation</strong>.</p> </div> <div class="paragraph"> <p>En fait, c’est assez simple de visualiser ce à quoi cet instantané ressemble. Voici un exemple de liste du répertoire et des sommes de contrôle SHA-1 pour chaque fichier de l’instantané HEAD :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p HEAD tree cfda3bf379e4f8dba8717dee55aab78aef7f4daf author Scott Chacon 1301511835 -0700 committer Scott Chacon 1301511835 -0700 initial commit $ git ls-tree -r HEAD 100644 blob a906cb2a4a904a152... README 100644 blob 8f94139338f9404f2... Rakefile 040000 tree 99f1a6d12cb4b6f19... lib</code></pre> </div> </div> <div class="paragraph"> <p>Les commandes <code>cat-file</code> et <code>ls-tree</code> sont des commandes de « plomberie » qui sont utilisées pour des activités de bas niveau et ne sont pas réellement utilisées pour le travail quotidien, mais elles nous permettent de voir ce qui se passe ici.</p> </div> </div> <div class="sect4"> <h4 id="s_the_index">L’index</h4> <div class="paragraph"> <p>L’index est votre <strong>prochain commit proposé</strong>. Nous avons aussi fait référence à ce concept comme la « zone de préparation » de Git du fait que c’est ce que Git examine lorsque vous lancez <code>git commit</code>.</p> </div> <div class="paragraph"> <p>Git remplit cet index avec une liste de tous les contenus des fichiers qui ont été extraits dans votre copie de travail et ce qu’ils contenaient quand ils ont été originellement extraits. Vous pouvez alors remplacer certains de ces fichiers par de nouvelles versions de ces mêmes fichiers, puis <code>git commit</code> convertit cela en arborescence du nouveau <em>commit</em>.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git ls-files -s 100644 a906cb2a4a904a152e80877d4088654daad0c859 0 README 100644 8f94139338f9404f26296befa88755fc2598c289 0 Rakefile 100644 47c6340d6459e05787f644c2447d2595f5d3a54b 0 lib/simplegit.rb</code></pre> </div> </div> <div class="paragraph"> <p>Encore une fois, nous utilisons ici <code>ls-files</code> qui est plus une commande de coulisses qui vous montre l’état actuel de votre index.</p> </div> <div class="paragraph"> <p>L’index n’est pas techniquement parlant une structure arborescente ‑ c’est en fait un manifeste aplati ‑ mais pour nos besoins, c’est suffisamment proche.</p> </div> </div> <div class="sect4"> <h4 id="_le_répertoire_de_travail">Le répertoire de travail</h4> <div class="paragraph"> <p>Finalement, vous avez votre répertoire de travail. Les deux autres arbres stockent leur contenu de manière efficace mais peu pratique dans le répertoire <code>.git</code>. Le répertoire de travail les dépaquette comme fichiers réels, ce qui rend tout de même plus facile leur modification. Il faut penser à la copie de travail comme un <strong>bac à sable</strong> où vous pouvez essayer vos modifications avant de les transférer dans votre index puis le valider dans votre historique.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ tree . ├── README ├── Rakefile └── lib └── simplegit.rb 1 directory, 3 files</code></pre> </div> </div> </div> </div> <div class="sect3"> <h3 id="_le_flux_de_travail">Le flux de travail</h3> <div class="paragraph"> <p>L’objet principal de Git est d’enregistrer des instantanés de votre projet comme des états successifs évolutifs en manipulant ces trois arbres.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-workflow.png" alt="reset workflow"> </div> </div> <div class="paragraph"> <p>Visualisons ce processus : supposons que vous allez dans un nouveau répertoire contenant un fichier unique. Nous appellerons ceci <strong>v1</strong> du fichier et nous le marquerons en bleu. Maintenant, nous allons lancer <code>git init</code>, ce qui va créer le dépôt Git avec une référence HEAD qui pointe sur une branche à naître (<code>master</code> n’existe pas encore).</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-ex1.png" alt="reset ex1"> </div> </div> <div class="paragraph"> <p>À ce point, seul le répertoire de travail contient quelque chose.</p> </div> <div class="paragraph"> <p>Maintenant, nous souhaitons valider ce fichier, donc nous utilisons <code>git add</code> qui prend le contenu du répertoire de travail et le copie dans l’index.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-ex2.png" alt="reset ex2"> </div> </div> <div class="paragraph"> <p>Ensuite, nous lançons <code>git commit</code>, ce qui prend le contenu de l’index et le sauve comme un instantané permanent, crée un objet commit qui pointe sur cet instantané et met à jour <code>master</code> pour pointer sur ce <em>commit</em>.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-ex3.png" alt="reset ex3"> </div> </div> <div class="paragraph"> <p>Si nous lançons <code>git status</code>, nous ne verrons aucune modification parce que les trois arborescences sont identiques.</p> </div> <div class="paragraph"> <p>Maintenant, nous voulons faire des modifications sur ce fichier et le valider. Nous suivons le même processus ; en premier nous changeons le fichier dans notre copie de travail. Appelons cette version du fichier <strong>v2</strong> et marquons-le en rouge.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-ex4.png" alt="reset ex4"> </div> </div> <div class="paragraph"> <p>Si nous lançons <code>git status</code> maintenant, nous verrons le fichier en rouge comme « Modifications qui ne seront pas validées » car cette entrée est différente entre l’index et le répertoire de travail. Ensuite, nous lançons <code>git add</code> dessus pour le monter dans notre index.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-ex5.png" alt="reset ex5"> </div> </div> <div class="paragraph"> <p>À ce point, si nous lançons <code>git status</code>, nous verrons le fichier en vert sous « Modifications qui seront validées » parce que l’index et HEAD diffèrent, c’est-à-dire que notre prochain <em>commit</em> proposé est différent de notre dernier <em>commit</em>. Finalement, nous lançons <code>git commit</code> pour finaliser la validation.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-ex6.png" alt="reset ex6"> </div> </div> <div class="paragraph"> <p>Maintenant, <code>git status</code> n’indique plus rien, car les trois arborescences sont à nouveau identiques.</p> </div> <div class="paragraph"> <p>Les basculements de branches ou les clonages déroulent le même processus. Quand vous extrayez une branche, cela change <strong>HEAD</strong> pour pointer sur la nouvelle référence de branche, alimente votre <strong>index</strong> avec l’instantané de ce <em>commit</em>, puis copie le contenu de l’index dans votre <strong>répertoire de travail</strong>.</p> </div> </div> <div class="sect3"> <h3 id="_le_rôle_de_reset">Le rôle de reset</h3> <div class="paragraph"> <p>La commande <code>reset</code> est plus compréhensible dans ce contexte.</p> </div> <div class="paragraph"> <p>Pour l’objectif des exemples à suivre, supposons que nous avons modifié <code>file.txt</code> à nouveau et validé une troisième fois. Donc maintenant, notre historique ressemble à ceci :</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-start.png" alt="reset start"> </div> </div> <div class="paragraph"> <p>Détaillons maintenant ce que <code>reset</code> fait lorsque vous l’appelez. Il manipule directement les trois arborescences d’une manière simple et prédictible. Il réalise jusqu’à trois opérations basiques.</p> </div> <div class="sect4"> <h4 id="_étape_1_déplacer_head">Étape 1: déplacer HEAD</h4> <div class="paragraph"> <p>La première chose que <code>reset</code> va faire consiste à déplacer ce qui est pointé par HEAD. Ce n’est pas la même chose que changer HEAD lui-même (ce que fait <code>checkout</code>). <code>reset</code> déplace la branche que HEAD pointe. Ceci signifie que si HEAD est pointé sur la branche <code>master</code> (par exemple, si vous êtes sur la branche <code>master</code>), lancer <code>git reset 9e5e6a4</code> va commencer par faire pointer <code>master</code> sur <code>9e5e6a4</code>.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-soft.png" alt="reset soft"> </div> </div> <div class="paragraph"> <p>Quelle que soit la forme du <code>reset</code> que vous invoquez pour un <em>commit</em>, ce sera toujours la première chose qu’il tentera de faire. Avec <code>reset --soft</code>, il n’ira pas plus loin.</p> </div> <div class="paragraph"> <p>Maintenant, arrêtez-vous une seconde et regardez le diagramme ci-dessus pour comprendre ce qu’il s’est passé : en essence, il a défait ce que la dernière commande <code>git commit</code> a créé. Quand vous lancez <code>git commit</code>, Git crée un nouvel objet <em>commit</em> et déplace la branche pointée par HEAD dessus. Quand vous faites un <code>reset</code> sur <code>HEAD~</code> (le parent de <code>HEAD</code>), vous replacez la branche où elle était, sans changer ni l’index ni la copie de travail. Vous pourriez maintenant mettre à jour l’index et relancer <code>git commit</code> pour accomplir ce que <code>git commit --amend</code> aurait fait (voir <a href="/book/fr/v2/ch00/s_git_amend">Modifier la dernière validation</a>).</p> </div> </div> <div class="sect4"> <h4 id="_étape_2_mise_à_jour_de_lindex_mixed">Étape 2 : Mise à jour de l’index (--mixed)</h4> <div class="paragraph"> <p>Notez que si vous lancez <code>git status</code> maintenant, vous verrez en vert la différence entre l’index et le nouveau HEAD.</p> </div> <div class="paragraph"> <p>La chose suivante que <code>reset</code> réalise est de mettre à jour l’index avec le contenu de l’instantané pointé par HEAD.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-mixed.png" alt="reset mixed"> </div> </div> <div class="paragraph"> <p>Si vous spécifiez l’option <code>--mixed</code>, <code>reset</code> s’arrêtera à cette étape. C’est aussi le comportement par défaut, donc si vous ne spécifiez aucune option (juste <code>git reset HEAD~</code> dans notre cas), c’est ici que la commande s’arrêtera.</p> </div> <div class="paragraph"> <p>Maintenant arrêtez-vous encore une seconde et regardez le diagramme ci-dessus pour comprendre ce qui s’est passé : il a toujours défait la dernière validation, mais il a aussi tout <em>désindéxé</em>. Vous êtes revenu à l’état précédant vos commandes <code>git add</code> et <code>git commit</code>.</p> </div> </div> <div class="sect4"> <h4 id="_étape_3_mise_à_jour_de_la_copie_de_travail_hard">Étape 3: Mise à jour de la copie de travail (--hard)</h4> <div class="paragraph"> <p>La troisième chose que <code>reset</code> va faire est de faire correspondre la copie de travail avec l’index. Si vous utilisez l’option <code>--hard</code>, il continuera avec cette étape.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-hard.png" alt="reset hard"> </div> </div> <div class="paragraph"> <p>Donc réfléchissons à ce qui vient d’arriver. Vous avez défait la dernière validation, les commandes <code>git add</code> et <code>git commit</code> <strong>ainsi que</strong> tout le travail que vous avez réalisé dans le répertoire de travail.</p> </div> <div class="paragraph"> <p>Il est important de noter que cette option (<code>--hard</code>) est le seul moyen de rendre la commande <code>reset</code> dangereuse et est un des très rares cas où Git va réellement détruire de la donnée. Toute autre invocation de <code>reset</code> peut être défaite, mais l’option <code>--hard</code> ne le permet pas, car elle force l’écrasement des fichiers dans le répertoire de travail. Dans ce cas particulier, nous avons toujours la version <strong>v3</strong> du fichier dans un <em>commit</em> dans notre base de donnée Git, et nous pourrions la récupérer en parcourant notre <code>reflog</code>, mais si nous ne l’avions pas validé, Git aurait tout de même écrasé les fichiers et rien n’aurait pu être récupéré.</p> </div> </div> <div class="sect4"> <h4 id="_récapitulatif">Récapitulatif</h4> <div class="paragraph"> <p>La commande <code>reset</code> remplace ces trois arbres dans un ordre spécifique, s’arrêtant lorsque vous lui indiquez :</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>Déplace la branche pointée par HEAD <em>(s’arrête ici si <code>--soft</code>)</em></p> </li> <li> <p>Fait ressembler l’index à HEAD <em>(s’arrête ici à moins que <code>--hard</code>)</em></p> </li> <li> <p>Fait ressembler le répertoire de travail à l’index.</p> </li> </ol> </div> </div> </div> <div class="sect3"> <h3 id="_reset_avec_un_chemin">Reset avec un chemin</h3> <div class="paragraph"> <p>Tout cela couvre le comportement de <code>reset</code> dans sa forme de base, mais vous pouvez aussi lui fournir un chemin sur lequel agir. Si vous spécifiez un chemin, <code>reset</code> sautera la première étape et limitera la suite de ses actions à un fichier spécifique ou à un ensemble de fichiers. Cela fait sens ; en fait, HEAD n’est rien de plus qu’un pointeur et vous ne pouvez pas pointer sur une partie d’un <em>commit</em> et une partie d’un autre. Mais l’index et le répertoire de travail <em>peuvent</em> être partiellement mis à jour, donc <code>reset</code> continue avec les étapes 2 et 3.</p> </div> <div class="paragraph"> <p>Donc, supposons que vous lancez <code>git reset file.txt</code>. Cette forme (puisque vous n’avez pas spécifié un SHA-1 de commit ni de branche, et que vous n’avez pas non plus spécifié <code>--soft</code> ou <code>--hard</code>) est un raccourci pour <code>git reset --mixed HEAD file.txt</code>, qui va :</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>déplacer la branche pointée par HEAD <em>(sauté)</em></p> </li> <li> <p>faire ressembler l’index à HEAD <em>(s’arrête ici)</em></p> </li> </ol> </div> <div class="paragraph"> <p>Donc, en substance, il ne fait que copier <code>file.txt</code> de HEAD vers index.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-path1.png" alt="reset path1"> </div> </div> <div class="paragraph"> <p>Ceci a l’effet pratique de <em>désindexer</em> le fichier. Si on regarde cette commande dans le diagramme et qu’on pense à ce que <code>git add</code> fait, ce sont des opposés exacts.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-path2.png" alt="reset path2"> </div> </div> <div class="paragraph"> <p>C’est pourquoi le résultat de la commande <code>git status</code> suggère que vous lanciez cette commande pour désindexer le fichier (voir <a href="/book/fr/v2/ch00/s_unstaging">Désindexer un fichier déjà indexé</a> pour plus de détail).</p> </div> <div class="paragraph"> <p>Nous pourrions tout aussi bien ne pas laisser Git considérer que nous voulions dire « tirer les données depuis HEAD » en spécifiant un <em>commit</em> spécifique d’où tirer ce fichier. Nous lancerions juste quelque chose comme <code>git reset eb43bf file.txt</code>.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-path3.png" alt="reset path3"> </div> </div> <div class="paragraph"> <p>Ceci fait effectivement la même chose que si nous remettions le contenu du fichier à la <strong>v1</strong> dans le répertoire de travail, lancions <code>git add</code> dessus, puis le ramenions à nouveau à la <strong>v3</strong> (sans forcément passer par toutes ces étapes). Si nous lançons <code>git commit</code> maintenant, il enregistrera la modification qui remet le fichier à la version <strong>v1</strong>, même si nous ne l’avons jamais eu à nouveau dans notre répertoire de travail.</p> </div> <div class="paragraph"> <p>Il est intéressant de noter que comme <code>git add</code>, la commande <code>reset</code> accepte une option <code>--patch</code> pour désindexer le contenu section par section. Vous pouvez donc sélectivement désindexer ou ramener du contenu.</p> </div> </div> <div class="sect3"> <h3 id="_écraser_les_commits">Écraser les <em>commits</em> </h3> <div class="paragraph"> <p>Voyons comment faire quelque chose d’intéressant avec ce tout nouveau pouvoir - écrasons des <em>commits</em>.</p> </div> <div class="paragraph"> <p>Supposons que vous avez une série de <em>commits</em> contenant des messages tels que « oups », « en chantier » ou « ajout d’un fichier manquant ». Vous pouvez utiliser <code>reset</code> pour les écraser tous rapidement et facilement en une seule validation qui vous donne l’air vraiment intelligent (<a href="/book/fr/v2/ch00/s_squashing">Écraser un <em>commit</em></a> explique un autre moyen de faire pareil, mais dans cet exemple, c’est plus simple de faire un <code>reset</code>).</p> </div> <div class="paragraph"> <p>Disons que vous avez un projet où le premier <em>commit</em> contient un fichier, le second <em>commit</em> a ajouté un nouveau fichier et a modifié le premier, et le troisième a remodifié le premier fichier. Le second <em>commit</em> était encore en chantier et vous souhaitez le faire disparaître.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-squash-r1.png" alt="reset squash r1"> </div> </div> <div class="paragraph"> <p>Vous pouvez lancer <code>git reset --soft HEAD~2</code> pour ramener la branche de HEAD sur l’ancien <em>commit</em> (le premier <em>commit</em> que vous souhaitez garder) :</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-squash-r2.png" alt="reset squash r2"> </div> </div> <div class="paragraph"> <p>Ensuite, relancez simplement <code>git commit</code> :</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-squash-r3.png" alt="reset squash r3"> </div> </div> <div class="paragraph"> <p>Maintenant vous pouvez voir que votre historique accessible, l’historique que vous pousseriez, ressemble à présent à un premier <em>commit</em> avec le fichier <code>file-a.txt</code> v1, puis un second qui modifie à la fois <code>file-a.txt</code> à la version 3 et ajoute <code>file-b.txt</code>. Le <em>commit</em> avec la version v2 du fichier ne fait plus partie de l’historique.</p> </div> </div> <div class="sect3"> <h3 id="_et_checkout">Et checkout</h3> <div class="paragraph"> <p>Finalement, vous pourriez vous demander quelle différence il y a entre <code>checkout</code> et <code>reset</code>. Comme <code>reset</code>, <code>checkout</code> manipule les trois arborescences et se comporte généralement différemment selon que vous indiquez un chemin vers un fichier ou non.</p> </div> <div class="sect4"> <h4 id="_sans_chemin">Sans chemin</h4> <div class="paragraph"> <p>Lancer <code>git checkout [branche]</code> est assez similaire à lancer <code>git reset --hard [branche]</code> en ce qu’il met à jour les trois arborescences pour qu’elles ressemblent à <code>[branche]</code>, mais avec deux différences majeures.</p> </div> <div class="paragraph"> <p>Premièrement, à la différence de <code>reset --hard</code>, <code>checkout</code> préserve le répertoire de travail ; il s’assure de ne pas casser des fichiers qui ont changé. En fait, il est même un peu plus intelligent que ça – il essaie de faire une fusion simple dans le répertoire de travail, de façon que tous les fichiers <strong>non modifiés</strong> soient mis à jour. <code>reset --hard</code>, par contre, va simplement tout remplacer unilatéralement sans rien vérifier.</p> </div> <div class="paragraph"> <p>La seconde différence majeure concerne sa manière de mettre à jour HEAD. Là où <code>reset</code> va déplacer la branche pointée par HEAD, <code>checkout</code> va déplacer HEAD lui-même pour qu’il pointe sur une autre branche.</p> </div> <div class="paragraph"> <p>Par exemple, supposons que nous avons des branches <code>master</code> et <code>develop</code> qui pointent sur des <em>commits</em> différents et que nous sommes actuellement sur <code>develop</code> (donc HEAD pointe dessus). Si nous lançons <code>git reset master</code>, <code>develop</code> lui-même pointera sur le même <em>commit</em> que <code>master</code>. Si nous lançons plutôt <code>git checkout master</code>, <code>develop</code> ne va pas bouger, seul HEAD va changer. HEAD pointera alors sur <code>master</code>.</p> </div> <div class="paragraph"> <p>Donc, dans les deux cas, nous déplaçons HEAD pour pointer sur le commit A, mais la manière diffère beaucoup. <code>reset</code> va déplacer la branche pointée par HEAD, alors que <code>checkout</code> va déplacer HEAD lui-même.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/fr/v2/images/reset-checkout.png" alt="reset checkout"> </div> </div> </div> <div class="sect4"> <h4 id="_avec_des_chemins">Avec des chemins</h4> <div class="paragraph"> <p>L’autre façon de lancer <code>checkout</code> est avec un chemin de fichier, ce qui, comme <code>reset</code>, ne déplace pas HEAD. Cela correspond juste à <code>git reset [branche] fichier</code> car cela met à jour l’index avec ce fichier à ce <em>commit</em>, mais en remplaçant le fichier dans le répertoire de travail. Ce serait exactement comme <code>git reset --hard [branche] fichier</code> (si <code>reset</code> le permettait) – cela ne préserve pas le répertoire de travail et ne déplace pas non plus HEAD.</p> </div> <div class="paragraph"> <p>De même que <code>git reset</code> et <code>git add</code>, <code>checkout</code> accepte une option <code>--patch</code> permettant de réinitialiser sélectivement le contenu d’un fichier section par section.</p> </div> </div> </div> <div class="sect3"> <h3 id="_résumé_9">Résumé</h3> <div class="paragraph"> <p>J’espère qu’à présent vous comprenez mieux et vous sentez plus à l’aise avec la commande <code>reset</code>, même si vous pouvez vous sentir encore un peu confus sur ce qui la différencie exactement de <code>checkout</code> et avoir du mal à vous souvenir de toutes les règles de ses différentes invocations.</p> </div> <div class="paragraph"> <p>Voici un aide-mémoire sur ce que chaque commande affecte dans chaque arborescence. La colonne « HEAD » contient « RÉF » si cette commande déplace la référence (branche) pointée par HEAD, et « HEAD » si elle déplace HEAD lui-même. Faites particulièrement attention à la colonne « préserve RT ? » (préserve le répertoire de travail) – si elle indique <strong>NON</strong>, réfléchissez à deux fois avant de lancer la commande.</p> </div> <table class="tableblock frame-all grid-all stretch"> <colgroup> <col style="width: 42.8571%;"> <col style="width: 14.2857%;"> <col style="width: 14.2857%;"> <col style="width: 14.2857%;"> <col style="width: 14.2858%;"> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top"></th> <th class="tableblock halign-left valign-top">HEAD</th> <th class="tableblock halign-left valign-top">Index</th> <th class="tableblock halign-left valign-top">Rép. Travail</th> <th class="tableblock halign-left valign-top">préserve RT ?</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Niveau commit</strong></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>reset --soft [commit]</code></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">RÉF</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NON</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NON</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>reset [commit]</code></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">RÉF</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NON</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>reset --hard [commit]</code></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">RÉF</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>NON</strong></p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>checkout [commit]</code></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">HEAD</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Niveau Fichier</strong></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>reset (commit) [fichier]</code></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NON</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NON</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>checkout (commit) [fichier]</code></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">NON</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">OUI</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>NON</strong></p></td> </tr> </tbody> </table> </div> <div id="nav"><a href="/book/fr/v2/Utilitaires-Git-Réécrire-l’historique">prev</a> | <a href="/book/fr/v2/Utilitaires-Git-Fusion-avancée">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>