web-dev-qa-db-fra.com

Comment utiliser 'git reset --hard HEAD' pour revenir à un commit précédent?

Je sais que Git suit les modifications que j'ai apportées à mon application et qu'elle les conserve jusqu'à ce que je les valide, mais voici où je raccroche:

Quand je veux revenir à un commit précédent, j'utilise:

git reset --hard HEAD

Et Git revient:

HEAD is now at 820f417 micro

Comment puis-je rétablir les fichiers sur mon disque dur à la précédente validation?

Mes prochaines étapes ont été:

git add .
git commit -m "revert"

Mais aucun des fichiers n'a changé sur mon disque dur ...

Qu'est-ce que je fais bien/mal?

842
Brian McDonough

Premièrement, il est toujours intéressant de noter que git reset --hard est une commande potentiellement dangereuse, car elle jette toutes vos modifications non validées. Pour des raisons de sécurité, vous devez toujours vérifier que la sortie de git status est propre (c'est-à-dire vide) avant de l'utiliser.

Au début, vous dites ce qui suit:

Je sais donc que Git suit les modifications que j'ai apportées à ma candidature et les conserve jusqu'à ce que je les valide, mais voici où je suis suspendu:

C'est faux. Git enregistre uniquement l'état des fichiers lorsque vous les mettez en scène (avec git add) ou lorsque vous créez un commit. Une fois que vous avez créé un commit qui contient vos fichiers de projet dans un état particulier, ils sont très sûrs, mais jusque-là, Git ne "surveille pas vraiment les modifications" de vos fichiers. (Par exemple, même si vous exécutez git add pour créer une nouvelle version du fichier, cela remplace la version précédemment stockée de ce fichier dans la zone de transfert.)

Dans votre question, vous posez ensuite la question suivante:

Quand je veux revenir à un commit précédent, j'utilise: git reset --hard HEAD Et git renvoie: HEAD est maintenant à 820f417 micro

Comment puis-je rétablir les fichiers sur mon disque dur à la précédente validation?

Si vous faites git reset --hard <SOME-COMMIT> alors Git va:

  • Faites votre branche actuelle (généralement master) de nouveau au point à <SOME-COMMIT>.
  • Ensuite, associez les fichiers de votre arbre de travail et de l'index ("zone de stockage intermédiaire") aux versions validées dans <SOME-COMMIT>.

HEAD pointe vers votre branche actuelle (ou votre commit actuel), donc tout ce que git reset --hard HEAD fera est de supprimer toutes les modifications non validées que vous avez.

Supposons donc que le bon commit sur lequel vous souhaitez revenir soit f414f31. (Vous pouvez le trouver via git log ou n’importe quel navigateur d’historique.) Vous avez alors quelques options différentes en fonction de ce que vous voulez faire:

  • Modifiez votre branche actuelle pour qu'elle pointe vers l'ancien commit. Vous pouvez le faire avec git reset --hard f414f31. Cependant, il s’agit d’une réécriture de l’historique de votre branche. Vous devez donc l’éviter si vous avez partagé cette branche avec un tiers. De plus, les commits que vous avez effectués après f414f31 ne seront plus dans l'historique de votre branche master.
  • Créez un nouveau commit qui représente exactement le même état du projet que f414f31, mais l'ajoute simplement à l'historique afin que vous ne perdiez aucun historique. Vous pouvez le faire en suivant les étapes suggérées dans cette réponse - quelque chose comme:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"
    
969
Mark Longair

AVERTISSEMENT: git clean -f supprimera les fichiers non suivis, ce qui signifie qu'ils sont définitivement perdus car ils ne sont pas stockés dans le référentiel. Assurez-vous de vouloir réellement supprimer tous les fichiers non suivis avant de le faire.


Essayez ceci et voyez git clean -f.

git reset --hard ne supprimera pas les fichiers non suivis, alors que git-clean supprimera tous les fichiers du répertoire racine suivi qui ne se trouvent pas sous le suivi Git.

Alternativement, comme @Paul Betts l'a dit, vous pouvez le faire (attention cependant - cela supprime également tous les fichiers ignorés)

  • git clean -df
  • git clean -xdfATTENTION! Ceci supprimera également les fichiers ignorés
191
uday