[{"data":1,"prerenderedAt":609},["ShallowReactive",2],{"page-\u002Fgit\u002Fannuler":3,"pieces-git":566,"autour-\u002Fgit\u002Fannuler":591,"prerequis-\u002Fgit\u002Fannuler":596,"plan-git":598},{"id":4,"title":5,"body":6,"description":537,"extension":538,"ligne":146,"meta":539,"motsCles":540,"navigation":545,"niveau":546,"path":547,"prerequis":548,"ressources":550,"seo":559,"sources":560,"stem":564,"__hash__":565},"docs\u002Fgit\u002F05.annuler.md","Annuler une erreur",{"type":7,"value":8,"toc":523},"minimark",[9,14,39,43,47,115,118,122,129,154,157,165,169,176,194,197,210,214,217,249,252,256,262,277,287,291,295,300,362,365,385,391,403,408,418,443,446,450,461,476,480,519],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,26,36],"ul",{},[18,19,20,21,25],"li",{},"Annuler une modification ou une indexation avec ",[22,23,24],"code",{},"git restore",".",[18,27,28,29,32,33,25],{},"Défaire un commit proprement avec ",[22,30,31],{},"git revert",", ou reculer avec ",[22,34,35],{},"git reset",[18,37,38],{},"La règle d'or : ne pas réécrire un historique déjà poussé.",[10,40,42],{"id":41},"choisir-le-bon-outil","Choisir le bon outil",[44,45,46],"p",{},"La bonne commande dépend de l'endroit où se trouve l'erreur :",[48,49,50,63],"table",{},[51,52,53],"thead",{},[54,55,56,60],"tr",{},[57,58,59],"th",{},"Situation",[57,61,62],{},"Commande",[64,65,66,77,87,97,106],"tbody",{},[54,67,68,72],{},[69,70,71],"td",{},"Fichier modifié, pas encore indexé",[69,73,74],{},[22,75,76],{},"git restore fichier",[54,78,79,82],{},[69,80,81],{},"Fichier indexé par erreur",[69,83,84],{},[22,85,86],{},"git restore --staged fichier",[54,88,89,92],{},[69,90,91],{},"Dernier commit à corriger, pas encore poussé",[69,93,94],{},[22,95,96],{},"git commit --amend",[54,98,99,102],{},[69,100,101],{},"Commit déjà poussé à défaire",[69,103,104],{},[22,105,31],{},[54,107,108,111],{},[69,109,110],{},"Commits locaux à abandonner",[69,112,113],{},[22,114,35],{},[44,116,117],{},"La BD xkcd 1597 se moque de ceux qui, au moindre problème, suppriment le dossier et re-clonent le projet. Ce chapitre sert à ne plus en arriver là.",[10,119,121],{"id":120},"annuler-une-modification-git-restore","Annuler une modification : git restore",[44,123,124,125,128],{},"Tu as cassé ",[22,126,127],{},"style.css"," en essayant une nouvelle mise en page, et tu veux revenir à la dernière version enregistrée :",[130,131,136],"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-bash shiki shiki-themes github-light-default github-dark-default github-dark-default","git restore style.css\n","bash","",[22,137,138],{"__ignoreMap":135},[139,140,143,147,151],"span",{"class":141,"line":142},"line",1,[139,144,146],{"class":145},"sIXEE","git",[139,148,150],{"class":149},"shWOn"," restore",[139,152,153],{"class":149}," style.css\n",[44,155,156],{},"Le fichier reprend son contenu de l'index, c'est-à-dire celui du dernier commit si tu ne l'avais pas indexé.",[158,159,160],"warning",{},[44,161,162,164],{},[22,163,24],{}," sur un fichier efface tes modifications non enregistrées. Git ne les a jamais vues : il ne pourra pas te les rendre.",[10,166,168],{"id":167},"désindexer-un-fichier-git-restore-staged","Désindexer un fichier : git restore --staged",[44,170,171,172,175],{},"Tu as fait ",[22,173,174],{},"git add ."," et un fichier de test est parti dans l'index :",[130,177,179],{"className":132,"code":178,"language":134,"meta":135,"style":135},"git restore --staged test.html\n",[22,180,181],{"__ignoreMap":135},[139,182,183,185,187,191],{"class":141,"line":142},[139,184,146],{"class":145},[139,186,150],{"class":149},[139,188,190],{"class":189},"s5iOY"," --staged",[139,192,193],{"class":149}," test.html\n",[44,195,196],{},"Le fichier sort de l'index mais garde ses modifications dans ton dossier. Rien n'est perdu.",[44,198,199,200,203,204,206,207,209],{},"Tu verras ",[22,201,202],{},"git checkout"," et ",[22,205,35],{}," utilisés pour ces deux cas dans d'anciens tutoriels. ",[22,208,24],{}," est la commande recommandée aujourd'hui.",[10,211,213],{"id":212},"corriger-le-dernier-commit-git-commit-amend","Corriger le dernier commit : git commit --amend",[44,215,216],{},"Une faute dans le message, ou un fichier oublié ? Indexe ce qui manque, puis :",[130,218,220],{"className":132,"code":219,"language":134,"meta":135,"style":135},"git add contact.html\ngit commit --amend -m \"Ajoute la page contact\"\n",[22,221,222,232],{"__ignoreMap":135},[139,223,224,226,229],{"class":141,"line":142},[139,225,146],{"class":145},[139,227,228],{"class":149}," add",[139,230,231],{"class":149}," contact.html\n",[139,233,235,237,240,243,246],{"class":141,"line":234},2,[139,236,146],{"class":145},[139,238,239],{"class":149}," commit",[139,241,242],{"class":189}," --amend",[139,244,245],{"class":189}," -m",[139,247,248],{"class":149}," \"Ajoute la page contact\"\n",[44,250,251],{},"Git remplace le dernier commit par un nouveau, avec un nouvel identifiant. C'est une réécriture de l'historique : ne le fais que si ce commit n'a pas encore été poussé.",[10,253,255],{"id":254},"défaire-un-commit-poussé-git-revert","Défaire un commit poussé : git revert",[44,257,258,259,261],{},"Le commit qui a ajouté le nouveau menu casse le site en production, et il est déjà sur GitHub. Tes collègues l'ont récupéré. Tu ne peux pas le faire disparaître sans les gêner. ",[22,260,31],{}," crée un nouveau commit qui applique l'inverse :",[130,263,265],{"className":132,"code":264,"language":134,"meta":135,"style":135},"git revert HEAD\n",[22,266,267],{"__ignoreMap":135},[139,268,269,271,274],{"class":141,"line":142},[139,270,146],{"class":145},[139,272,273],{"class":149}," revert",[139,275,276],{"class":149}," HEAD\n",[44,278,279,282,283,286],{},[22,280,281],{},"HEAD"," désigne le commit actuel. Tu peux aussi donner l'identifiant d'un commit plus ancien, lu dans ",[22,284,285],{},"git log --oneline",". L'historique est conservé : on voit l'erreur, puis sa correction.",[288,289],"git-graphe",{"scenario":290},"revert",[10,292,294],{"id":293},"reculer-git-reset","Reculer : git reset",[44,296,297,299],{},[22,298,35],{}," déplace la branche courante vers un commit plus ancien. Les commits suivants ne font plus partie de la branche. Son option décide de ce qu'il advient de tes fichiers :",[48,301,302,318],{},[51,303,304],{},[54,305,306,309,312,315],{},[57,307,308],{},"Option",[57,310,311],{},"Déplace HEAD",[57,313,314],{},"Remet l'index à ce commit",[57,316,317],{},"Remet tes fichiers à ce commit",[64,319,320,335,349],{},[54,321,322,327,330,333],{},[69,323,324],{},[22,325,326],{},"--soft",[69,328,329],{},"oui",[69,331,332],{},"non",[69,334,332],{},[54,336,337,343,345,347],{},[69,338,339,342],{},[22,340,341],{},"--mixed"," (par défaut)",[69,344,329],{},[69,346,329],{},[69,348,332],{},[54,350,351,356,358,360],{},[69,352,353],{},[22,354,355],{},"--hard",[69,357,329],{},[69,359,329],{},[69,361,329],{},[44,363,364],{},"Concrètement, pour reculer d'un commit :",[15,366,367,373,379],{},[18,368,369,372],{},[22,370,371],{},"git reset --soft HEAD~1"," : les changements du commit annulé restent indexés, prêts à être validés autrement.",[18,374,375,378],{},[22,376,377],{},"git reset HEAD~1"," : ils restent dans tes fichiers, mais ne sont plus indexés.",[18,380,381,384],{},[22,382,383],{},"git reset --hard HEAD~1"," : ils disparaissent aussi de tes fichiers.",[44,386,387,390],{},[22,388,389],{},"HEAD~1"," signifie « le commit juste avant HEAD ».",[158,392,393],{},[44,394,395,398,399,402],{},[22,396,397],{},"git reset --hard"," écrase aussi les modifications non commitées de ton dossier. Celles-là sont perdues pour de bon. Lance ",[22,400,401],{},"git status"," avant.",[404,405,407],"h3",{"id":406},"rattraper-un-reset-avec-git-reflog","Rattraper un reset avec git reflog",[44,409,410,411,413,414,417],{},"Un commit retiré par ",[22,412,35],{}," n'est pas effacé tout de suite. ",[22,415,416],{},"git reflog"," liste les positions récentes de HEAD, avec leurs identifiants. Tu retrouves celui du commit perdu, et tu reviens dessus :",[130,419,421],{"className":132,"code":420,"language":134,"meta":135,"style":135},"git reflog\ngit reset --hard a1b2c3d\n",[22,422,423,430],{"__ignoreMap":135},[139,424,425,427],{"class":141,"line":142},[139,426,146],{"class":145},[139,428,429],{"class":149}," reflog\n",[139,431,432,434,437,440],{"class":141,"line":234},[139,433,146],{"class":145},[139,435,436],{"class":149}," reset",[139,438,439],{"class":189}," --hard",[139,441,442],{"class":149}," a1b2c3d\n",[288,444],{"scenario":445},"reset",[10,447,449],{"id":448},"la-règle-ne-pas-réécrire-un-historique-poussé","La règle : ne pas réécrire un historique poussé",[44,451,452,203,454,456,457,460],{},[22,453,96],{},[22,455,35],{}," réécrivent l'historique. Sur des commits qui ne sont que chez toi, aucun problème. Sur des commits déjà poussés, tes collègues ont une autre version de l'histoire. Pour publier la tienne, il faudrait forcer le ",[22,458,459],{},"git push",", et leur travail pourrait être écrasé.",[462,463,464],"tip",{},[44,465,466,467,469,470,472,473,475],{},"Un commit est déjà poussé ? Utilise ",[22,468,31],{},". Il n'est que sur ta machine ? ",[22,471,35],{}," ou ",[22,474,96],{}," conviennent.",[10,477,479],{"id":478},"à-retenir","À retenir",[15,481,482,490,495,500,514],{},[18,483,484,486,487,489],{},[22,485,76],{}," annule une modification, ",[22,488,86],{}," la retire de l'index.",[18,491,492,494],{},[22,493,96],{}," corrige le dernier commit, s'il n'est pas encore poussé.",[18,496,497,499],{},[22,498,31],{}," ajoute un commit inverse : c'est la bonne méthode pour un commit déjà partagé.",[18,501,502,504,505,507,508,510,511,513],{},[22,503,35],{}," recule la branche : ",[22,506,326],{}," garde l'index, ",[22,509,341],{}," garde les fichiers, ",[22,512,355],{}," efface aussi les modifications de tes fichiers.",[18,515,516,518],{},[22,517,416],{}," retrouve un commit perdu après un reset.",[520,521,522],"style",{},"html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}",{"title":135,"searchDepth":234,"depth":524,"links":525},3,[526,527,528,529,530,531,532,535,536],{"id":12,"depth":234,"text":13},{"id":41,"depth":234,"text":42},{"id":120,"depth":234,"text":121},{"id":167,"depth":234,"text":168},{"id":212,"depth":234,"text":213},{"id":254,"depth":234,"text":255},{"id":293,"depth":234,"text":294,"children":533},[534],{"id":406,"depth":524,"text":407},{"id":448,"depth":234,"text":449},{"id":478,"depth":234,"text":479},"Annuler une modification, désindexer un fichier, corriger le dernier commit, revenir en arrière avec revert ou reset, sans réécrire un historique déjà poussé.","md",{},[541,24,31,35,96,416,542,543,544],"annuler","soft","mixed","hard",true,"intermediaire","\u002Fgit\u002Fannuler",[549],"\u002Fgit\u002Ftravailler-a-plusieurs",[551,555],{"nom":552,"url":553,"type":554},"Pro Git en français (2e édition, 2014), chapitres « Annuler des actions » et « Reset démystifié »","https:\u002F\u002Fgit-scm.com\u002Fbook\u002Ffr\u002Fv2","doc",{"nom":556,"url":557,"type":558},"OpenClassrooms, Gérez du code avec Git et GitHub","https:\u002F\u002Fopenclassrooms.com\u002Ffr\u002Fcourses\u002F7162856-gerez-du-code-avec-git-et-github","cours",{"title":5,"description":537},[561],{"nom":562,"url":563},"Documentation de référence Git (en anglais)","https:\u002F\u002Fgit-scm.com\u002Fdocs","git\u002F05.annuler","QERwIl5ikSG9v1lCJ70HX7od6_HW81YQ_o8Rl-rZQ-g",[567,571,575,579,582,583,587],{"path":568,"title":569,"stem":570},"\u002Fgit\u002Fpourquoi-git","Pourquoi Git","git\u002F01.pourquoi-git",{"path":572,"title":573,"stem":574},"\u002Fgit\u002Fpremiers-commits","Premiers commits","git\u002F02.premiers-commits",{"path":576,"title":577,"stem":578},"\u002Fgit\u002Fbranches","Les branches","git\u002F03.branches",{"path":549,"title":580,"stem":581},"Travailler à plusieurs","git\u002F04.travailler-a-plusieurs",{"path":547,"title":5,"stem":564},{"path":584,"title":585,"stem":586},"\u002Fgit\u002Frebase","Le rebase","git\u002F06.rebase",{"path":588,"title":589,"stem":590},"\u002Fgit","Git","git\u002Findex",[592,594],{"title":580,"path":549,"stem":581,"description":593,"children":-1},"Relier ton dépôt à un dépôt distant, cloner, envoyer et récupérer des commits avec push, fetch et pull, et proposer tes changements par pull request.",{"title":585,"path":584,"stem":586,"description":595,"children":-1},"Rejouer une branche par-dessus une autre avec git rebase, comparer avec git merge, et savoir quand ne jamais l'utiliser.",[597],{"path":549,"title":580,"ligne":146},[599,601,602,603,604,605,607],{"path":568,"title":569,"niveau":600,"stem":570},"debutant",{"path":572,"title":573,"niveau":600,"stem":574},{"path":576,"title":577,"niveau":600,"stem":578},{"path":549,"title":580,"niveau":546,"stem":581},{"path":547,"title":5,"niveau":546,"stem":564},{"path":584,"title":585,"niveau":606,"stem":586},"avance",{"path":588,"title":589,"niveau":608,"stem":590},"memo",1794583451476]