web-dev-qa-db-fra.com

Comment inverser un commit dans git?

Je ne connais pas vraiment le fonctionnement de git. J'ai poussé un commit par erreur et je veux l'annuler. j'ai fait un

git reset --hard HEAD~1

Attention Googlers: Cela annule non seulement la validation, mais annule toutes les modifications de fichier!

et maintenant le projet est rétabli sur ma machine, mais pas sur github. Si j'essaie de pousser ce code, j'obtiens l'erreur "Votre branche est derrière" Origin/master "par 1 commit et peut être transmise rapidement. Comment supprimer ce commit de github?

42
David Mulder

Tu peux faire git Push --force mais sachez que vous réécrivez l'historique et que toute personne utilisant le dépôt aura des problèmes avec cela.

Si vous souhaitez éviter ce problème, n'utilisez pas la réinitialisation, mais utilisez plutôt git revert

32
Let_Me_Be

Cet article a une excellente explication sur la façon de procéder divers scénarios (où un commit a été fait ainsi que le Push OR juste un commit, avant le Push):

http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html

De l'article, la commande la plus simple que j'ai vu pour annuler un commit précédent par son id de commit , était:

git revert dd61ab32
42
AmpT

Ou vous pouvez essayer d'utiliser git revert http://www.kernel.org/pub/software/scm/git/docs/git-revert.html . Je pense que quelque chose comme git revert HEAD~1 -m 1 annulera votre dernier commit (s'il s'agit toujours du dernier commit).

18
Luke

Incapable de commenter les réponses des autres, je fournirai quelques informations supplémentaires.

Si vous voulez revert le dernier commit, vous pouvez utiliser git revert head. head fait référence au commit le plus récent de votre branche.

La raison pour laquelle vous utilisez head~1 Lorsque vous utilisez reset est que vous dites à Git de "supprimer toutes les modifications dans les validations après" (reset --hard) "La validation avant la tête" ( head~1).

reset est sur un commit, revert est sur un commit.

Comme l'a souligné AmpT, vous pouvez également utiliser le commit SHA pour l'identifier, plutôt que de compter à quelle distance de head il est. Le SHA peut être trouvé dans les journaux (git log) Et de nombreuses autres façons.

Vous pouvez également toujours utiliser d'autres pointeurs dans Git. par exemple. une balise ou une branche. Et peut également utiliser toutes ces autres façons amusantes pour référencer les validations https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html#_specifying_revisions

7
Rodel30

Je pense que vous devez pousser un commit de retour. Donc pull de github à nouveau, y compris le commit que vous souhaitez annuler, puis utilisez git revert et Poussez le résultat.

Si vous ne vous souciez pas que les clones d'autres personnes de votre référentiel github soient cassés, vous pouvez également supprimer et recréer la branche principale sur github après votre reset: git Push Origin :master.

2
Ilkka