Annuler les commits poussés dans Git avec Reset et Revert
-
Annuler les commits poussés avec la commande
git reset
-
Annuler les commits poussés avec la commande
git revert
-
Annuler les commits poussés avec la commande
git checkout
Nous montrons trois méthodes pour annuler les commits poussés à partir d’un référentiel distant dans Git. Nous utilisons les commandes git reset
, revert
et checkout
pour cela.
Lorsque nous utilisons git reset
, nous supprimons également toute trace des commits indésirables de l’historique du référentiel. Mais avec git revert
, les commits d’origine et d’annulation restent dans l’historique.
Si on utilise git checkout
, on annule les changements dans une nouvelle branche.
Annuler les commits poussés avec la commande git reset
Nous créons un dépôt undo_pushed_commits_local
et le remplissons avec quelques (bons) commits sains.
mkdir undo_pushed_commits_local
git init
Ajoutez/modifiez ensuite des fichiers.
git add --all
git commit -m "Make healthy commit"
Ajouter/modifier plus de fichiers.
git add -all
git commit -m "Make another healthy commit"
Nous allons maintenant pousser ces commits vers le dépôt undo-pushed-commits-remote
sur GitHub.
git remote add undo-remote git@github.com:danielturidandy/undo-pushed-commits-remote.git
git push undo-remote master
Notre référentiel distant a maintenant deux commits.
Maintenant, faisons le mauvais commit.
echo "This is a bad addition" >> file1.txt
echo "This is a bad addition" >> file2.txt
git add -all
git commit -m "Make a bad commit"
Nous poussons ce commit vers le référentiel distant.
git push undo-remote
Notre télécommande a le mauvais commit :
Nous revenons maintenant au dernier bon commit dans notre dépôt local. Nous utilisons l’option --hard
pour supprimer toute trace des mauvais commits de l’historique des commits.
git log
git reset --hard <SHA of the last good commit>
On push
le local vers le dépôt distant avec l’option -f pour forcer le push.
git push -f undo-remote
Cette méthode fonctionne mieux avec des référentiels privés ou des référentiels avec de petites équipes.
Les grandes équipes peuvent rencontrer des problèmes si certains développeurs tirent la télécommande vers leur environnement local après avoir poussé les mauvais commits avant de réinitialiser à un bon état. Ils n’ont pas d’historique des commits avec des informations sur les mauvais commits pour “corriger” leurs référentiels.
Annuler les commits poussés avec la commande git revert
Nous avons ici poussé quatre mauvais commits vers le référentiel distant.
Nous pouvons utiliser revert
pour annuler soit un seul mauvais commit, soit une série de mauvais commits.
revert
crée un nouveau commit qui annule le commit indésirable. Les commits d’origine et inversés restent dans l’historique du référentiel.
Annuler un seul commit poussé avec revert
git revert <SHA of the commit we want to revert>
Nous poussons maintenant cette modification dans le référentiel distant. N’oubliez pas d’utiliser l’indicateur -f pour vous assurer qu’aucun conflit ne survient.
git push -f undo-remote
Notre référentiel distant a maintenant le nouveau commit qui annule le mauvais commit.
Annuler une plage de commits poussés avec revert
git revert <SHA of the oldest commit to revert>..<SHA of the newest commit to revert>
Cela annulera tous les commits dans la plage fournie (sans compter le commit le plus ancien, mais cela peut également dépendre de la version/plate-forme que vous utilisez.)
Nous poussons maintenant les modifications à la télécommande avec le drapeau -f.
git push -f undo-remote
Cette méthode est idéale pour les référentiels publics sur lesquels travaillent de grandes équipes. Comme les commits incorrects et annulés restent dans l’historique, les développeurs peuvent maintenir leurs référentiels locaux à jour avec tous les mauvais push/reverts.
Annuler les commits poussés avec la commande git checkout
Cette technique est un hack rapide qui bifurque une nouvelle branche sans les mauvais commits. C’est idéal pour les petites bases de code et si vous manquez de temps.
On checkout
d’abord jusqu’au dernier bon commit.
git checkout <SHA of last known good commit>
Nous atteignons alors un état HEAD détaché au dernier bon commit connu dans l’historique du référentiel.
Nous avons ici maintenant fork une nouvelle branche de cet état.
git checkout -b branch_without_badcommits
Nous le poussons ensuite dans la télécommande dans une nouvelle branche.
git push -f undo-remote branch_without_badcommits
Le référentiel distant a maintenant une nouvelle branche sans aucun mauvais commit.