Retirer un ou plusieurs fichiers ou modifications à un commit
Tu viens de commiter et tu t’aperçois que tu as mis dans ton commit des choses prévues pour un autre commit ? Il te suffit d’annuler le commit en conservant les modifications qu’il contenait, de faire le tri et de refaire “proprement” ton commit.
Voyons la procédure dans le détail.
Cet article fait partie de la série “Annuler, défaire, corriger” qui décrit plus d’une dizaine de scenarios et leurs solutions.
Etape 1 : analyser
Histoire d’être certain·e que notre dernier commit embarque les “mauvaises” modifications, on a tout intérêt à analyser. Je te propose ici 2 approches :
- Lister les fichiers sans afficher les modifications ;
- Lister les fichiers avec afficher les modifications.
Il m’arrive parfois d’utiliser les 2 l’une après l’autres :
1. Juste les noms de fichiers
> git show --name-status
commit 0422ca6
Author: Maxime Bréhin <maxime@comprendre-git.com>
Date: Tue Jan 7 13:22:43 2025 +0100
updates on f1 + files creation
M f1.txt
A f2.txt
A f3.txt
2. La totale
Cette version peut s’avérer moins lisible. Tout dépend donc de ton besoin de vérifier le détail des modifications.
commit 0422ca6
Author: Maxime Bréhin <maxime@comprendre-git.com>
Date: Tue Jan 7 13:22:43 2025 +0100
updates on f1 + files creation
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
modified: f1.txt
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
@ f1.txt:1 @
File 1 content with updates…
update 1
update 2
update 3
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
added: f2.txt
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
@ f2.txt:1 @
This is the content of file number 2
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
added: f3.txt
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
@ f3.txt:1 @
What another content for file 3
Étape 2 : défaire
Comme je l’ai déjà décrit dans l’article “Défaire un commit”, on va juste faire un pas en arrière dans l’historique local Git, sans toucher à notre travail local (le working directory).
Si on prend l’historique suivant, ça signifie qu’on veut retirer le commit id5
(pour le refaire “propre”) :
Cette première étape consiste à utiliser la commande reset
avec le mode par défaut (mixed
) en allant un cran en arrière :
git reset --mixed HEAD~1
On obtient alors l’historique suivant :
Tes modifications sont toujours présentes dans tes fichiers et apparaissent si tu fais un git status
.
Si on reprend l’exemple vu en haut lors du git show
, le commit id5
contenait des modifications sur le fichier f1.txt
et ajoutait les fichiers f2.txt
et f3.txt
. Ce sont ces 2 derniers ajouts que nous souhaitons mettre dans un autre commit, plus tard.
> git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: f1.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
f2.txt
f3.txt
no changes added to commit (use "git add" and/or "git commit -a")
Étape 3 : faire notre commit “propre”
On peut désormais ajouter tout ou partie des modifications de f1.txt
et recréer notre commit qui remplacera id5
.
git add f1.txt
git commit -m 'Message du commit pour f1.txt'
On effectue nos dernières vérifications du log et du status :
> git status
On branch dev
Untracked files:
(use "git add <file>..." to include in what will be committed)
f2.txt
f3.txt
Tu peux aussi regarder le programme de notre formation "Comprendre Git" ou nous poser tes questions sur notre forum discord.