Restaurar arquivo do commit antigo no git

Respostas:

218
git checkout 'master@{7 days ago}' -- path/to/file.txt

Isso não altera o HEAD, apenas substitui o arquivo local path/to/file.txt

Veja man git-rev-parse para possíveis especificações de revisão (é claro que um simples hash (como dd9bacb) será bom)

Não se esqueça de confirmar a alteração (após uma revisão ...)

ver
fonte
15
Uau, @heneryville e sehe, eu realmente pensei que '7 dias atrás' era uma meta para você descobrir o que cometer. ty!
AnneTheAgile
7
Parte 2 Ao desejar escolher um commit específico, o formato acima não funciona. Em vez disso usar o que Urs mostrou abaixo, git checkout commitShaNumber - path / to / file.txt per stackoverflow.com/questions/215718/...
AnneTheAgile
2
@AnneTheAgile no fato de que ainda é exatamente a mesma sintaxe, eu só aconteceu para dar um exemplo "complexo" de uma revision-specificationvez que é o que o OP pediu :)
sehe
1
Se o seu commit foi usado para excluir o arquivo que você está tentando recuperar, use shacommit~1(ex:) git checkout 0f4bbdcd~1 -- path/to/file.txtpara obter o commit imediatamente antes.
sdlins 03/01
89
  1. Confira o arquivo do seu commit antigo via git checkout [Revision_Key] -- path/to/file.
  2. Adicione, confirme, pressione conforme apropriado.
Urs Reupke
fonte
3
git checkoutpode lidar com arquivos únicos (consulte a resposta sehe), sem necessidade de copiar e colar.
Koraktor 8/07
1
As chaves de revisão são sempre o SHA1 para a confirmação?
IslandCow 29/09
1
Eles são, mas geralmente os 6 a 8 primeiros caracteres do SHA1 são suficientes para identificar a revisão.
quer
2
@IslandCow não, eles podem ser sha1 mas também ramo, tag, ou qualquer outra coisa que aponta para um commit, por exemplo HEAD, ORIG_HEADou qualquer daqueles combinado com ^/ ~/ @notação de estilo.
Alois Mahdal
2
Você indica que se deve "adicionar" o arquivo posteriormente. Mas isso está incorreto. O arquivo não é colocado na área de preparação. Já foi adicionado.
xApple 26/07
8

Eu precisava restaurar um arquivo recente confirmado no git. Portanto, apenas para reiterar e dar outra perspectiva, você precisa fazer isso executando as duas etapas a seguir:

  1. git log -3
    Isso mostra os três commits mais recentes. Leia os comentários e o nome do autor para restringir a versão exata que deseja. Anote esse ID de confirmação longo (ou seja, b6b94f2c19c456336d60b9409fb1e373036d3d71) para a versão de confirmação que você deseja.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    Passe o ID de confirmação E o nome do arquivo que deseja restaurar. Verifique se você tem um espaço antes e depois do hífen duplo.

Existem muitas outras maneiras de fazer isso. Mas este é o mais simples que me lembro. Espero que ajude.

NOTA: Se você estiver dentro do caminho / pasta do projeto, não será necessário digitar o caminho completo do arquivo no comando checkout.

Salvador Valencia
fonte
Melhor comentário de todos os tempos. Como o que é a resposta aceita, pressupõe que o arquivo que deve ser buscado seja enviado a montante, no entanto, esse comando busca / restaura o arquivo que existe apenas localmente.
ot0 21/08/19
1
Apenas tentei isso na pasta raiz do meu repositório git local. Eu ainda precisava fornecer o caminho relativo para o arquivo. Apenas fornecer o - [nome do arquivo] por si só não funcionou.
user2784627
@ ot0 Não, não assume isso. Eles são exatamente a mesma resposta.
matt
4

Todas as respostas mencionam git checkout <tree-ish> -- <pathspec>. A partir do git v2.23.0, existe um novo método de restauração do git que deve assumir parte do que git checkoutfoi responsável. Veja os destaques das mudanças no blog do github .

O comportamento padrão deste comando é restaurar o estado de uma árvore de trabalho com o conteúdo proveniente do sourceparâmetro (que no seu caso será um hash de confirmação).

Assumindo que o hash de confirmação é abcdefo comando, seria assim:

git restore --source=abcdef file_name

que (por padrão) coloca na árvore de trabalho. Se você deseja colocar a alteração diretamente no índice para que ela possa ser confirmada imediatamente:

git restore --source=abcdef --worktree --staged file_name

ou com nomes curtos de opção:

git restore -s=abcdef -W -S file_name
mjarosie
fonte