Revenir au dernier commit git

120

Je viens de faire un

git commit -m "blah"

puis j'ai ajouté des fichiers, comment puis-je restaurer et supprimer ce qui se trouve dans mes fichiers actuels qui n'ont pas encore été ajoutés / validés?

Blankman
la source
15
non, ce n'est pas ce que demande l'OP - il est clair qu'il veut revenir au dernier commit, pas annuler le dernier commit. il n'a pas dit qu'il avait ajouté des fichiers et les avait ensuite validés. si clairement qu'il veut le dernier commit.
Paul
1
Il est trop difficile de trouver une réponse à cette question super courante
Sam

Réponses:

211

Caveat Emptor - Commandes destructives à venir.

Atténuation - git reflog peut vous sauver si vous en avez besoin.


1) ANNULER les modifications du fichier local et GARDER votre dernier commit

git reset --hard

2) ANNULER les modifications du fichier local et SUPPRIMER votre dernier commit

git reset --hard HEAD^

3) GARDEZ les modifications de fichier local et SUPPRIMEZ votre dernier commit

git reset --soft HEAD^
Joe Hanink
la source
20
Cette commande supprimera votre commit précédent, alors utilisez-la avec prudence! git reset --hard is plus sûr
rudivonstaden
9
WTF fait cela comme la bonne réponse avec 36 votes positifs. Je viens de perdre une journée de travail pour ça ... parce que j'ai lu la réponse pas le commentaire. Ce n'est pas la bonne réponse à la question!
Chris Nevill
1
OK tout n'est pas perdu! Vous pouvez faire git reflog cela vous permettra de voir les commits que vous avez faits avant la réinitialisation. Vous pouvez ensuite vérifier ces commits
Chris Nevill
3
Pour ce que ça vaut, j'avais interprété la question de l'OP comme "comment annuler le commit et supprimer les fichiers actuels", mais elle était et reste ambiguë. J'aurais compris différemment si l'OP avait simplement dit "comment supprimer les fichiers actuels qui n'ont pas été ajoutés ou
validés
2
Git est l'antithèse de la déclaration d'Alan Kays Les choses simples devraient être simples, les choses complexes devraient être possibles. ... surtout de sa première partie. Merci encore pour votre réponse. ça m'a aidé.
0xC0000022L
46

Si vous souhaitez supprimer le contenu nouvellement ajouté et les fichiers déjà mis en scène (ainsi ajoutés à l'index), vous utilisez:

git reset --hard

Si vous souhaitez supprimer également votre dernier commit (est celui avec le message "blah") alors mieux vaut utiliser:

git reset --hard HEAD^

Pour supprimer les fichiers non suivis (donc les nouveaux fichiers non encore ajoutés à l'index) et les dossiers, utilisez:

git clean --force -d
Paul Pladijs
la source
git reset --hard HEAD ^ supprime-t-il définitivement mon dernier commit? comme je ne peux pas y retourner?
user137717
il semble que "git clean --force -d" supprime également les dossiers .gitignored
Alexey Timokhin
15

git reset --hard forcera le répertoire de travail à revenir au dernier commit et supprimera les fichiers nouveaux / modifiés.

Joint
la source
2
fait cela, mais les fichiers sont toujours là. (les fichiers non suivis sont toujours là)
Blankman
dans ce cas, vous pourriez faire un "git stash"
jacktrade
3
voté pour parce que c'est la seule réponse claire et sans ambiguïté à la question claire et sans ambiguïté du PO.
Paul
4

Vous pouvez annuler un commit en utilisant git revert HEAD^pour revenir à l'avant-dernier commit. Vous pouvez également spécifier le commit à annuler en utilisant l'id au lieu de HEAD ^

Sébastien Oliva
la source
Cela ne «revient» pas dans le sens que vous dites. Cela crée un reverse-commit.
Stefan Kendall
4

Si vous souhaitez simplement annuler la validation du dernier commit, utilisez ceci:

git reset HEAD~

fonctionne comme du charme pour moi.

Abhishek saharn
la source
2
c'est la réponse exacte à la question
Deniz Kocaboğa
cela devrait être la réponse approuvée
amiabl le
4

Un moyen simple et infaillible d'annuler les modifications de fichiers locaux depuis le dernier commit est de les placer dans une nouvelle branche:

git branch changes
git checkout changes
git add .
git commit

Cela laisse les changements dans la nouvelle branche. Revenez à la branche d'origine pour la retrouver au dernier commit:

git checkout master

La nouvelle branche est un bon endroit pour pratiquer différentes manières d'annuler les modifications sans risquer de gâcher la branche d'origine.

Terje Norderhaug
la source