Digamos que eu esteja em um repositório Git. Excluo um arquivo e confirmo essa alteração. Continuo trabalhando e faço mais algumas confirmações. Então, acho que preciso restaurar esse arquivo.
Sei que posso fazer check-out de um arquivo usando git checkout HEAD^ foo.bar
, mas realmente não sei quando esse arquivo foi excluído.
- Qual seria a maneira mais rápida de encontrar a confirmação que excluiu um determinado nome de arquivo?
- Qual seria a maneira mais fácil de recuperar esse arquivo na minha cópia de trabalho?
Espero não ter que procurar meus logs manualmente, fazer check-out de todo o projeto para um determinado SHA e copiar manualmente esse arquivo no check-out do projeto original.
git
file-io
git-checkout
avdgaag
fonte
fonte
git log --diff-filter=D -- path/to/file
git checkout deletedFile
cancelará a exclusãodeletedFile
se tiver sido excluído, mas essa exclusão ainda não foi realizada ou confirmada . Não é isso que a pergunta aqui está pedindo; Esta pergunta é sobre como restaurar um arquivo cuja exclusão foi confirmada há muitos commits atrás.Respostas:
Encontre a última confirmação que afetou o caminho especificado. Como o arquivo não está no commit HEAD, esse commit deve ter excluído.
Em seguida, faça o check-out da versão no commit antes, usando o
^
símbolo caret ( ):Ou em um comando, se
$file
é o arquivo em questão.Se você estiver usando zsh e tiver a opção EXTENDED_GLOB ativada, o símbolo de sinal de intercalação não funcionará. Você pode usar em seu
~1
lugar.fonte
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Eu mudei para o bash e funcionou bem.error: pathspec <filename> did not match any file(s) known to git.
. A solução foi usar o git bash.git checkout <deleting-commit>~1 -- <file-path>
~ X permite especificar X confirmações antes da confirmação especificada, então ~ 1 é a confirmação antes, ~ 2 é duas submissões antes, etc^
caractere é o caractere de escape! Portanto, no cmd, você deve digitar^^
para dizer ao cmd que deseja um único literal ^ e que não está escapando de outra coisa depois dele. O que está acontecendo com muitas pessoas é que isso^
é seguido por um espaço. Portanto, o cmd acha que você está escapando do espaço - o que gera apenas um caractere de espaço. Assim, no momento em que o git obtém os argumentos cli, ele vêSHA1
e nãoSHA1^
. É realmente irritante.~
não é um personagem de escape, é por isso que ainda funciona. (PS. Se você acha que os googlers desejam essas informações, vote este comentário com mais satisfação) #git log --diff-filter=D --summary
para obter todas as confirmações que excluíram arquivos e os arquivos excluídos;git checkout $commit~1 path/to/file.ext
para restaurar o arquivo excluído.Onde
$commit
está o valor do commit que você encontrou na etapa 1, por exemploe4cf499627
fonte
git log -- *PartOfMyFileName*
. Obrigado por$commit~1
git checkout $commit~1 filename
sintaxe funciona perfeitamente para arquivos individuais e também para diretórios inteiros. ou seja: para restaurar todas as imagens apagadas em ./images de sha 12345:git checkout 12345~1 images
. obrigado por esta resposta!$commit~1
significa que você deve adicionar o nome da confirmação. Algo como1d0c9ef6eb4e39488490543570c31c2ff594426c
onde$commit
está.Para restaurar todos os arquivos excluídos em uma pasta, digite o seguinte comando.
fonte
git
tornou até a tarefa mais simples.ls-files
subcomando é útil, mas parece não funcionar para arquivos que foram removidos comgit rm
, por exemplo, estadiados, muito menos confirmados, que é o que o OP pediu.M myChangedFile
depoisgit checkout
?Cheguei a esta pergunta procurando restaurar um arquivo que acabei de excluir, mas ainda não havia confirmado a alteração. Caso você se encontre nessa situação, tudo o que você precisa fazer é o seguinte:
git checkout HEAD -- path/to/file.ext
fonte
Se você é louco, use
git-bisect
. Aqui está o que fazer:Agora é hora de executar o teste automatizado. O comando shell
'[ -e foo.bar ]'
retornará 0 sefoo.bar
existir e 1 caso contrário. O comando "run" dogit-bisect
usará a pesquisa binária para encontrar automaticamente o primeiro commit no qual o teste falha. Começa na metade do intervalo fornecido (de bom a ruim) e o corta ao meio com base no resultado do teste especificado.Agora você está no commit que o excluiu. A partir daqui, você pode voltar ao futuro e usar
git-revert
para desfazer a alteração,ou você pode voltar um commit e inspecionar manualmente o dano:
fonte
git bisect run '[ -e foo.bar ]'
?git bisect run
diz ao Git para automatizar a bissecção, executando o comando após a palavra 'run', onde o comando deve retornar0
para umagood
versão (vejagit help bisect
para detalhes). A'[ -e foo.bar ]'
é uma expressão padrão para testar se o arquivofoo.bar
não existe (a implementação é geralmente no arquivo/usr/bin/[
que geralmente é hardlinked a/usr/bin/test
) e as marcas quation individuais são usados para colocar isso tudo como um único argumento de linha de comando.Meu novo alias favorito, com base em bonyiii 's resposta (upvoted), e minha própria resposta sobre ' passar um argumento para um comando apelido Git ':
Perdi um arquivo, excluído por engano há alguns commits atrás?
Rápido:
Crise evitada.
Aviso, com o Git 2.23 (terceiro trimestre de 2019), vem o comando experimental chamado
git restore
(!).Então, renomeie esse alias (como mostrado abaixo).
Robert Dailey propõe nos comentários o seguinte apelido:
E jegan acrescenta nos comentários :
fonte
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Se você conhece o nome do arquivo, é uma maneira fácil com os comandos básicos:
Liste todas as confirmações para esse arquivo.
A última confirmação (mais acima) é a que excluiu o arquivo. Portanto, você precisa restaurar o penúltimo commit.
fonte
Para restaurar um arquivo excluído e confirmado:
Foi testado no Git versão 1.7.5.4.
fonte
error: pathspec 'foo' did not match any file(s) known to git.
verifiquei se o nome do arquivo estava correto. Git versão 2.7.0git add -A
, mas o arquivo restaurado ainda estava no estágio não confirmado.Se você fez apenas alterações e excluiu um arquivo, mas não o comprometeu, e agora você terminou suas alterações
mas seus arquivos excluídos não retornaram, basta executar o seguinte comando:
E pronto, seu arquivo está de volta.
fonte
Eu tenho essa solução .
Obtenha o ID do commit no qual o arquivo foi excluído usando uma das maneiras abaixo.
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# recomendado se você mal se lembra de nadaVocê deve obter algo como:
3 . Agora, usando o ID de confirmação bfe68bd117e1091c96d2976c99b3bcc8310bebe7, faça:
Como o id de confirmação faz referência ao commit em que o arquivo já foi excluído, é necessário referenciar o commit imediatamente antes do bfe68b, o que você pode fazer anexando
^1
. Isso significa: me dê o commit antes do bfe68b.fonte
fonte
git undelete path/to/file.ext
Coloque isso no seu
.bash_profile
(ou outro arquivo relevante carregado quando você abre um shell de comando):Então use:
Esse alias primeiro verifica para encontrar o último commit onde este arquivo existia e, em seguida, faz um checkout do Git desse caminho do arquivo a partir do último commit onde este arquivo existia. Fonte .
fonte
Em muitos casos, pode ser útil usar coreutils (grep, sed, etc.) em conjunto com o Git. Eu já conheço essas ferramentas muito bem, mas Git menos. Se eu quisesse pesquisar por um arquivo excluído, faria o seguinte:
Quando encontro a revisão / confirmação:
Assim como outros declararam antes de mim.
O arquivo agora será restaurado para o estado que tinha antes da remoção. Lembre-se de reenviá-lo para a árvore de trabalho, se quiser mantê-lo por perto.
fonte
Eu tive que restaurar um monte de arquivos excluídos de uma confirmação específica e o gerenciei com dois comandos:
(Observe o espaço à direita no final de cada comando.)
Os arquivos foram adicionados ao arquivo .gitignore e depois limpos com
git rm
. Eu precisava restaurar os arquivos, mas depois descompactá-los. Eu tinha centenas de arquivos para restaurar, e digitar manualmente as coisas para cada arquivo, como nos outros exemplos, seria muito lento.fonte
Na verdade, essa pergunta é diretamente sobre o Git, mas alguém como eu trabalha com ferramentas da GUI como o WebStorm VCS, além de conhecer os comandos da CLI do Git.
Clique com o botão direito do mouse no caminho que contém o arquivo excluído e, em seguida, vá para Git e clique em Mostrar histórico .
As ferramentas VCS mostram todas as revisões de treinamento e eu posso ver todos os commits e alterações de cada uma delas.
Depois, seleciono as confirmações que meu amigo exclui o
PostAd.js
arquivo. agora veja abaixo:E agora, posso ver meu arquivo excluído. Eu apenas clico duas vezes no nome do arquivo e ele se recupera.
Eu sei que minha resposta não são comandos do Git, mas é rápido, confiável e fácil para desenvolvedores iniciantes e profissionais. As ferramentas WebStorm VCS são incríveis e perfeitas para trabalhar com o Git e não precisam de nenhum outro plug-in ou ferramentas.
fonte
Eu tive a mesma pergunta. Sem saber, eu havia criado um commit pendente .
Lista dangling confirma
git fsck --lost-found
Inspecione cada confirmação pendente
git reset --hard <commit id>
Meus arquivos reapareceram quando mudei para o commit dangling.
git status
pela razão:“HEAD detached from <commit id where it detached>”
fonte
Restaure o arquivo excluído:
fonte
Se você conhece a confirmação que excluiu o (s) arquivo (s), execute este comando onde
<SHA1_deletion>
está a confirmação que excluiu o arquivo:A parte antes do canal lista todos os arquivos que foram excluídos na confirmação; todos eles fazem checkout do commit anterior para restaurá-los.
fonte
Encontre a confirmação que excluiu seu arquivo:
Saída de amostra:
A partir do Git 2.23, existe realmente um
restore
comando. Ainda é experimental, mas para restaurar algo que você removeu em um commit (4711174 nesse caso), você pode digitar:Observe o ^ após o ID de confirmação, pois queremos restaurar algo do commit antes daquele que excluiu o arquivo.
O
--source
argumento informa aorestore
comando onde procurar o (s) arquivo (s) a restaurar e pode haver qualquer confirmação e até o índice.Consulte: documento git-restore para o git 2.23.0
fonte
No nosso caso, excluímos acidentalmente arquivos em um commit e alguns confirmamos mais tarde, percebemos nosso erro e queríamos recuperar todos os arquivos que foram excluídos, mas não aqueles que foram modificados.
Com base na excelente resposta de Charles Bailey, aqui está minha frase:
fonte
Simples e preciso
Primeiro, obtenha uma confirmação estável mais recente na qual você tem esse arquivo -
Digamos que você encontre $ commitid 1234567 ... e, em seguida,
Isso restaurará a versão do arquivo que estava nessa confirmação.
fonte
Para a melhor maneira de fazer isso, tente.
Primeiro, encontre o ID da confirmação que excluiu seu arquivo. Ele fornecerá um resumo das confirmações dos arquivos excluídos.
Nota:
84sdhfddbddd
é o seucommit id
Com isso, você pode recuperar facilmente todos os arquivos excluídos.
fonte
Você sempre pode
git revert
confirmar o seu que excluiu o arquivo. ( Isso pressupõe que a exclusão foi a única alteração no commit. )E se você continuou o trabalho e percebeu mais tarde que não queria confirmar essa confirmação de exclusão, poderá revertê-lo usando:
Agora
git log
mostra:E
readme.md
foi restaurado no repositório.fonte
Eu também tenho esse problema usando o código abaixo para recuperar um arquivo anterior para um diretório local:
O exemplo abaixo está funcionando para mim:
git checkout resources/views/usaSchools.blade.php
fonte
fonte
Se a exclusão não tiver sido confirmada, o comando abaixo restaurará o arquivo excluído na árvore de trabalho.
Você pode obter uma lista de todos os arquivos excluídos na árvore de trabalho usando o comando abaixo.
Se a exclusão foi confirmada, localize a confirmação onde ocorreu e recupere o arquivo dessa confirmação.
Caso esteja procurando o caminho do arquivo para recuperar, o comando a seguir exibirá um resumo de todos os arquivos excluídos.
fonte
Para restaurar todos os arquivos excluídos com o Git, você também pode:
Onde
git ls-files --deleted
lista todos os arquivos excluídos egit checkout $(git command)
restaura a lista de arquivos em um parâmetro.fonte