Pulsars

Git Undo — Réparez vos Erreurs Git

Que s'est-il passé ?

Git est le système de contrôle de version le plus utilisé au monde, avec plus de 100 millions de développeurs sur GitHub en 2024. Les erreurs Git — commit sur la mauvaise branche, données sensibles poussées par accident, merge raté — sont parmi les recherches les plus fréquentes sur Stack Overflow. La plupart de ces erreurs sont réversibles grâce à des commandes comme `git reset`, `git revert` et `git reflog`, mais la syntaxe exacte dépend du contexte (poussé ou non, soft ou hard, fichier ou commit entier).

Quelles sont les erreurs Git les plus fréquentes et comment les corriger ?

Les urgences git les plus courantes se classent en quelques catégories : commiter sur la mauvaise branche, vouloir annuler un commit récent, avoir poussé accidentellement des données sensibles, et devoir inverser un merge. Chaque scénario a une solution différente selon que vous avez déjà poussé vers le distant ou non. L'arbre de décision ci-dessus vous guide à travers ces chemins pour trouver la correction la plus sûre.

Quelle est la différence entre git reset et git revert ?

git reset réécrit l'historique en déplaçant le pointeur de branche en arrière. Il existe en trois variantes : --soft (conserve les changements stagés), --mixed (conserve les changements non stagés, c'est le défaut) et --hard (supprime les changements entièrement). Reset est sûr pour les commits locaux non poussés — mais dangereux pour l'historique partagé.

git revert crée un nouveau commit qui annule les changements d'un commit spécifié. Il préserve l'historique complet, ce qui le rend sûr pour les branches poussées et partagées. L'inconvénient : votre historique montre à la fois le commit original et le revert.

Règle de base : utilisez reset pour les erreurs non poussées, revert pour celles déjà poussées.

Quand faut-il utiliser --force-with-lease au lieu de --force ?

Parfois il faut forcer un push — par exemple, après avoir amendé un commit poussé ou utilisé git filter-repo pour supprimer des données sensibles. Utilisez toujours --force-with-lease au lieu de --force. Le flag --force-with-lease vérifie que la branche distante n'a pas été mise à jour depuis votre dernier fetch. Si quelqu'un d'autre a poussé de nouveaux commits, votre force push est rejeté — vous empêchant d'écraser accidentellement son travail.

Vous travaillez avec des expressions régulières dans vos hooks git ou scripts CI ? Essayez notre testeur de Regex. Besoin de définir les permissions de fichiers pour des scripts déployés ? Consultez le calculateur Chmod.

Questions fréquentes

Quelle est la différence entre git reset et git revert ?

+

git reset déplace le pointeur de branche en arrière, effaçant les commits de l'historique. C'est sûr pour le travail local non poussé. git revert crée un nouveau commit qui annule les changements d'un commit précédent, préservant l'historique complet. Utilisez revert quand vous avez déjà poussé sur une branche partagée — c'est sûr pour le travail collaboratif car il ne réécrit pas l'historique.

Quand utiliser --force-with-lease plutôt que --force ?

+

Préférez toujours --force-with-lease à --force quand vous devez forcer un push. --force-with-lease vérifie que la branche distante n'a pas été mise à jour par quelqu'un d'autre depuis votre dernier fetch. Si c'est le cas, le push est rejeté — ce qui vous empêche d'écraser accidentellement le travail d'un collègue. --force écrase tout aveuglément.

Peut-on récupérer un commit après git reset --hard ?

+

Oui, en général. Git conserve un reflog local (git reflog) qui enregistre tous les mouvements de HEAD pendant 90 jours. Trouvez le hash du commit dans la sortie du reflog et utilisez git checkout -b branche-recup <hash> pour le restaurer. Cependant, si vous avez aussi lancé git gc (garbage collection), les commits non référencés peuvent être supprimés définitivement.

J'ai commité un mot de passe dans git. Est-il compromis ?

+

Si vous avez poussé le commit, considérez que le secret est compromis — même si vous force-push une correction en quelques secondes. Des scanners automatiques (y compris le secret scanning de GitHub) peuvent l'avoir déjà détecté, et quiconque a pullé votre repo a une copie. Changez immédiatement le mot de passe : révoquez les clés API, changez les mots de passe, générez de nouveaux tokens. Ensuite, utilisez git-filter-repo pour le supprimer de l'historique.

Comment annuler un merge git sans perdre la branche ?

+

Si le merge n'a pas été poussé, utilisez git reset --hard ORIG_HEAD pour revenir à l'état précédant le merge. S'il a déjà été poussé, utilisez git revert -m 1 <hash-du-merge> pour créer un nouveau commit qui annule le merge tout en préservant l'historique. Attention : si vous revertez un merge et voulez ensuite re-merger la même branche, il faudra d'abord reverter le revert.

Outils connexes