Se um ficheiro desapareceu do seu projeto no Mac antes de ter feito commit, verifique primeiro o Lixo do Mac e qualquer recuperação do Time Machine ou da cloud. Depois, verifique o Git: este pode restaurar um ficheiro eliminado se a versão estiver no índice (index) ou num commit, e pode revelar conteúdo guardado como um objeto inacessível. Se o ficheiro existia apenas como conteúdo não guardado ou não preparado (unstaged) na cópia de trabalho, o Git poderá não ter qualquer cópia. Faça estas verificações antes de criar novos ficheiros no projeto.
1. Verificar o Lixo e pesquisar no Mac
Abra o Lixo a partir da Dock e procure o ficheiro pelo nome. Se o encontrar, clique com a tecla Controlo premida e selecione Repor para o devolver à sua localização original, ou arraste-o para um local seguro. A Apple também recomenda pesquisar com o Spotlight caso o ficheiro tenha sido movido ou renomeado. No caso de uma pasta de projeto no iCloud Drive, consulte também o Lixo e as opções "Apagados recentemente" ou de recuperação de dados do iCloud; a Apple indica que os ficheiros elegíveis apagados do iCloud Drive podem geralmente ser recuperados no prazo de 30 dias. Instruções de recuperação do iCloud da Apple
Se uma ferramenta de desenvolvimento tiver eliminado o ficheiro diretamente, ou se o Lixo tiver sido esvaziado, avance para o passo seguinte. Não assuma que todas as eliminações passam pelo Lixo.
2. Procurar no Time Machine, incluindo instantâneos locais
Se o Time Machine estiver ativado, ligue o disco de cópia de segurança, se disponível. No Finder, abra a pasta que costumava conter o ficheiro, utilize o Spotlight para abrir o Time Machine e, em seguida, navegue pela linha cronológica ou pelas setas da cópia de segurança até uma data anterior à eliminação. Selecione o ficheiro e clique em Restaurar. A Apple indica que os elementos restaurados voltam à sua localização original, pelo que poderá considerar restaurar para uma localização diferente se pretender comparar versões antes de substituir o que quer que seja. Guia da Apple para restaurar elementos do Time Machine
Um disco de cópia de segurança desligado não exclui necessariamente a recuperação. O Time Machine pode utilizar instantâneos locais guardados no Mac, mas estes são temporários: a Apple indica que os instantâneos são geralmente guardados de hora a hora e mantidos durante 24 horas, estando instantâneos adicionais dependentes do espaço disponível. Estes só existem quando o Time Machine está em utilização e não substituem uma cópia de segurança externa. Acerca dos instantâneos locais do Time Machine
3. Restaurar um ficheiro monitorizado a partir do Git
Abra o Terminal, mude para o diretório do projeto e verifique o estado do ficheiro antes de restaurar qualquer elemento:
git status --short
Se o caminho eliminado for apresentado e o ficheiro estiver a ser monitorizado (tracked), restaure-o a partir do índice com o respetivo caminho relativo ao projeto:
git restore -- path/to/file.ext
Isto copia a versão indexada para a árvore de trabalho (working tree). Se o índice não continha o ficheiro, mas ele existe no último commit, restaure a partir de HEAD:
git restore --source=HEAD -- path/to/file.ext
A distinção é importante: o git restore utiliza por predefinição o índice para um restauro na árvore de trabalho; --source=HEAD seleciona explicitamente o último commit. Um restauro substitui o caminho especificado na árvore de trabalho pela versão selecionada, por isso guarde previamente à parte qualquer ficheiro existente nesse local cujo conteúdo seja importante. O Git documenta estas fontes de restauro e o seu comportamento no respetivo manual do git restore.
Estes comandos não conseguem recuperar um ficheiro novo que nunca tenha sido monitorizado (untracked) ou edições que nunca tenham sido preparadas (staged) ou confirmadas (committed). O Git apenas tem conhecimento das versões que chegaram ao seu índice, aos commits ou à base de dados de objetos.
4. Pesquisar objetos inacessíveis do Git como último recurso
Por vezes, o Git armazena o conteúdo de um ficheiro mesmo que nenhum ramo (branch) ou commit aponte para ele — por exemplo, uma versão que foi preparada (staged) e depois removida do índice. A partir do diretório do projeto, inspecione os objetos inacessíveis:
git fsck --unreachable
O Git pode reportar um blob inacessível seguido de um ID de objeto. Para inspecionar um candidato sem alterar o projeto, execute:
git cat-file -p OBJECT_ID
Substitua OBJECT_ID pelo ID indicado. Se o resultado for o ficheiro em falta, redirecione-o para uma cópia de recuperação fora do projeto, por exemplo:
git cat-file -p OBJECT_ID > "$HOME/Desktop/recovered-file.txt"
O nome e a extensão do ficheiro são aqui apenas exemplos; selecione um destino e um nome adequados ao ficheiro. Os blobs do Git armazenam conteúdo e não o caminho original, pelo que poderá ter de inspecionar os candidatos e identificar o nome correto manualmente. O comando git fsck reporta objetos inacessíveis, e a sua opção --lost-found pode gravar o conteúdo dos blobs em .git/lost-found/other/; nenhum dos métodos garante uma versão recuperável. Documentação do git fsck do Git
Quando nenhuma fonte de recuperação tem o ficheiro
Se o Lixo, as cópias de segurança, a recuperação na cloud, o índice do Git, os commits e os objetos inacessíveis do Git não o contiverem, poderá não haver nenhuma cópia disponível através destas ferramentas documentadas. Em particular, um ficheiro não monitorizado que nunca tenha sido preparado (staged) está fora do histórico guardado do Git. Verifique o histórico local próprio do seu editor de texto ou outro serviço de cópia de segurança, caso tenha utilizado algum; a disponibilidade e os passos de recuperação dependem desse produto. Preserve o projeto no estado em que se encontra enquanto investiga e guarde qualquer conteúdo recuperado com um novo nome até confirmar que se trata da versão pretendida.
Fontes
- Se tiver ficheiros em falta no iCloud Drive — Suporte Apple
- Restaurar elementos com cópias de segurança feitas com o Time Machine no Mac — Suporte Apple
- Acerca dos instantâneos locais do Time Machine — Suporte Apple
- git restore — Git
- git fsck — Git