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 ?
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
.
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.
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 :
unstage
(supprimé de l'index) et signale ce qui n'a pas été mis à jour. staging
(dans l'index). Le pointeur HEAD est déplacé (comme le font tous les modes). 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