Retirer un ou plusieurs fichiers ou modifications à un commit

Par Maxime Bréhin • Publié le 22 janvier 2025 • 3 min

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 :

  1. Lister les fichiers sans afficher les modifications ;
  2. 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”) :

id1id2id3id4(HEAD) id5

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 :

id1id2id3(HEAD) id4

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 :

id1id2id3id4(HEAD) id5’
> git status

On branch dev
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        f2.txt
        f3.txt
Tu veux aller plus loin et maîtriser pleinement les fondamentaux de Git ou être accompagné pour garantir la qualité de tes projets grâce à une bonne mise en place de Git ? On peut t’aider ou te former, il suffit de nous décrire ton besoin !
Tu peux aussi regarder le programme de notre formation "Comprendre Git" ou nous poser tes questions sur notre forum discord.