No Git, como posso recuperar um arquivo preparado que foi revertido antes de confirmar?

Eu estava tentando puxar uma mudança no meu repository usando o Git Tower. Quando fiz isso, houve um conflito e, por engano, acertei todos os estágios (como queria confirmar depois de resolver o conflito). Quando o fiz, o conflito se definiu como resolvido.

Eu queria resolver manualmente a mudança, então eu pressionei “Abort Merge”, no entanto, quando eu fiz isso, ele reverteu todas as minhas alterações! Existe alguma maneira de recuperá-los?

Se você tivesse alguma coisa para encenar, provavelmente seria capaz de recuperar isso. (Se você acabou de alterar a cópia de trabalho, você não seria capaz de restaurá-lo.)

Primeiro de tudo: não execute o git gc . Faça backup do seu repository e da cópia de trabalho antes de prosseguir. (Certifique-se de fazer o backup do diretório .git ). Também evite fechar o terminal onde isso aconteceu e / ou reinicializar – se tudo falhar, você terá a chance de encontrar coisas no histórico / memory.

De qualquer forma, a primeira coisa a tentar é:

 git fsck - perdido-encontrado

Vai imprimir algo parecido

 Verificando diretórios de objects: 100% (256/256), pronto.
 Verificando objects: 100% (30165/30165), pronto.
 pendente 8f72c7d79f964b8279da93ca8c05bd685e892756
 dangling commit 4993502a6394491190d3f4d6fb3d1e14019c2e9b

Como você perdeu arquivos preparados e não fez um commit, está interessado em dangling blob inputs de dangling blob .

Execute git show para cada um deles – alguns deles devem ser seus arquivos.

Para expandir a resposta de Alexander com uma alternativa mais simples: sim, se você tiver preparado suas alterações, provavelmente poderá recuperar seus arquivos. Quando você executa git add , os arquivos são realmente adicionados ao database de objects do Git. No momento em que você fizer isso, o git colocará o arquivo no índice:

 % git add bar.txt % git ls-files --stage 100644 ce013625030ba8dba906f756967f9e9ca394464a 0 bar.txt 100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0 foo.txt 

Observe que a input para bar.txt contém o ID do object do arquivo. O Git adicionou o arquivo ao seu database de objects. Neste caso, o Git adicionou-o ao repository como um object solto:

 % ls -Flas .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a 4 -r--r--r-- 1 ethomson staff 21 14 Jun 23:58 .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a 

Esses arquivos serão eventualmente coletados como lixo (então, de fato, não execute explicitamente o git gc ). Felizmente, por padrão, isso acontecerá em questão de meses , não dias. Até que esses arquivos sejam coletados como lixo, você poderá recuperá-los.

A maneira mais fácil de fazer isso é baixar e instalar o programa git-recover no modo interativo:

 % git recover -i Recoverable orphaned git blobs: 61c2562a7b851b69596f0bcad1d8f54c400be977 (Thu 15 Jun 2017 12:20:22 CEST) > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod > tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim > veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea > commodo consequat. Duis aute irure dolor in reprehenderit in voluptate Recover this file? [y,n,v,f,q,?]: 

git-recover procura arquivos no database de objects que não estão consolidados (ou no índice). Você pode descobrir mais sobre o git-recover na postagem do blog que o anuncia .