Comment puis-je utiliser' git reset --hard HEAD ' pour revenir à une propagation précédente? [dupliquer]

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

je sais que Git trace les changements que je fais à mon application, et il s'accroche à eux jusqu'à ce que je commette les changements, mais voici où je suis accroché:

quand je veux revenir à une commit précédente j'utilise:

git reset --hard HEAD

et git returns:

HEAD is now at 820f417 micro

Comment puis-je retourner les fichiers de mon disque dur à la propagation précédente?

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 de bien ou de mal?

678
demandé sur PeeHaa 2012-03-02 10:36:06
la source

2 ответов

tout d'abord, il est toujours intéressant de noter que git reset --hard est une commande potentiellement dangereuse, car elle jette tous vos changements non engagés. Pour plus de sécurité, vous devriez toujours vérifier que la sortie de git status est propre (qui est vide) avant de l'utiliser.

vous dites D'abord ce qui suit:

donc je sais que Git trace les changements que je fais à mon application, et il s'accroche à eux jusqu'à ce que je commette les changements, mais voici où je suis accroché:

c'est incorrect. Git n'enregistre l'état des fichiers que 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 d'ici là Git n'est pas vraiment "suivi des changements" dans vos fichiers. (par exemple, même si vous faites git add pour mettre en scène une nouvelle version du fichier, qui remplace la version précédemment mise en scène de ce fichier dans la zone de transit.)

dans votre question, vous posez ensuite la question suivante:

quand je veux revenir à une commit précédente j'utilise: git reset -- dur HEAD and git returns: HEAD is now at 820f417 micro

Comment puis-je retourner les fichiers de mon disque dur à la propagation précédente?

Si vous n' git reset --hard <SOME-COMMIT> puis Git:

  • Faites votre branche actuelle (typiquement master ) retour au point <SOME-COMMIT> .
  • faites ensuite les fichiers de votre arborescence de travail et de l'index ("staging area") les mêmes que les versions engagées dans <SOME-COMMIT> .

HEAD pointe sur votre branche actuelle (ou current commit), donc tout ce que git reset --hard HEAD va faire est de jeter tous les changements non engagés que vous avez.

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

  • changez votre branche actuelle pour pointer vers l'ancienne commit à la place. Vous pouvez faire ça avec git reset --hard f414f31 . Cependant, ceci est en train de réécrire l'histoire de votre branche, donc vous devriez l'éviter si vous avez partagé cette branche avec quelqu'un. Aussi, les changements que vous avez fait après f414f31 ne sera plus dans l'histoire de votre branche master .
  • créer un nouveau commit qui représente exactement le même état du projet que f414f31 , mais ajoute juste cela à l'histoire, pour que vous ne perdiez pas d'histoire. Vous pouvez faire cela en utilisant les étapes suggérées dans cette réponse - quelque chose comme:

    git reset --hard f414f31
    git reset --soft [email protected]{1}
    git commit -m "Reverting to the state of the project at f414f31"
    
764
répondu Mark Longair 2018-09-10 22:06:43
la source

AVERTISSEMENT: git clean -f sera à retirer sans traces de fichiers, ce qui signifie qu'ils sont partis pour de bon, car ils ne sont pas stockées dans le référentiel. Assurez-vous que vous voulez vraiment supprimer tous les fichiers non tracés avant de faire cela.


Essayer cela et voir git clean -f .

git reset --hard ne supprimera pas les fichiers non tracés, où comme git-clean supprimera tous les fichiers du répertoire racine suivi qui ne sont pas sous Git de suivi.

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

154
répondu uday 2017-08-16 23:27:29
la source

Autres questions sur git git-reset git-revert head