Recréer l'historique Git d'un projet à partir de son état actuel
Introduction:
Ce guide explique comment recréer l’historique Git d’un projet à partir de son état actuel en supprimant les métadonnées Git du dépôt local, en initialisant un nouveau dépôt, puis en remplaçant l’historique de la branche distante main.
Bien que peu courante au quotidien, cette opération est utile dans plusieurs situations spécifiques, par exemple:
- Si vous exposez des secrets: commencez toujours par les révoquer (clés API, jetons, mots de passe, etc.). La réinitialisation retire ces informations de l’historique visible du dépôt, mais elle ne garantit pas que les données aient disparu de tous les clones, forks ou caches existants.
- Pour une question de propreté: après la phase d’initialisation d’un projet, il peut être utile de repartir sur un historique propre en supprimant les premiers commits liés à la phase de développement initiale.
- Pour repartir sur des bases propres après une longue période de développement: après des changements importants, on peut souhaiter réinitialiser l’historique afin de repartir sur des bases claires et éviter toute confusion.
⚠️ Attention: cette opération est irréversible. Elle écrasera définitivement l’historique de la branche distante main. Si d’autres personnes collaborent sur ce projet, il est fortement recommandé qu’elles suppriment leur version locale et reclonent le dépôt une fois l’opération terminée afin d’éviter des conflits majeurs.
Prérequis: effectuez une sauvegarde du dépôt dont vous souhaitez réinitialiser l’historique des commits.
Note: cet article part du principe que votre branche principale est
mainet que c’est sur celle-ci que l’on va effectuer le nettoyage. Bien que ce soit le standard actuel sur des plateformes comme GitHub ou GitLab, pensez à vérifier votre dépôt. Si votre branche par défaut porte un autre nom, il vous suffira d’adapter les commandes en conséquence. Je vous indiquerai les étapes où cette vigilance est nécessaire.
Description de la procédure:
Assurez-vous de bien comprendre l’opération ainsi que les implications de ce qui va être fait.
1. Nettoyage local:
Commencez par cloner le dépôt contenant la branche main à réinitialiser.
Le clonage permet de récupérer l’état actuel des fichiers du projet avant de supprimer l’ancien historique Git.
Ensuite, ouvrez un terminal à la racine du projet, puis suivez les étapes ci-dessous et exécutez les commandes associées:
Étape 1, supprimer le dossier .git:
- Windows (via PowerShell):
Remove-Item -Recurse -Force .git- Mac / Linux :
rm -rf .gitCela supprime le répertoire .git, qui contient l’ensemble des métadonnées Git du dépôt: historique des commits, branches locales, tags et configuration associée.
Cette suppression concerne uniquement votre copie locale du dépôt. Le dépôt distant et son historique restent inchangés jusqu’à l’exécution de la commande
git push --force.
Étape 2, initialiser un nouveau dépôt Git:
Une fois l’ancien historique supprimé, vous devez initialiser un nouveau dépôt Git propre.
Exécutez la commande suivante dans votre terminal:
git initAjoutez ensuite tous les fichiers du projet à l’index:
git add .Enfin, créez le premier commit de ce nouveau dépôt:
git commit -m "chore: reset repository history and initialize fresh project state"2. Configurer la branche principale:
Renommez la branche courante du dépôt en main:
git branch -M mainNote: cette commande renomme la branche courante en main. Si votre dépôt utilise un autre nom pour sa branche principale, adaptez la commande en conséquence.
3. Lier le dépôt distant et forcer l’envoi du nouvel historique:
Ajoutez le dépôt distant:
Remplacez l’URL ci-dessous par celle de votre dépôt GitHub.
git remote add origin https://github.com/<NOM>/<NOM_PROJET>.gitForcez ensuite l’envoi du nouvel historique vers le dépôt distant:
git push -u origin main --force⚠️ Cette commande remplace définitivement l’historique du dépôt distant. Assurez-vous que tous les collaborateurs sont informés avant de l’exécuter. Les forks existants et les clones locaux conserveront l’historique précédent jusqu’à ce qu’ils soient supprimés ou réécrits.
Attention: ici aussi, l’envoi est effectué vers main, c’est-à-dire la branche réinitialisée précédemment. Vérifiez impérativement que le nom de branche correspond bien à votre configuration.
Note: si vous souhaitez également supprimer les autres branches distantes, exécutez la commande suivante pour chacune d’elles:
git push origin --delete <nom_de_la_branche>Conclusion:
Une fois ces étapes terminées, le dépôt distant ne contiendra plus qu’un unique commit correspondant au nouvel état initial du projet. L’ancien historique ne sera plus accessible depuis la branche principale du dépôt distant.