Acabei de experimentar isso - minha máquina travou enquanto escrevia no repositório Git e ficou corrompida. Corrigi-o da seguinte maneira.
Comecei analisando quantas confirmações não havia enviado ao repositório remoto, assim:
gitk &
Se você não usar esta ferramenta, é muito útil - disponível em todos os sistemas operacionais, tanto quanto eu sei. Isso indicava que meu controle remoto estava faltando dois commits. Portanto, cliquei no rótulo indicando a confirmação remota mais recente (geralmente isso será/remotes/origin/master
) para obter o hash (o hash tem 40 caracteres, mas, por uma questão de brevidade, estou usando 10 aqui - geralmente isso funciona de qualquer maneira).
Aqui está:
14c0fcc9b3
Clico no commit a seguir (ou seja, o primeiro que o controle remoto não possui) e obtenho o hash lá:
04d44c3298
Eu então uso os dois para fazer um patch para esse commit:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Em seguida, fiz o mesmo com o outro commit ausente, ou seja, usei o hash do commit anterior e o hash do próprio commit:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Depois mudei para um novo diretório, clonei o repositório do controle remoto:
git clone git@github.com:username/repo.git
Em seguida, mudei os arquivos de patch para a nova pasta e os apliquei e confirmei com suas mensagens de confirmação exatas (elas podem ser coladas git log
na gitk
janela):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
Isso restaurou as coisas para mim (e observe que provavelmente existe uma maneira mais rápida de fazer isso para um grande número de confirmações). No entanto, eu estava ansioso para ver se a árvore no repositório corrompido pode ser reparada e a resposta é que pode. Com um repositório reparado disponível como acima, execute este comando na pasta quebrada:
git fsck
Você obterá algo como isto:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Para fazer o reparo, eu faria isso na pasta quebrada:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
ou seja, remova o arquivo corrompido e substitua-o por um bom. Você pode ter que fazer isso várias vezes. Finalmente, haverá um ponto em que você pode executarfsck
sem erros. Você provavelmente terá as linhas "dangling commit" e "dangling blob" no relatório, que são uma consequência de suas rebotes e reparações nesta pasta e estão OK. O coletor de lixo os removerá no devido tempo.
Assim (pelo menos no meu caso) uma árvore corrompida não significa que as confirmações não enviadas sejam perdidas.