Comment annuler 'git reset'?


1314

Quelle est la manière la plus simple d'annuler le

git reset HEAD~

commander? Actuellement, la seule façon dont je peux penser est de faire un "git clone http: // ..." à partir d'un dépôt distant.


2
Si quelqu'un cherche comment annuler une réinitialisation matérielle, consultez Annuler une réinitialisation git --hard HEAD ~ 1 . Les solutions sont très similaires.


2
Ce n'est pas un double des questions liées à --hard! Le risque d'exécuter accidentellement cette commande est beaucoup plus élevé. Par exemple, vous souhaitez supprimer un seul fichier avec git reset foo-file. Vous écrivez uniquement la première partie du nom de fichier, appuyez sur l'onglet pour la saisie semi-automatique, il se termine en fait par un nom de branche, vous ne le remarquez pas et exécutez la commande à la git reset foo-branchplace. Voilà
Yushin Washio

Réponses:


2391

Réponse courte:

git reset 'HEAD@{1}'

Longue réponse:

Git conserve un journal de toutes les mises à jour de référence (par exemple, extraction, réinitialisation, validation, fusion). Vous pouvez le voir en tapant:

git reflog

Quelque part dans cette liste se trouve le commit que vous avez perdu. Disons que vous venez de taper git reset HEAD~et que vous souhaitez l'annuler. Mon reflog ressemble à ceci:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

La première ligne indique qu'il y a HEAD0 positions (en d'autres termes, la position actuelle) est 3f6db14; il a été obtenu en remettant à zéro HEAD~. La deuxième ligne indique qu'il y a HEAD1 position (en d'autres termes, l'état avant la réinitialisation) est d27924e. Il a été obtenu en vérifiant un commit particulier (bien que ce ne soit pas important pour le moment). Donc, pour annuler la réinitialisation, exécutez git reset HEAD@{1}(ou git reset d27924e).

Si, d'autre part, vous avez exécuté d'autres commandes depuis cette mise à jour de HEAD, la validation que vous souhaitez ne sera pas en haut de la liste, et vous devrez rechercher dans le reflog.

Une dernière remarque: il peut être plus facile de rechercher la reflogbranche spécifique que vous souhaitez annuler la réinitialisation, par exemple maître, plutôt que HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Cela devrait avoir moins de bruit que le général HEAD reflog.


25
Comme une alternative plus visuelle et plus agréable à reflogcet effet, j'aime utiliser git log --graph --decorate --oneline $(git rev-list -g --all). Il montre un arbre de tous les commits, y compris les branches sans nom pendantes
texasflood

1
Disons que j'ai un répertoire contenant des fichiers existants. Dans ce répertoire, je cours git init, puis juste après git reset --hard. Il n'y a pas de reflog, ni même de journaux pour commencer. Ces fichiers sont-ils à peu près dorés maintenant?
AlanSE

@AlanSE, malheureusement, ces fichiers sont des toasts, autant que je sache. Si vous ne l'avez jamais fait git add(c'est-à-dire que vous n'avez jamais mis en scène cette version du fichier), alors git checkoutou git reset --hardallez emporter la seule copie (le répertoire de travail) sans sauvegarde. Je souhaite que non.
Mark Lodato

2
git reset HEAD~12oups ... git reset HEAD@{12}nooo .. 'git reflog' à la rescousse! oh c'est justegit reset HEAD@{1}
Dennis

Après avoir lu l'excellent article git-scm.com/blog/2011/07/11/reset.html git-reset, je suis un peu moins mystifié.
Andriy Drozdyuk

192

Ancienne question, et les réponses publiées fonctionnent très bien. Je jouerai avec une autre option.

git reset ORIG_HEAD

ORIG_HEADfait référence au commit HEADprécédemment référencé.


1
Cela semble génial - seriez-vous en mesure de préciser? Est-ce que "ORIG" ici est l'abréviation de "original" ou "origine"? … C'est-à-dire, est-ce qu'il se réinitialise à l'endroit où se trouvait HEAD avant de commencer à jouer avec lui? Ou à l'endroit où HEAD est à l'origine? Que se passe-t-il si vous avez déplacé HEAD plusieurs fois avant le git reset ORIG_HEAD? Merci.
Benjohn

ORIG signifie original, ORIG_HEAD signifie HEAD original, avant la réinitialisation
Sam Gallagher

"Certaines opérations, telles que la fusion et la réinitialisation, enregistrent la version précédente de HEAD dans ORIG_HEAD juste avant de l'ajuster à une nouvelle valeur. Vous pouvez utiliser ORIG_HEAD pour récupérer ou revenir à l'état précédent ou pour faire une comparaison." Extrait du livre: "Version Control with Git"
Amirreza

56

Ma situation était légèrement différente, je l'ai fait git reset HEAD~trois fois.

Pour le défaire, je devais le faire

git reset HEAD@{3}

vous devriez donc pouvoir faire

git reset HEAD@{N}

Mais si vous avez fait git reset en utilisant

git reset HEAD~3

vous devrez faire

git reset HEAD@{1}

As {N} représente le nombre d'opérations dans Reflog. Comme l'a souligné Mark dans les commentaires.


2
L'option acceptée ne fournit pas d'exemple pour aller de l'avant NI était dans une situation il y a une heure où je voulais faire suivre plus de 1. J'ai essayé plusieurs fois et cela a fonctionné. Je voulais ajouter cela ici. Sera utile pour ceux qui recherchent une réinitialisation avec git reset HEAD ~ 3
zainengineer

3
mais si quelqu'un a fait git reset HEAD ~ 3, il peut rapidement voir comment l'annuler, git reset HEAD @ {3} est requis sans entrer dans le reflog git reset HEAD ~ 3 etc est une situation courante
zainengineer

1
Je pense que quiconque voit {1} / {2} se rendrait compte que le numéro pourrait être n'importe quel numéro de révision, que la reflogcommande vous fournit. Je suis d'accord pour dire que votre argument selon lequel les chiffres sont les mêmes pour l'une ou l'autre direction ~ 3 / @ {3} mais n'a pas vraiment besoin d'être une nouvelle réponse.
Clint

30

1.Utilisez git reflogpour obtenir la mise à jour de toutes les références.

2.git reset <id_of_commit_to_which_you_want_restore>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.