Restaurar uma pasta excluída em um repositório Git

97

Excluí todo o conteúdo de uma pasta e a pasta está vazia. Eu ainda tinha uma cópia em meu repositório remoto. Mas quando eu fiz um, git pullele não colocou de volta os arquivos excluídos, não deveria fazer isso?

Então eu fiz algumas pesquisas e vi que você pode reverter um arquivo fazendo git checkout <revision> -- <name of file>

Mas isso só funciona em arquivos.

Como posso recuperar todos os arquivos dentro do diretório?

json2021
fonte
1
git statuslhe dará uma dica sobre quais comandos executar
Tavian Barnes
1
Parece que você ainda tem o diretório antigo em seu repo remoto (e pode até tê-lo em seu repo local também). SUGESTÃO FORTE: 1) Faça um "pull" de seu repo remoto para um NOVO (não cause mais danos ao repo local). 2) Tente "verificar" ... ou mesmo "reverter" em seu novo repositório local: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Atualize o repositório remoto quando tiver certeza de que está tudo OK.
paulsm4

Respostas:

244

Tudo o que você pode fazer com um arquivo, também pode fazer com uma pasta.

Observe também como localizar e restaurar um arquivo excluído em um repositório Git


Os arquivos foram excluídos da árvore de trabalho, mas ainda não foram confirmados:

Se você ainda não indexou ( git add) suas alterações, você pode reverter o conteúdo de um diretório:

git checkout -- path/to/folder

Se a exclusão já estiver indexada, você deve redefini-la primeiro:

git reset -- path/to/folder
git checkout -- path/to/folder


Restaure a árvore de trabalho completa (não uma única pasta), mas perca todas as alterações não confirmadas

git reset --hard HEAD


Quando os arquivos são excluídos em algum commit no passado:

Encontre o último commit que afetou o caminho fornecido. Como o arquivo não está no commit HEAD, este commit deve tê-lo excluído.

git rev-list -n 1 HEAD -- <file_path>

Em seguida, verifique a versão no commit antes, usando o ^símbolo circunflexo ( ):

git checkout <deleting_commit>^ -- <file_path>


Restaura a árvore de trabalho completa de um commit distante

git reset --hard <revision> 
Nick Volynkin
fonte
1
git checkout -- path/to/folder/* não funciona Nota: a questão é como restaurar uma pasta, não um arquivo
gman
@gman How can I retrieve all the files inside the directorysignifica o diretório e seus arquivos. Mas o comando surpreendentemente não funciona para mim também. Eu me lembro disso há um ano.
Nick Volynkin
2
@gman mas funciona como git checkout -- pathou git checkout -- 'path/*'. No seu exemplo, você deleta com o git rmque o OP não parece funcionar. Eu adicionei instruções para esse caso. Obrigado!
Nick Volynkin
3
No Windows, você precisa colocar aspas como esta:git checkout "<deleting_commit>^" -- <file_path>
Maor
Ele desempenhou um monte de coisas em todo o repositório, embora eu tenha especificado uma pasta no comando reset. Como isso faz sentido? Quando executei a verificação, parece que restaurou minha pasta. Não tenho ideia do que o unstage fez com o resto do meu código, ah, as alegrias de um gerenciador de repositório ponto a ponto sendo usado para repositórios centralizados, suspiro.
Paul Kenjora
5

Se você ainda não confirmou suas alterações, pode reverter o conteúdo ou um diretório:

git checkout -- removed_directory

Se quiser reverter todas as alterações, faça:

git reset --hard HEAD
Ivan Mushketyk
fonte
3
git checkout -- removed_directory não funciona
gman
git checkout -- removed_directoryfuncionou para mim, mas já criei esse diretório antes (por checkoutum dos arquivos nesse diretório). Após a criação, todos os arquivos foram restaurados na pasta por este comando.
Boolean_Type
3

A única coisa que funcionou para mim foi fazer o checkout do repositório em outra pasta. Suponha que o repositório atual esteja disponível /home/me/current.

Então eu fiz

git clone /home/me/current /home/me/temp

Isso cria um clone separado do repo em /home/me/temp

Agora posso ir /home/me/tempe fazer o que quiser. Por exemplo

git reset --hard commit-hash-before-delete

Agora posso copiar a pasta de arquivo excluída de volta

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

E exclua a pasta temporária

rm -rf /home/me/temp

Os exemplos de

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

NÃO FUNCIONA

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

Outros exemplos como

git reset --hard HEAD

são destrutivos além de apenas os arquivos excluídos. Quaisquer outras alterações também serão perdidas.

similarmente

git reset --hard some-commit

vai perder qualquer commit após some-commit

gman
fonte
2

A partir do git 2.24.0, há um novo comando git experimental: git restore

git restore --staged some/deleted/folder
três
fonte
Ele me mostra git: 'restore' não é um comando git
Ahmed C
2

Você pode restaurar arquivos ou pastas com git restore.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Aqui, master ~ 1 reverte sua pasta para a revisão "1" de volta de seu branch master.

Fonte: https://git-scm.com/docs/git-restore

jBelanger
fonte
0

Se você não especificar um arquivo específico, poderá obter o conteúdo completo de um commit específico. Gostar:git checkout 264794319e9695ba843cd6 (assumindo que o hash tenha todos os seus arquivos no estado correto).

O motivo de pullnão restaurar arquivos é que o git vê suas exclusões como a alteração mais recente, aplicando-as em cima de tudo o que você está puxando.

(Eu recomendo experimentar em um novo branch.)

filósofo perdido
fonte
-1

para exclusões não confirmadas, é tão simples quanto isto:

git reset HEAD rel / path / to / deleted / directory / *

Justadev
fonte