Annuler une validation est un peu effrayant si vous ne savez pas comment cela fonctionne. Mais c'est en fait incroyablement facile si vous comprenez.
Supposons que vous ayez 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 plus jamais le voir et perdre toutes les modifications dans les fichiers modifiés localement . Tu fais cela:
git reset --hard HEAD~1
Le résultat est:
(F)
A-B
↑
master
Maintenant, B est la TÊTE. Parce que vous l'avez utilisé --hard
, vos fichiers sont réinitialisés à leur état lors de la validation B.
Ah, mais supposons que le commit C n'était pas un désastre, mais juste un peu décalé. Vous souhaitez annuler la validation mais conserver vos modifications pour un peu de modification avant de faire une meilleure validation. À partir d'ici, avec C comme TÊTE:
(F)
A-B-C
↑
master
Vous pouvez le faire en laissant de côté --hard
:
git reset HEAD~1
Dans ce cas, le résultat est:
(F)
A-B-C
↑
master
Dans les deux cas, HEAD n'est qu'un pointeur vers le dernier commit. Lorsque vous effectuez un git reset HEAD~1
, vous dites à Git de reculer le pointeur HEAD d'un commit. Mais (sauf si vous l'utilisez --hard
), vous laissez vos fichiers tels qu'ils étaient. Affiche maintenant git status
les modifications que vous avez enregistrées dans C. Vous n'avez rien perdu!
Pour le toucher le plus léger, vous pouvez même annuler votre commit mais laisser vos fichiers et votre index :
git reset --soft HEAD~1
Cela laisse non seulement vos fichiers seuls, mais laisse également votre index seul. Lorsque vous le ferez 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 le faire git commit
et vous referiez le même commit que vous venez d'avoir.
Encore une chose: supposons que vous détruisiez un commit comme dans le premier exemple, mais que vous découvriez ensuite que vous en aviez besoin après tout ? Pas de chance, non?
Non, il y a encore un moyen de le récupérer. Tapez git reflog
et vous verrez une liste de shas de validation (partiels) (c'est-à-dire des hachages) dans lesquels vous vous êtes déplacé. Trouvez le commit que vous avez détruit, et procédez comme suit :
git checkout -b someNewBranchName shaYouDestroyed
Vous avez maintenant ressuscité ce commit. Les commits ne sont pas réellement détruits dans Git pendant environ 90 jours, vous pouvez donc généralement revenir en arrière et en sauver un dont vous ne vouliez pas vous débarrasser.