Meu repositório git de alguma forma ficou instável - carreguei o msysgit esta manhã e em vez de o nome do branch ser mostrado após o diretório atual, ele diz "((ref: re ...))", 'git status' relata tudo como um novo arquivo, 'git log' e 'git reflog' me dizem "fatal: revisão padrão inválida 'HEAD'" e assim por diante.
Fazer 'git reflog --all' ou 'gitk --all' mostra que o resto do repositório está intacto, mas parece que o branch em que eu estava trabalhando simplesmente desapareceu, o que explica por que HEAD parece não existir / apontar para qualquer coisa.
Eu sei que o git mantém controle de todos os tipos de informações, e estou assumindo que meus commits ficaram órfãos de alguma forma, então existe algum comando que vai me mostrar esses commits para que eu possa redefinir HEAD para eles?
EDIT: Oh querido. Eu descobri 'git fsck' e 'git fsck --full' reporta "fatal: objeto 03ca4 ... está corrompido". O que diabos posso fazer sobre isso?
EDIT: Oh querido, querido. Eu verifiquei outro branch e tentei recriar o branch original com o mesmo nome usando 'git checkout -b lostbranchname' e git diz "erro: não foi possível resolver referência refs / heads / lostbranchname: Sem erro, fatal: Falha para bloquear ref para atualização: Sem erro ". 'Nenhum erro' deve ser um erro particularmente desagradável. Portanto, parece que ainda está por aí, mas incapaz de ser usado e incapaz de ser morto.
EDIT: Super duper oh querido. Eu fiz um monte de desempacotamento, reembalagem e substituição de coisas como sugerido aqui: Como recuperar objetos Git danificados por falha no disco rígido? , mas agora estou recebendo outro hash relatado como corrompido, para algo tão inócuo como 'status git'. Acho que a coisa toda está bloqueada. Git é adorável e tudo, mas eu não deveria ter que lidar com esse tipo de coisa.
git checkout -b lostbranchname
- se você só se preocupa com o nome do branch (não com o conteúdo dele), você pode excluí-lo (ou renomear) manualmente.git/refs/heads/lostbranchname
- esperançosamente, isso resolverá o problema.Respostas:
Em vez de deixar isso em aberto, acho que darei uma resposta à minha própria pergunta. Usar
git reflog --all
é uma boa maneira de navegar pelos commits órfãos - e usar os hashes SHA1 deles você pode reconstruir o histórico.No meu caso, porém, o repositório foi corrompido, então isso não ajudou;
git fsck
pode ajudá-lo a encontrar e às vezes corrigir erros no próprio repositório.fonte
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(editar: imagine aqueles crases duplos em que os únicos - escapar não parece funcionar aqui)Com git 2.9.x / 2.10 (Q3 2016), você não terá que usar
git reflog --all
mais,git reflog
será o suficiente.Ver commit 71abeb7 (03 jun 2016) de SZEDER Gábor (
szeder
) .(Incorporado por Junio C Hamano -
gitster
- no commit 7949837 , 06 de julho de 2016)fonte
Um bom recurso do git é que ele detecta corrupção. No entanto, não inclui correção de erros para proteger contra corrupção.
Espero que você tenha enviado o conteúdo deste repositório para outra máquina ou que tenha backups para recuperar as partes corrompidas.
Não tenho nenhuma experiência com git no windows, mas nunca vi esse tipo de comportamento com git no Linux ou OS X.
fonte
Normalmente acho a
git reflog
saída confusa. É muito mais fácil para mim entender um gráfico de confirmação dogit log --graph --reflog
. Substituir o formato para mostrar apenas resumos de commits também pode tornar o gráfico mais fácil de seguir:Disto está claro que
e3124bf
e6a7a52e
são órfãos não referenciados, e há contexto de seus commits ancestrais.fonte
git reflog --all
não os mostra, comgit log --graph --reflog
eles eram muito visíveis ...