130 votes

Annulation de git reset --hard avec des fichiers non validés dans la zone de transit

J'essaie de récupérer mon travail. J'ai bêtement fait git reset --hard mais avant cela, je n'ai fait que get add . et n'a pas fait git commit . Aidez-moi ! Voici mon journal :

MacBookPro:api user$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)

#   modified:   .gitignore
...

MacBookPro:api user$ git reset --hard
HEAD is now at ff546fa added new strucuture for api

Est-il possible d'annuler git reset --hard dans cette situation ?

0 votes

@MarkLongair génial mec ! Tu viens de récupérer mon travail ! J'ai écrit un script Python pour créer des fichiers de toutes les sorties ! Je vais ajouter le script comme réponse

6 votes

Pas "stupidement"... mais "naïvement"... parce que je viens de faire la même chose !

0 votes

Cela pourrait encore être stupidement ;-)

5voto

olange Points 95

J'ai rencontré le même problème, mais je n'avais pas ajouté les modifications à l'index. Donc toutes les commandes ci-dessus ne m'ont pas ramené les changements souhaités.

Après toutes les réponses élaborées ci-dessus, il s'agit d'un conseil naïf, mais peut-être que cela sauvera quelqu'un qui n'y a pas pensé avant, comme je l'ai fait.

En désespoir de cause, j'ai essayé d'appuyer sur CTRL-Z dans mon éditeur (LightTable), une fois dans chaque onglet ouvert - ce qui a heureusement permis de récupérer le fichier dans cet onglet, dans son dernier état avant l'incident. git reset --hard . HTH.

1 votes

Exactement la même situation, j'ai manqué d'ajouter dans l'index et j'ai fait une réinitialisation dure et aucune des solutions n'a fonctionné. Cette fois-ci, c'était une décision intelligente, merci d'avoir fait Ctrl+Z et sauvé ma journée. Mon éditeur : SublimeText. Un grand bravo de ma part !

2voto

Lolo Points 1295

Bonté divine, je me suis arraché les cheveux jusqu'à ce que je tombe sur cette question et ses réponses. Je crois que la réponse correcte et succincte à la question posée n'est disponible que si vous rassemblez deux des commentaires ci-dessus, alors la voici en un seul endroit :

  1. Comme mentionné par chilicuil, exécutez git reflog pour identifier là-dedans le le hash de validation que vous voulez renvoyer à

  2. Comme mentionné par akimsko, vous ne voudrez probablement PAS faire de cherry picking à moins que vous ne perdiez qu'un seul commit, vous devriez alors exécuter git reset --hard <hash-commit-you-want>

Note pour les utilisateurs d'egit Eclipse : Je n'ai pas trouvé de moyen d'effectuer ces étapes dans Eclipse avec egit. Fermer Eclipse, exécuter les commandes ci-dessus à partir d'une fenêtre de terminal, puis rouvrir Eclipse a bien fonctionné pour moi.

0 votes

Vous m'avez beaucoup sauvé, merci beaucoup.

2voto

abyrd Points 346

Si vous éditez vos fichiers avec un IDE, celui-ci peut également conserver son propre historique indépendamment de Git. Dans certaines circonstances, il est beaucoup plus simple de contourner entièrement Git et d'utiliser l'EDI. Par exemple, IntelliJ IDEA et Eclipse ont tous deux ce type de contrôle de version local automatisé, qu'ils appellent "historique local". Dans IntelliJ, il est facile de récupérer un lot entier de modifications perdues dans de nombreux fichiers : dans le volet Projet, vous pouvez cliquer avec le bouton droit de la souris sur un projet entier ou une arborescence de répertoires et sélectionner Afficher l'historique dans le sous-menu Historique local. Le site git reset --hard devrait apparaître dans la liste comme une "modification externe" (c'est-à-dire déclenchée depuis l'extérieur de l'IDE), et vous pouvez utiliser le bouton "Revert" ou l'élément de menu contextuel pour tout rétablir à l'état précédant la modification externe.

1voto

ddoty Points 33

C'est probablement évident pour les professionnels de Git, mais je tenais à le signaler, car lors de mes recherches frénétiques, je n'ai pas vu cette question soulevée.

J'ai mis en scène quelques fichiers, et fait un git reset --hard J'ai un peu paniqué, puis j'ai remarqué que mon statut indiquait que tous mes fichiers étaient toujours organisés et que toutes leurs suppressions n'étaient pas organisées.

À ce stade, vous pouvez valider les modifications mises en scène, tant que vous ne mettez pas en scène leurs suppressions. Après cela, il ne vous reste plus qu'à trouver le courage de faire git reset --hard une fois de plus, ce qui vous ramènera aux changements que vous aviez mis en place et que vous venez de valider.

Encore une fois, ce n'est probablement rien de nouveau pour la plupart des gens, mais j'espère que puisque cela m'a aidé et que je n'ai rien trouvé qui le suggère, cela pourrait aider quelqu'un d'autre.

1voto

Confusion Points 6056

Si vous avez récemment examiné un git diff il existe un autre moyen de se remettre d'un tel incident, même si vous n'avez pas encore mis en place les modifications : si la sortie de la commande git diff est toujours dans votre tampon de console, vous pouvez simplement faire défiler vers le haut, copier-coller la différence dans un fichier et utiliser la commande patch pour appliquer la différence à votre arbre : patch -p0 < file . Cette approche m'a sauvé plusieurs fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X