Vous vous êtes sans doute déjà retrouvé dans le scénario suivant. Vous travaillez sur un repository Git hébergé sur GitHub ou GitLab. En local, vous venez de commit vos modifications, puis vous vous rendez compte que c’était une erreur. Vous vous êtes trompé de branche, vous avez commit des fichiers qu’il ne fallait pas, ou toute autre raison.
Annuler le dernier commit git
L’état de votre projet Git est donc similaire à ce schéma:
Vous avez plusieurs possibilités lorsqu’il s’agit de revenir à un état précédent:
Supprimer définitivement le dernier commit
Attention, cette méthode supprimera définitivement toutes les modifications en cours ainsi que les modifications du dernier commit.
git reset --hard HEAD~1
Supprimer le dernier commit mais garder les modifications
Si vous voulez supprimer le dernier commit mais garder les modifications dans le repo git pour ajuster ce que vous voulez commit, utilisez plutôt l’attribut --soft
:
git reset --soft HEAD~1
Revenir à un commit précédent
Si vous avez effectué plusieurs commits que vous voulez annuler, il existe des méthodes pour revenir à un commit en particulier.
Tout d’abord, repérez le commit sur lequel revenir:
$ git log --pretty=oneline
3396763626316124388f76be662bd941df591118 Ajouter fichier innutile
c73bbc98b5f55e5a4dbfee8e0297e4e1652a0687 Commit la mite
9cf95dacd226dcf43da376cdb6cbba7035218921 Dernier commit OK
4cc67b53df14444b20026e799bdeb70e3117890e Fonctionnalité géniale
Vous voulez donc revenir au commit nommé « Dernier commit OK ». Il existe aussi plusieurs méthodes pour garder ou non les modifications des commits supprimés.
Supprimer définitivement les modifications
Pour revenir au commit désiré en supprimant toutes les modifications faites entre temps, rien de plus simple:
git reset --hard 9cf95dacd226dcf43da376cdb6cbba7035218921
Cette commande réinitialise l’état du repo local au niveau du commit passé en paramètres.
Revenir temporairement à un commit précédent
Pour garder les modifications mais retrouver l’état d’un commit précédent, c’est très simple. On utilise la commande checkout
. De la même manière que pour l’exemple précédent, on a besoin du hash du commit visé:
git checkout 9cf95dacd226dcf43da376cdb6cbba7035218921
Vous allez arriver dans un état dit de tête détachée. Le repo n’est plus à proprement parlé sur une branche, mais sur un commit en particulier. Pour revenir sur la branche et retrouver tous les derniers commits, il suffit de réutiliser checkout:
# Si pour aller vers une branche en particulier :
git checkout master
# Pour retourner sur la dernière branche :
git checkout -
Ici, on récupère le dernier état de la branche master, mais à remplacer avec le nom de la branche que vous voulez récupérer
Annuler un commit par un commit inverse
Des fois, il est nécessaire de garder l’historique git quand on annule un commit. Rien de plus simple avec la commande revert
:
# Inverser un commit :
git revert c73bbc98b5f55e5a4dbfee8e0297e4e1652a0687
# Inverser plusieurs commits :
git revert c73bbc98b5f55e5a4dbfee8e0297e4e1652a0687 3396763626316124388f76be662bd941df591118 9cf95dacd226dcf43da376cdb6cbba7035218921
# On peut aussi utiliser un interval. La commande suivante va supprimer les 2 derniers commits :
git revert HEAD~2..HEAD
Ces commandes vont créer un nouveau commit qui contiendra l’annulation du ou des commits voulus.
Pensez à pousser vos modifications !
Une fois vos modifications terminées, pensez à les envoyer au remote en lançant un git push