Git a perdu ses commits

J’essayais de résoudre un problème dans git et j’utilisais accidentellement git reset –hard pour un commit précédent. Alors maintenant je ne peux pas revenir à la vieille tête.

Cependant, j’ai cloné le repository avant de le faire, et j’ai donc renvoyé les commits manquants à l’original. Cela a semblé fonctionner hier, mais aujourd’hui je vois que l’original est toujours bloqué sur un ancien commit et que les nouveaux n’existent apparemment pas. Essayer de repousser les nouveaux commits du clone ne fonctionne plus, car git me dit que tout est à jour.

Comment puis-je réparer ça?

Pour remettre votre HEAD au bon endroit:

  1. git reflog pour obtenir une liste des endroits où HEAD a été récemment.
  2. git show sha1 pour trouver l’endroit que vous voulez que votre tête soit.
  3. Une fois que vous avez trouvé le commit que vous voulez, git merge pour ramener votre master au bon endroit.

Quelques explications: Dans un commit git il n’y a rien qui pointe sur celui que l’on commet après celui-ci. Lorsque vous réinitialisez le HEAD, vous l’avez dirigé vers un ancien commit. Votre ancien chef est en train de balancer sans rien montrer.

Nous utilisons le reflog pour voir où HEAD a été récemment. Une fois que vous êtes revenu à l’endroit où vous le souhaitez, vous pointez le maître, ou un autre, vers cet endroit et tout va bien!

Je l’ai fait un peu différemment. J’ai fait…

 git reflog 3bd79d2 HEAD@{2}: checkout: moving from edbfb06528c43586a0e0e10a73051e06980b9281 to master edbfb06 HEAD@{3}: commit: added general comments for rubric f8ca172 HEAD@{4}: checkout: moving from 904d63bf08f6f6b1494bfa473b158b9509b18423 to 904d63b HEAD@{10}: commit: updated results page and csv 933f2a6 HEAD@{11}: commit: updates f56e6cd HEAD@{12}: clone: from [email protected]:xxxx.git 

… dans ce cas, mon “commentaire général ajouté pour la rubrique” était le commit que j’ai perdu. Maintenant que j’ai l’ID de validation, j’ai utilisé cherry-pick pour le récupérer …

 git cherry-pick edbfb06 

Vous ne devriez pas avoir à pousser quoi que ce soit depuis un autre repo après un git reset --hard .

git reflog devrait vous permettre de localiser les commits perdus (qui sont en fait non référencés, mais toujours présents dans votre repository Git, par défaut jusqu’à 90 jours: voir git config gc.reflogexpire . Vous pouvez même vous assurer qu’il n’expire jamais si vous le voulez vraiment) ).
Voir par exemple Annuler une git reset --hard HEAD~1 ou restore – git reset --hard HEAD^ comme exemples.

Essayez de taper git fetch pour obtenir le référentiel mis à jour