Supprimer un commit dans l'historique de Git

J'ai fait une gaffe : j'ai commité dans un dépot public des informations confidentielles. Mais je ne m'en suis pas rendu compte de suite et j'ai poussé d'autres commits entre temps. Du coup, impossible d'amender le commit en question d'un simple git commit --amend. Mais ça reste possible !

Prenons l'historique suivant :

master : A—B—C—D—E—F  

Le commit facheux est le commit C. Nous voulons le modifier pour enlever les quelques lignes qui ne devraient pas apparaitre en public. La première chose à faire est de réécrire l'historique à l'aide de rebase pour supprimer ce commit :

git rebase --onto master~4 master~3 master  

Cette commande indique à git de réécrire l'historique en ignorant le quatrième commit en partant de la tête jusqu'au troisième non inclus. Donc là, il va ignorer le commit C, ça tombe bien c'est celui qui nous embête. Nous nous retrouvons maintenant avec l'historique suivant :

master : A—B—D—E—F  
origin/master : A—B—C—D—E—F  

Maintenant, on veut quand même récupérer le commit C et le modifier. Rien de plus simple : un cherry-pick. On récupère le hash du commit C qui est toujours présent dans origin/master, on le cherry-pick et on peut alors l'amender puisqu'il se retrouve alors en tête de l'historique :

git cherry-pick 92cfceb39d57d914ed8b14d0e37643de0797ae56  

Modifier le fichier incriminé, puis :

git add src/fichierfacheux.js  
git commit --amend  

Et on termine par un push forcé :

git push origin master -f  

Voici le nouvel historique

origin/master : A—B—D—E—F-C'  

L'honneur est sauf !

Hadrien

Hi, I'm a french Javascript Lead Developer, Web Architect from Toulouse, France. I've worked for 12 years for many projects with YUI, AngularJS, Aurelia.io and now React and React native.

Toulouse, France https://hadrien.eu