Mon dépôt git est en quelque sorte devenu bancal - j'ai chargé msysgit ce matin et au lieu que le nom de la branche soit affiché après le répertoire actuel, il dit "((ref: re ...))", 'git status' signale tout comme un nouveau fichier, 'git log' et 'git reflog' me disent "fatal: mauvaise révision par défaut" HEAD "", et ainsi de suite.
Faire 'git reflog --all' ou 'gitk --all' me montre que le reste du dépôt est intact, mais il semble que la branche sur laquelle je travaillais vient de disparaître, ce qui explique pourquoi HEAD ne semble pas exister / pointer vers quoi que ce soit.
Je sais que git conserve toutes sortes de globes d'informations, et je suppose que mes commits viennent d'être orphelins, alors y a-t-il une commande qui me montrera ces commits afin que je puisse réinitialiser HEAD?
EDIT: Oh mon Dieu. J'ai découvert 'git fsck', et 'git fsck --full' signale "fatal: object 03ca4 ... is corrupted". Que diable puis-je faire à ce sujet?
EDIT: Oh cher oh cher. J'ai vérifié une autre branche, puis j'ai essayé de recréer la branche d'origine avec le même nom en utilisant 'git checkout -b lostbranchname', et git dit "erreur: impossible de résoudre les références / heads / lostbranchname: aucune erreur, fatal: échec pour verrouiller ref pour la mise à jour: Aucune erreur ". «Aucune erreur» doit être une erreur particulièrement désagréable. Il semble donc qu'il traîne toujours, mais qu'il ne peut pas être utilisé et qu'il ne peut pas être tué.
EDIT: Super duper oh cher. J'ai fait un tas de déballage, de reconditionnement et de remplacement de choses comme suggéré ici: Comment récupérer des objets Git endommagés par une panne de disque dur? , mais maintenant je reçois un autre hachage signalé comme corrompu, pour quelque chose d'aussi inoffensif que «git status». Je pense que tout est arrosé. Git est adorable et tout, mais je ne devrais pas avoir à faire face à ce genre de chose.
git checkout -b lostbranchname
- si vous ne vous souciez que du nom de la branche (pas du contenu de celle-ci), vous pouvez supprimer (ou renommer) manuellement.git/refs/heads/lostbranchname
- cela fera, espérons-le, l'affaire.Réponses:
Plutôt que de laisser cela ouvert, je pense que je vais donner une réponse à ma propre question. L'utilisation
git reflog --all
est un bon moyen de parcourir les commits orphelins - et en utilisant les hachages SHA1 à partir de là, vous pouvez reconstruire l'historique.Dans mon cas cependant, le référentiel était corrompu donc cela n'a pas aidé;
git fsck
peut vous aider à trouver et parfois à corriger les erreurs dans le référentiel lui-même.la source
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(modifier: imaginez ces doubles backticks où les simples - échapper ne semble pas fonctionner ici)Avec git 2.9.x / 2.10 (Q3 2016), vous n'aurez plus à utiliser
git reflog --all
,git reflog
cela suffira.Voir commit 71abeb7 (03 juin 2016) par SZEDER Gábor (
szeder
) .(Fusionné par Junio C Hamano -
gitster
- in commit 7949837 , 06 juil 2016)la source
Une bonne caractéristique de git est qu'il détecte la corruption. Cependant, il n'inclut pas de correction d'erreur pour se protéger de la corruption.
J'espère que vous avez poussé le contenu de ce référentiel sur une autre machine ou que vous avez des sauvegardes pour récupérer les parties corrompues.
Je n'ai aucune expérience avec git sous windows mais je n'ai jamais vu ce genre de comportement avec git sous Linux ou OS X.
la source
Je trouve généralement la
git reflog
sortie déroutante. Il est beaucoup plus facile pour moi de comprendre un graphe de commit à partir degit log --graph --reflog
. Le remplacement du format pour afficher uniquement les résumés de validation peut également faciliter le suivi du graphique:De là, il est clair que
e3124bf
et6a7a52e
sont des orphelins non référencés, et il y a le contexte de leurs commits ancêtres.la source
git reflog --all
ne les montre pas, avecgit log --graph --reflog
ils étaient très visibles ...