Annuler des commits Git après un push : Revenir en arrière en toute sécurité sur les dépôts distants
En tant que développeurs, nous avons tous vécu cette situation : vous effectuez un commit, vous le poussez vers un dépôt distant, puis vous réalisez que vous devez annuler ces modifications. Ne vous inquiétez pas, Git fournit des outils puissants pour vous aider à annuler les commits en toute sécurité, même après qu’ils ont été poussés. Dans cet article, nous explorerons divers scénarios et techniques pour annuler les commits Git et récupérer des erreurs, en assurant l’intégrité de l’historique de votre projet.
Points clés à retenir
- Utilisez
git reset
pour annuler les commits locaux avant de les pousser. - Utilisez
git revert
pour annuler en toute sécurité les commits poussés en créant un nouveau commit qui inverse les modifications. - Évitez de forcer le push vers les dépôts distants, car cela peut causer des problèmes pour les collaborateurs.
- Utilisez
git reflog
pour récupérer les commits perdus après un hard reset.
Comprendre les commits Git
Avant de nous plonger dans l’annulation des commits, passons rapidement en revue le fonctionnement des commits dans Git :
- Un commit représente un instantané de votre dépôt à un moment précis.
- Chaque commit possède un identifiant unique (hash SHA-1) et une référence à son ou ses commits parents.
- Le pointeur
HEAD
fait référence au commit actuel sur lequel vous vous trouvez dans votre dépôt local.
Annuler le dernier commit local
Si vous n’avez pas encore poussé votre dernier commit et que vous souhaitez l’annuler, vous avez plusieurs options :
Utiliser git reset
git reset --soft HEAD~1
: Cette commande déplace le pointeurHEAD
d’un commit en arrière, en gardant les modifications du dernier commit en stage.git reset --mixed HEAD~1
(ougit reset HEAD~1
) : C’est le comportement par défaut degit reset
. Il déplace le pointeurHEAD
d’un commit en arrière et retire les modifications du stage, mais les conserve dans votre répertoire de travail.git reset --hard HEAD~1
: Cette commande supprime toutes les modifications du dernier commit, en le supprimant effectivement de votre dépôt. Utilisez cette commande avec précaution, car elle supprime définitivement les modifications.
Utiliser git commit --amend
Si vous souhaitez modifier le dernier commit sans changer l’historique des commits, vous pouvez utiliser git commit --amend
. Cela vous permet de mettre à jour le message de commit ou d’ajouter/supprimer des modifications au dernier commit.
# Effectuer les modifications nécessaires
git add .
git commit --amend
Annuler les commits qui ont été poussés
Lorsque vous devez annuler des commits qui ont déjà été poussés vers un dépôt distant, vous devez utiliser git revert
pour créer un nouveau commit qui annule les modifications.
Utiliser git revert
- Identifiez le commit que vous souhaitez annuler à l’aide de
git log
. - Utilisez
git revert <commit-hash>
pour créer un nouveau commit qui annule le commit spécifié.
git revert 1a2b3c4d
- Poussez le nouveau commit vers le dépôt distant.
git push origin main
Avertissements concernant le force push
Évitez d’utiliser git push --force
pour écraser l’historique du dépôt distant, car cela peut causer des problèmes pour les autres collaborateurs. Au lieu de cela, utilisez git revert
pour maintenir un historique de commits propre et transparent.
Annuler plusieurs commits
Pour annuler plusieurs commits, vous pouvez utiliser git revert
avec une plage de commits ou effectuer un rebase interactif.
Annuler une plage de commits
git revert <oldest-commit-hash>..<latest-commit-hash>
Rebase interactif
- Utilisez
git rebase -i <commit-before-the-one-you-want-to-change>
pour démarrer un rebase interactif. - Dans l’éditeur, remplacez
pick
pardrop
pour les commits que vous souhaitez supprimer. - Enregistrez et quittez l’éditeur pour terminer le rebase.
Récupérer le travail perdu
Si vous avez accidentellement effectué un hard reset et perdu des commits, vous pouvez utiliser git reflog
pour les récupérer.
- Exécutez
git reflog
pour afficher le journal de toutes les actions effectuées dans le dépôt. - Identifiez le commit que vous souhaitez restaurer et notez son hash SHA-1.
- Utilisez
git checkout <commit-hash>
pour basculer vers ce commit. - Créez une nouvelle branche pour enregistrer les modifications récupérées :
git checkout -b recovered-branch
.
Bonnes pratiques
- Utilisez
git revert
au lieu degit reset
lorsque vous annulez des commits poussés pour maintenir un historique propre. - Soyez prudent lorsque vous utilisez
git reset --hard
, car il supprime définitivement les modifications. - Communiquez régulièrement avec votre équipe pour éviter les conflits lors de l’annulation de commits sur des branches partagées.
FAQ
Utilisez `git revert -m 1 <merge-commit-hash>` pour annuler un commit de fusion, en spécifiant le numéro du parent (`-m 1`) à conserver.
Résolvez les conflits manuellement, mettez en stage les modifications, puis exécutez `git revert --continue` pour terminer l'opération d'annulation.
Conclusion
L’annulation des commits Git, qu’ils soient locaux ou poussés, est une exigence courante dans le workflow de tout développeur. En comprenant les différentes approches, telles que git reset
, git revert
et git reflog
, vous pouvez gérer en toute confiance divers scénarios et maintenir un historique de projet propre et précis. N’oubliez pas de suivre les bonnes pratiques, de communiquer avec votre équipe et de toujours donner la priorité à l’intégrité de votre dépôt.