Question Comment puis-je utiliser 'git reset --hard HEAD' pour revenir à un commit précédent? [dupliquer]


Cette question a déjà une réponse ici:

Je sais que Git suit les modifications que j'apporte à mon application, et il les conserve jusqu'à ce que j'accepte les changements, mais voici où je suis accroché:

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 à ce commit précédent?

Mes prochaines étapes étaient:

git add .
git commit -m "revert"

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

Que fais-je bien / mal?


644
2018-03-02 06:36


origine


Réponses:


Tout d'abord, il vaut toujours la peine de noter que git reset --hard est une commande potentiellement dangereuse, car elle jette tous vos changements non validés. Pour la sécurité, vous devriez toujours vérifier que la sortie de git status est propre (c'est-à-dire vide) avant de l'utiliser.

Au départ, vous dites ce qui suit:

Donc, je sais que Git suit les changements que je fais à mon application, et il les conserve jusqu'à ce que je commette les changements, mais voici où je suis accroché:

Dans le cas où cela révèle une hypothèse erronée, je devrais dire que ce n'est pas correct. 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 a vos fichiers de projet dans un état particulier, ils sont très sûrs, mais jusque là, Git ne suit pas vraiment les changements de vos fichiers. (par exemple, même si vous faites git add pour mettre en scène une nouvelle version du fichier, cela écrase la version précédemment mise en scène de ce fichier dans la zone de transit.)

Dans votre question, vous posez ensuite les questions suivantes:

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

Comment puis-je rétablir les fichiers sur mon disque dur à ce commit précédent?

Si tu fais git reset --hard <SOME-COMMIT> alors Git va:

  • Faites votre branche actuelle (typiquement master) retour au point à <SOME-COMMIT>.
  • Faites ensuite les fichiers dans votre arbre de travail et l'index ("zone de transfert") de la même manière que les versions validées dans <SOME-COMMIT>.

HEAD pointe vers votre branche actuelle (ou le commit actuel), donc tout ça git reset --hard HEAD fera est de jeter tous les changements non engagés que vous avez.

Donc, supposons que le bon engagement que vous voulez revenir est f414f31. (Vous pouvez trouver cela via git log ou n'importe quel navigateur d'historique.) Vous avez alors quelques options différentes selon exactement ce que vous voulez faire:

  • Changez votre branche actuelle pour qu'elle pointe vers l'ancien commit à la place. Vous pourriez le faire avec git reset --hard f414f31. Cependant, ceci réécrit l'historique de votre branche, vous devriez donc l'éviter si vous avez partagé cette branche avec n'importe qui. En outre, les commits que vous avez fait après f414f31 ne sera plus dans l'histoire de votre master branche.
  • Créez un nouveau commit qui représente exactement le même état du projet que f414f31, mais ajoute simplement cela à l'histoire, donc vous ne perdez pas l'histoire. Vous pouvez le faire en utilisant 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"
    

733
2018-03-02 08:32



ATTENTION: git clean -f va supprimer 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 que vous voulez vraiment 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, où git-clean va supprimer tous les fichiers du répertoire racine suivi qui ne sont pas sous le suivi Git.

Alternativement, comme l'a dit @Paul Betts, vous devriez faire git clean -xdf (Attention cependant - cela supprime tous les fichiers ignorés aussi).


147
2018-03-02 06:48