Como recuperar um único arquivo de uma revisão específica no Git

Eu tenho um repository Git e gostaria de ver como alguns arquivos pareciam há alguns meses. Eu encontrei a revisão nessa data, e é 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 . Eu preciso ver o que um arquivo parece e também salvar isso em um arquivo.

Eu consegui ver o arquivo usando o gitk , mas ele não tem uma opção para salvá-lo. Eu tentei com ferramentas de linha de comando, o mais próximo que eu cheguei foi:

 git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt 

No entanto, este comando mostra um diff e não o conteúdo do arquivo. Eu sei que depois posso usar algo como PAGER=cat e redirect a saída para um arquivo, mas não sei como chegar ao conteúdo real do arquivo.

Basicamente, eu estou procurando por algo como svn cat .

Para completar sua própria resposta, a syntax é de fato

 git show object git show $REV:$FILE git show somebranch:from/the/root/myfile.txt git show HEAD^^^:test/test.py 

O comando assume o estilo usual de revisão, o que significa que você pode usar qualquer um dos seguintes:

  1. nome da ramificação (como sugerido por ash )
  2. HEAD + x número de ^ caracteres
  3. O hash SHA1 de uma determinada revisão
  4. Os primeiros (talvez 5) caracteres de um determinado hash SHA1

Dica É importante lembrar que ao usar ” git show “, sempre especifique um caminho a partir da raiz do repository , não a posição atual do diretório.

(Embora Mike Morearty mencione que, pelo menos com o git 1.7.5.4, você pode especificar um caminho relativo colocando ” ./ ” no começo do caminho – por exemplo:

 git show HEAD^^:./test.py 

)


Antes de git1.5.x, isso foi feito com algum encanamento:

git ls-tree
mostra uma lista de um ou mais objects ‘blob’ dentro de um commit

git cat-file blob
cat um arquivo como ele foi confirmado dentro de uma revisão específica (semelhante ao svn cat). use git ls-tree para recuperar o valor de um determinado arquivo-sha1

 git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1):: 

git-ls-tree lista o ID do object para $ file na revisão $ REV, isso é cortado da saída e usado como um argumento para git-cat-file, que deve ser chamado de git-cat-object, e simplesmente dumps esse object para stdout.


Nota: desde o Git 2.11 (Q4 2016), você pode aplicar um filtro de conteúdo à saída do git cat-file !

Veja commit 3214594 , commit 7bcf341 (09 Sep 2016), commit 7bcf341 (09 Sep 2016), e commit b9e62f6 , commit 16dcc29 (24 Aug 2016) por Johannes Schindelin ( dscho ) .
(Mesclado por Junio ​​C Hamano – gitster – em commit 7889ed2 , 21 set 2016)

cat-file : support --textconv / --textconv no modo batch

Mesmo que ” git hash-objects “, que é uma ferramenta para obter um stream de dados no sistema de arquivos e colocá-lo no repository de objects do Git, é permitido executar as conversões “outside-world-to-git” (por exemplo, fim-de- conversões de linha e aplicação do filtro limpo), e tinha o recurso por padrão desde os primórdios, sua operação reversa ” git cat-file “, que pega um object do repository de objects do Git e exterioriza para o consumo pelo mundo exterior, faltava um mecanismo equivalente para executar o “mundo Git-to-fora-mundo”

 git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m < " git cat-file --textconv --batch 

Nota: " git cat-file --textconv " iniciou o segfaulting recentemente (2017), que foi corrigido no Git 2.15 (Q4 2017)

Veja commit cc0ea7c (21 de setembro de 2017) por Jeff King ( peff ) .
(Mesclado por Junio ​​C Hamano - gitster - em commit bfbc2fc , 28 de set de 2017)

Se você deseja replace / sobrescrever o conteúdo de um arquivo em sua ramificação atual com o conteúdo do arquivo de uma confirmação anterior ou uma ramificação diferente, você pode fazê-lo com estes comandos:

 git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt 

ou

 git checkout mybranchname path/to/file.txt 

Você terá que cometer essas alterações para que elas sejam efetivas na ramificação atual.

Você precisa fornecer o caminho completo para o arquivo:

 git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt 

A maneira mais fácil é escrever:

 git show HASH:file/path/name.ext > some_new_name.ext 

Onde:

  • HASH é o número hash da revisão Git SHA-1
  • file / path / name.ext é o nome do arquivo que você está procurando
  • some_new_name.ext é o caminho e o nome onde o arquivo antigo deve ser salvo

Exemplo

 git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD 

Isso salvará my_file.txt da revisão b0d78b4 como um novo arquivo com o nome my_file.txt.OLD

Foi testado com o Git 2.4.5.

Se você quiser recuperar o arquivo excluído, poderá usar HASH~1 (um commit antes do HASH especificado).

EXEMPLO:

 git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt 

No Windows, com o Git Bash:

  • na sua área de trabalho, altere dir para a pasta em que seu arquivo está
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext

E para despejar bem em um arquivo (no Windows, pelo menos) – Git Bash:

 $ echo "`git show 60d8bdfc:src/services/LocationMonitor.java`" >> LM_60d8bdfc.java 

As " citações são necessárias para preservar as novas linhas.

Isso ajudará você a obter todos os arquivos excluídos entre as confirmações sem especificar o caminho, útil se houver muitos arquivos excluídos.

 git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1 

Obtenha o arquivo de um commit anterior por meio de check-out de um commit anterior e copiando o arquivo.

  • Observe em qual branch você está: git branch
  • git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 a confirmação anterior que você quer: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • Copie o arquivo que você deseja para um local temporário
  • git checkout theBranchYouNoted a ramificação da qual você começou: git checkout theBranchYouNoted
  • Copie no arquivo que você colocou em um local temporário
  • Confirme sua mudança para git: git commit -m "added file ?? from previous commit"