Git : Supprimer un commit local ou distant

2 minutes
console terminal bash git branche remote

Comment supprimer un commit local avec Git ? Comment supprimer un commit distant avec Git ? Comment supprimer un commit push avec Git ?

Vous avez commité un (ou plusieurs) fichier par erreur ? Vous voulez supprimer ce commit ?

Supprimer un commit locale avec Git

La commande simple est :

$ git reset HEAD~

Le sélecteur de révision HEAD~ fait référence au dernier commit.

Les modifications ne seront pas supprimées.

Vous pouvez poursuivre les modifications sur vos fichiers et si vous souhaitez les commiter avec le même message de commit que celui supprimé, c'est possible :

$ git add.
$ git commit -c ORIG_HEAD  

Ce que fait git, c'est qu'au moment du reset, il copie hash du HEAD dans un fichier .git/ORIG_HEAD. Donc en invoquand l'option -c ORIG_HEAD, git est capable de récupérer le message de l'ancien commit. Il ouvre l'éditeur pour éditeur l'ancien message de commit.
Si vous voulez commiter avec l'ancien message sans l'éditeur, vous pouvez utiliser l'option -C.

Supprimer un commit distant avec Git

Pour supprimer un commit distant, c'est la même chose mais avec un push -f pour réécrire l'historique :

$ git reset HEAD~

$ git push -f
# ou mieux
$ git push --force-with-lease

L'option --force-with-lease permet d'éviter de réécrire l'historique si une autre personne a fait un commit. Je préfère largement utiliser cette option pour éviter les surprises.

Les modes de git reset

Nous pouvons aller un peu plus loin en modifiant les modes de git reset.
On est jamais bien sûr si nos modifications vont être supprimées, unstage ou pas.
Voici donc un rappel sur les modes principaux :

  1. --mixed : c'est l'option par défaut (donc si on ne met pas de mode). Les fichiers modifiés sont préservés mais unstage (supprimé de l'index) et signale ce qui n'a pas été mis à jour.
  2. --soft : Les fichiers modifiés sont préservés mais restent dans le staging (dans l'index). Le pointeur HEAD est déplacé (comme le font tous les modes).
  3. --hard : Toutes les modifications sont supprimées. Tous les fichiers ou répertoires non suivis qui empêchent l'écriture de tout fichier suivi sont simplement supprimés. Ce mode est souvent utilisé pour revenir à un version "d'origine".

Je rappelle quel est la différence entre la copie de travail, l'index (staging), le dépôt local, le dépôt distant dans mon article sur Quelle est la différence entre git reset et git rm --cached

Pour aller plus loin

Documentation git reset

Blog Comments powered by Disqus.

Article précédent Article suivant