Ramificação mestre corrompida do Git


9

Abro meu repositório Git usando gitExtensions no Windows 7 para um projeto do Visual Studio. De repente está vazio. O repositório existe, mas todos os meus commits desapareceram.

Estou usando a interface gráfica e acredito que seja a primeira vez que a abri desde que a atualizou.

Não sei o que fazer para recuperar meus commits.

Quando digito

git log 

eu recebi

fatal: revisão padrão incorreta 'HEAD'

Atualização
Depois de olhar para /programming/1545407/recovering-broken-git-repository, tentei

git fsck

retornou:

erro:
fatal HEAD inválido : o objeto solto 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (armazenado em .git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31) está corrompido

Confirmar retornos:

erro: incapaz de resolver a referência HEAD: Nenhum arquivo ou diretório
fatal: não é possível bloquear HEAD ref

e registrando devoluções de ramificações principais

$ git log master warning: ignorando ref refs / heads / master quebrados. aviso: ignorando ref refs / heads / master quebrados. fatal: argumento ambíguo 'mestre': revisão desconhecida ou caminho que não está na árvore de trabalho. Use '-' para separar caminhos das revisões

Vou continuar colando coisas que podem ser relevantes

Aviso principal do $ git reflog
: ignorando ref refs / heads / master quebrados.
aviso: ignorando ref refs / heads / master quebrados.
fatal: argumento ambíguo 'mestre': revisão desconhecida ou caminho que não está na árvore de trabalho.
Use '-' para separar caminhos das revisões

Informações possivelmente mais úteis: toda vez que eu apago o arquivo corrompido, outro ocorre. Estou começando a pensar que é algo a ver com o ramo principal apontando para a coisa errada ou algo assim. porque eu assumo que a cabeça está apontando para o mestre.

Um dia depois:
então eu coloquei meu companheiro nisso, ele foi capaz de examinar os logs e disse que os hashes nos logs não correspondem aos objetos da pasta. Ele tentou redefinir a ramificação principal para os logs ou algo assim, fiquei um pouco perdido. Espero que seja útil



11
@heavyd verifique a atualização
— MrJD 9/12

Respostas:


3

O repositório existe, mas todos os meus commits desapareceram.

O que exatamente você quer dizer? A árvore de trabalho ainda está lá? Existe .git/? Existem arquivos nele?

As mensagens que você postou sugerem que o arquivo .git/HEADnão existe. Ele define o estado esperado da árvore de trabalho (o que você fez check-out). Se esse arquivo desapareceu, o git não sabe onde você estava.

Você pode tentar criar o arquivo você mesmo, com este conteúdo: ref: refs/heads/master

Se você estava em uma ramificação diferente, substitua "master" pelo nome da ramificação. Se você não estivesse em um galho, seria mais complicado.

.git/logs/HEADregistra estados passados ​​de HEAD, com linhas posteriores na parte inferior. Esta linha de exemplo mostra um checkout: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

Os SHA1s na frente referem-se a confirmações. Você deve encontrá-los no log de ramificação, por exemplo .git/logs/refs/heads/master.

Também refs/heads/masterestá faltando a saída do git reflog que você forneceu . Seu único conteúdo deve ser o SHA1 da confirmação mais recente (e uma nova linha). Você pode encontrar o SHA1 mais recente no final do log da filial, por exemplo .git/logs/refs/heads/master.


2

Se .git / HEAD existe e seu conteúdo é ref: refs/heads/masterverificado no arquivo refs / heads / master, ele deve conter o sha1 da última confirmação.

Se esse arquivo estiver corrompido e cheio de caracteres NULL Edite esse arquivo e coloque o sha1 da confirmação mais recente .git/logs/HEADou a anterior à última confirmação.

Então faça git reset --hard 'sha1 of the commit that you selected'


ele estava cheio de caracteres NULL, então coloquei o sha1 do commit anterior, mas a redefinição do git resultou em "error: update_ref falhou para ref 'HEAD': não é possível bloquear ref 'HEAD': não é possível resolver a referência HEAD: argumento inválido "
— fantabolous 14/12

1

Parece que seu repositório foi corrompido. A coisa mais fácil a fazer seria recuperar seu repositório de um backup ou cloná-lo novamente da fonte original (supondo que você não tenha muito trabalho no repositório).

Se a redefinição / clonagem não for uma opção, eu recomendaria a leitura no Pro Git (livro on-line gratuito ou versão em papel ). O livro inteiro é muito informativo, mas especialmente dê uma olhada no último capítulo para entender como o Git funciona internamente. Depois de entender como o Git funciona, consulte as instruções de Linus sobre a recuperação de objetos corrompidos .


Então, infelizmente, eu não estava fazendo backup de arquivos ocultos, o .git estava oculto. Eu realmente não tenho tempo suficiente para ler um livro inteiro, há algo que você acha que eu poderia tentar?
— MrJD

"Ler um livro sobre os internos" pode ser um bom conselho geral, mas não ajuda a resolver o problema específico e a questão em questão.
— 22912 Burhan Ali

0

Depois de navegar na web por um tempo, finalmente encontrei isso e funcionou.

git fetch origin
git reset --hard origin/master

Isso obtém qualquer alteração origin(espero que não seja muito trabalho feito localmente) e força a masterfilial local a concordar com o controle remoto. Cuidado, --resetmeios descartar quaisquer alterações locais! Além disso, se não estivesse muito quebrado, apenas git reset origin/masterteria restaurado o último estado conhecido (registrado) da masterramificação.
— vonbrand 20/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.