14/03/2024

2. Supprimer / annuler un commit - rebase / revert

Lu 3061 fois Licence Creative Commons

Supprimer un commit

Avec la commande rebase il est possible de changer l'historique de son projet, ce qui peut permettre -entre autre- de supprimer un commit.
On utilisera l'option -i (ou --interactive) pour avoir la liste des commits et choisir que faire pour chacun d'entre eux:

git rebase -i bbd7c93^

Si on souhaite agir sur un commit particulier, on passera le commit parent avec ^ car on aura la main sur les commits suivant celui référencé.

Sur l'éditeur apparaîtra la liste des commits à modifier:

pick bbd7c93 Ajoute une documentation sur le staging
pick fff3c3f Ajoute une feuille de triche
pick daaad19 Ajoute un conseil au README

# Rebase d91d190..daaad19 onto d91d190 (3 commands)
# ...

Parmis la liste des -nombreuses- commandes possibles, utiliser drop (au lieu de pick par défaut) pour se débarasser d'un commit, ou simplement supprimer la ligne.

Attention: rebase va réécrire l'historique. Ne jamais réécrire l'historique qui a déjà été partagé avec votre équipe ! Ce type d'opération est à réaliser uniquement pour les commits locaux.

Supprimer un commit avec rebase:


L'historique passe directement de d91d190 à fff3c3f, le commit a été supprimé.


Annuler les effets d'un commit

Si le commit à annuler a déjà été partagé, réécrire l'historique est donc une très mauvaise idée car ça impacterait l'historique d'autres personnes et pourrait potentiellement entrer en conflit avec leur travail.
Dans cette situation, au lieu de réécrire l'historique existant, il est préférable d'ajouter un nouveau commit qui aura pour effet d'annuler les effets du commit problématique avec la commande revert:

git revert bbd7c93
[output]Removing commit/staging.md
[output][master 93017ff] Revert "Ajoute une documentation sur le staging"
[output] 1 file changed, 4 deletions(-)
[output] delete mode 100644 commit/staging.md

Annuler un commit avec revert


Le commit est conservé pour ne pas perturber l'historique des autres développeurs, mais son effet est annulé par le commit de revert.