Défaire un commit
Tu es allé trop vite en besogne et tu as commité avant de t’apercevoir que tu n’avais pas terminé ton travail ? Ou pire, tu as créé un commit pour “sauvegarder” un travail non fini. Bah oui, on ne sait jamais, des fois que ton disque soit pris de combustion spontanée 🔥 ! Peu importe la raison qui t’amène ici, laisse-moi te montrer comment reprendre ton travail et retirer ce commit non désiré ou mal venu.
Le dernier commit de ma branche courante
Le contexte est important : on parle bien de reprendre le commit en fin de branche. Il est peu probable qu’on ait envie de défaire et continuer le travail d’un commit plus ancien. Si c’était le cas, ça serait certainement dans l’optique d’un des autres scenarios de notre série pour apprendre à annuler, défaire et corriger.
Git moonwalk 👟
On veut faire un petit pas en arrière, comme si on n’avait pas fait de git commit…
.
Ce petit pas en arrière, on va le faire avec la commande reset
et une option au choix entre --mixed
et --soft
. Pour t’épargner un cours sur la commande reset
, on va choisir la première option. Si tu veux creuser plus, tu peux lire cet autre article.
Pour nos exemples, nous partirons de l’historique suivant, où “e” est le dernier commit, celui qu’on souhaite défaire :
%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': { 'commitLabelFontSize': '16px' }, 'gitGraph': {'showBranches': false} } }%% gitGraph commit id: "a" commit id: "b" commit id: "c" commit id: "d" commit id: "(HEAD) e"
Que va faire cette commande ?
Elle va déplacer le pointeur qui désigne notre position actuelle dans l’historique (le HEAD) et l’amener où on veut, c’est-à-dire un cran en arrière, avant notre commit (syntaxe de révision HEAD~1
ou en utilisant l’identifiant du commit “d”).
git reset --mixed HEAD~1
# Le mode "mixed" étant celui par défaut, on pourrait faire
# git reset HEAD~1
On obtient :
%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': { 'commitLabelFontSize': '16px' }, 'gitGraph': {'showBranches': false} } }%% gitGraph commit id: "a" commit id: "b" commit id: "c" commit id: "(HEAD) d"
L’option quant à elle dit à la commande de ne toucher qu’à ce pointeur, sans toucher au stage et au working directory. Dit autrement, ça ne touche pas à nos fichiers locaux, ça change uniquement le schéma d’historique Git.
On voit alors réapparaître le travail de notre commit comme “en cours de modification”, disponible pour ajout au stage et prêt pour être ajouté dans un nouveau commit. On peut continuer notre travail jusqu’à être prêt à commiter !
Tu peux aussi regarder le programme de notre formation "Comprendre Git" ou nous poser tes questions sur notre forum discord.