12
votes

Perdu la dernière git commit

J'ai perdu ma dernière commission parce que j'ai accidentellement couru "git reset --hard tête ^". Remarque: je ne voulais pas mettre le "^" à la fin.

Y a-t-il un moyen de le récupérer? C'était 2 jours de travail: (


3 commentaires

Dans tous les cas, n'utilisez pas Git GC GC. Cela supprimera les commits non liés de manière permanente.


Non, gc sera pas perdre ce commit à moins que vous ne soyez pas sorti de votre façon de faciliter la possibilité d'oublier vos engagements (désactivation ou taille de manière agressive). Toute personne qui a passé suffisamment de temps pour apprendre à configurer Git pour perdre son plus récent commettre aurait au moins savoir ne pas poser la question.


Git GC Par défaut Ne supprimez pas les engagements non liés si elles sont dans le reflogue jusqu'à 30 jours dans le cas de commits non référencés (par défaut).


3 Réponses :


7
votes

Si vous connaissez l'ID de validation (par exemple, faites défiler par exemple sur votre terminal ou utilisez git reflog ), xxx

> où 61567DE5D9 sont les premiers chiffres du dernier ( perdu) commit.


0 commentaires

26
votes

Je pense que Cet article est ce que vous recherchez. Selon l'article, votre commit est "parti" mais pas les ordures recueillies - une sorte de corbeille de recyclage dans Windows.

vous exécutez git fsck -lost-trouvé-trouvé pour trouver "Dangling COMMIT" et le regarder avec git reflog , puis fusionner la validation pendante avec votre actuel Branche, git fusion 7c61179 .


2 commentaires

Merci. Ça l'a fait. Je savais que c'était juste flottant là-bas quelque part, non mélangé de la branche.


En combinaison avec DiffutoTool, j'ai résolu mon problème de "Bust Lost": Git FSCK - TRUCT-TRONS-CONTRÔLÉ (DANNGLING COMMIT LES HASHES SONT AFFÉRÉS) GIT DIFFTOOL ONES_HASH ONFLYFEDER / (J'ai essayé tous les engagements dangereux, jusqu'à ce que j'ai trouvé le nécessaire))



22
votes

Git rend vraiment facile de revenir à un état antérieur et qui fonctionne très fort pour vous empêcher de perdre toutes les données que vous avez commises. C'est cette raison que vous devriez vous engager souvent. J'ai une commande git corbeille qui fait que git reset --hard état, mais après avoir écrit un commit afin que je puisse annuler la réinitialisation matérielle si j'ai besoin. < / p>

pour l'état le plus récent (c'est-à-dire votre cas exact), juste faire git reset --hardig_head pour annuler ce que vous venez de faire.

Vous pouvez effectuer une réinitialisation de temps basée sur le temps : git reset --hard '@ {5 minutes il y a}' Pour vous mettre dans un état précédent en fonction de l'heure ( Il y a beaucoup d'options que vous pouvez utiliser, par exemple, git reset --hard '@ {hier}' pour prétendre aujourd'hui jamais arrivé).

sinon , parcourez la sortie reflog pour trouver la chose avant l'action que vous ressentez dans un mauvais état et réinitialisez-la.


1 commentaires

Plus général, vous pouvez utiliser @ {1} ou tête @ {1} au lieu de orig_head .