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:
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}
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.
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.
--hard
! Le risque d'exécuter accidentellement cette commande est beaucoup plus élevé. Par exemple, vous souhaitez supprimer un seul fichier avecgit 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 à lagit reset foo-branch
place. VoilàRéponses:
Réponse courte:
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:
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:La première ligne indique qu'il y a
HEAD
0 positions (en d'autres termes, la position actuelle) est 3f6db14; il a été obtenu en remettant à zéroHEAD~
. La deuxième ligne indique qu'il y aHEAD
1 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écutezgit reset HEAD@{1}
(ougit 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
reflog
branche spécifique que vous souhaitez annuler la réinitialisation, par exemple maître, plutôt queHEAD
:Cela devrait avoir moins de bruit que le général
HEAD reflog
.la source
reflog
cet effet, j'aime utilisergit log --graph --decorate --oneline $(git rev-list -g --all)
. Il montre un arbre de tous les commits, y compris les branches sans nom pendantesgit init
, puis juste aprèsgit 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?git add
(c'est-à-dire que vous n'avez jamais mis en scène cette version du fichier), alorsgit checkout
ougit reset --hard
allez emporter la seule copie (le répertoire de travail) sans sauvegarde. Je souhaite que non.git reset HEAD~12
oups ...git reset HEAD@{12}
nooo .. 'git reflog' à la rescousse! oh c'est justegit reset HEAD@{1}
Ancienne question, et les réponses publiées fonctionnent très bien. Je jouerai avec une autre option.
git reset ORIG_HEAD
ORIG_HEAD
fait référence au commitHEAD
précédemment référencé.la source
git reset ORIG_HEAD
? Merci.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
vous devriez donc pouvoir faire
Mais si vous avez fait git reset en utilisant
vous devrez faire
As {N} représente le nombre d'opérations dans Reflog. Comme l'a souligné Mark dans les commentaires.
la source
reflog
commande 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.1.Utilisez
git reflog
pour obtenir la mise à jour de toutes les références.2.
git reset <id_of_commit_to_which_you_want_restore>
la source