Annuler un commit est un peu effrayant si vous ne savez pas comment cela fonctionne. Mais c'est en fait incroyablement facile si vous comprenez. Je vais vous montrer les 4 différentes façons d'annuler un commit.
option 1 : git reset --hard
Disons que vous avez ceci, où C est votre HEAD et (F) est l'état de vos fichiers.
(F)
A-B-C
master
Vous voulez nuke commit C et ne jamais le revoir et perdre tous les changements dans les fichiers modifiés localement. . Vous faites ça :
git reset --hard HEAD~1
Le résultat est :
(F)
A-B
master
Maintenant B est la TÊTE. Parce que vous avez utilisé --hard
vos fichiers sont remis dans l'état où ils étaient lors de la validation B.
option 2 : git reset
Ah, mais supposons que la commission C n'était pas un désastre, mais juste un peu à côté. Vous voulez annuler la livraison mais conserver vos modifications pour un peu d'édition avant de faire un meilleur engagement. Recommencez à partir d'ici, avec C comme HEAD :
(F)
A-B-C
master
Vous pouvez le faire en laissant de côté le --hard
:
git reset HEAD~1
Dans ce cas, le résultat est :
(F)
A-B-C
master
Dans les deux cas, HEAD est juste un pointeur vers le dernier commit. Lorsque vous faites un git reset HEAD~1
vous demandez à Git de reculer le pointeur HEAD d'un commit. Mais (à moins que vous n'utilisiez --hard
) vous laissez vos fichiers tels qu'ils étaient. Donc, maintenant git status
montre les changements que vous aviez enregistrés dans C. Vous n'avez rien perdu !
option 3 : git reset --soft
Pour la touche la plus légère, vous pouvez même annuler votre livraison mais laisser vos fichiers et vos indice :
git reset --soft HEAD~1
Cela ne laisse pas seulement vos fichiers seuls, cela laisse même votre indice seul. Quand vous le faites git status
vous verrez que les mêmes fichiers sont dans l'index que précédemment. En fait, juste après cette commande, vous pourriez faire git commit
et vous devrez refaire le même commit que vous venez de faire.
option 4 : vous l'avez fait git reset --hard
et j'ai besoin de récupérer ce code
Une dernière chose : Supposons que vous détruisiez un commit comme dans le premier exemple, mais ensuite découvrir que vous en aviez besoin après tout ? Pas de chance, hein ?
Non, il y a toujours un moyen de le récupérer. Type git reflog
et vous verrez une liste de commit (partiel) shas (c'est-à-dire des hachages) dans lesquels vous vous êtes déplacés. Trouvez le commit que vous avez détruit, et faites ceci :
git checkout -b someNewBranchName shaYouDestroyed
Vous avez maintenant ressuscité ce commit. Les commits ne sont pas réellement détruits dans Git avant environ 90 jours, donc vous pouvez généralement revenir en arrière et sauver un commit dont vous n'aviez pas l'intention de vous débarrasser.
0 votes
Voir ce guide pour annuler les commits Git sur les branches locales, publiques et Git. Comment défaire les commits Git comme un pro ?
365 votes
Vous savez ce dont git a besoin ?
git undo
c'est tout. Ensuite, la réputation de git pour gérer les erreurs faites par nous, simples mortels, disparaît. Implémenter en poussant l'état actuel sur une pile git avant d'exécuter toutgit
commande. Cela affecterait les performances, il serait donc préférable d'ajouter un indicateur de configuration permettant de l'activer ou non.36 votes
@YiminRong Cela peut être fait avec l'outil Git
alias
fonction : git-scm.com/book/fr/v2/Git-Basics-Git-Aliases55 votes
Pour les utilisateurs de VsCode, il suffit de taper ctrl +shift +G et ensuite de cliquer sur trois points, c'est-à-dire, plus d'options et ensuite de cliquer sur annuler Last Commit.
10 votes
@YiminRong Undo ce que exactement ? Il y a des dizaines de cas fonctionnels très différents où "défaire" signifie quelque chose complètement différent. Je parie que l'ajout d'une nouvelle "baguette magique" ne ferait qu'accroître la confusion.
31 votes
@YiminRong Je ne l'achète pas. Les gens continueraient à tâtonner et à défaire des choses qui ne doivent pas être défaites. Mais plus important,
git reflog
est déjà proche de ce que vous décrivez, mais donne à l'utilisateur plus de contrôle sur ce qui doit être (dé)fait. Mais, s'il vous plaît, non, "annuler" ne fonctionne pas de la même manière partout, et les gens voudraient s'attendre à beaucoup de choses différentes à réaliser par la fonction. Annuler le dernier commit ? Annuler la dernière action ? Si la dernière action était un push, annuler comment exactement, (reset et push) ou (revert et push) ?4 votes
Pour faire quelque chose de simple dans git, il faut faire la tâche impossible A ou la tâche impossible B. Ensuite, il faut faire une légère erreur et essayer de revenir en arrière en faisant la tâche impossible C ou la tâche impossible D.
0 votes
Git est un framework permettant de gérer les versions de nombreux fichiers et de permettre le travail collaboratif. Il nécessite un contrôle absolu de ce que vous faites pour atteindre ces objectifs. C'est un excellent précisément parce qu'il essaie de laisser de côté toute la "magie" inutile. Quelque chose comme
git undo
est généralement une mauvaise idée, mais elle est ridiculement facile à mettre en œuvre si vous le voulez vraiment. Mais alors, soyez conscient que vous en êtes responsable. Je trouve vraiment étonnant que les gens soient si prompts à abandonner le contrôle pour ne pas avoir à apprendre des choses. Git est facile vous devez juste apprendre les concepts.0 votes
"défaire les choses qui ne doivent pas être défaites" - Ces choses seraient toutes les choses. Comment puis-je vraiment faire confiance à mon code source pour quelque chose qui me laisse (ou d'autres) changer l'histoire.
1 votes
Argumenter contre un
undo
Le commandement est un orgueil artificiel. Oui, vous pouvez y parvenir en combinant les éléments suivantsreflog
,reset
ycheckout
. Le problème est qu'il s'agit d'une expression d'intention tout à fait contre nature pour quiconque ne le fait pas couramment. Mercurial arollback
et ça n'a rien cassé. Git devrait avoir quelque chose aussi.0 votes
Vous pouvez installer git-extras qui sont un ensemble de fonctions utilitaires de git - comprend la fonction
git undo
pour annuler la livraison la plus récente. Je l'utilise tout le temps quand je viens de commiter quelque chose (et que je n'ai pas encore poussé) et que j'ai besoin d'ajouter un fichier non géré ou de changer le commentaire de la commination.0 votes
@ashad - Votre suggestion était parfaite pour moi ! Merci !