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 !