Eu tenho um repositório Git e gostaria de ver como alguns arquivos pareciam alguns meses atrás. Encontrei a revisão nessa data; ele é 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. Preciso ver como é um arquivo e também salvá-lo como um arquivo ("novo").
Consegui ver o arquivo usando gitk
, mas ele não tem uma opção para salvá-lo. Tentei com ferramentas de linha de comando, o mais próximo que cheguei foi:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
No entanto, este comando mostra um diff, e não o conteúdo do arquivo. Sei que depois posso usar algo como PAGER=cat
e redirecionar a saída para um arquivo, mas não sei como obter o conteúdo real do arquivo.
Basicamente, estou procurando algo como o svn cat .
git
single-file
Milan Babuškov
fonte
fonte
git show
(sem ajuda) usa sintaxe diferente com dois pontos.git show 2c7cf:my_file.txt
>
Respostas:
Para completar sua própria resposta, a sintaxe é de fato
O comando segue o estilo usual de revisão, o que significa que você pode usar qualquer um dos seguintes:
HEAD
+ x número de^
caracteresDica É importante lembrar que, ao usar "
git show
", sempre especifique um caminho a partir da raiz do repositório , não da 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 início do caminho - por exemplo:)
Com o Git 2.23+ (agosto de 2019), você também pode usar o
git restore
que substitui ogit checkout
comando confusoIsso restauraria na árvore de trabalho somente o arquivo como presente na "origem" (
-s
) confirma o SHA1 ou ramosomebranch
.Para restaurar também o índice:
(
-SW
: abreviação de--staged --worktree
)Antes do git1.5.x, isso era feito com algum encanamento:
git ls-tree <rev>
mostra uma lista de um ou mais objetos 'blob' dentro de uma confirmação
git cat-file blob <file-SHA1>
cat um arquivo como foi confirmado em uma revisão específica (semelhante ao svn cat). use git ls-tree para recuperar o valor de um determinado arquivo sha1
O git-ls-tree lista o ID do objeto para o arquivo $ na revisão $ REV, isso é cortado da saída e usado como argumento para o git-cat-file, que realmente deve ser chamado de git-cat-object e simplesmente despeja esse objeto para stdout.
Nota: desde o Git 2.11 (quarto trimestre de 2016), você pode aplicar um filtro de conteúdo à
git cat-file
saída!Consulte commit 3214594 , commit 7bcf341 (09 de setembro de 2016), commit 7bcf341 (09 de setembro de 2016) e commit b9e62f6 , commit 16dcc29 (24 de agosto de 2016) por Johannes Schindelin (
dscho
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação 7889ed2 , 21 de setembro de 2016)Nota: "
git cat-file --textconv
" iniciou o segfaulting recentemente (2017), que foi corrigido no Git 2.15 (quarto trimestre de 2017)Veja commit cc0ea7c (21 de setembro de 2017) por Jeff King (
peff
) .(Mesclado por Junio C Hamano -
gitster
- in commit bfbc2fc , 28 de setembro de 2017)Observe que, para substituir / substituir um arquivo por um conteúdo passado, você não deve mais usar o comando confuso
git checkout
, masgit restore
(Git 2.23+, agosto de 2019)Isso restauraria na árvore de trabalho apenas o arquivo presente na
-s
confirmação "source" ( ) SHA1.Para restaurar também o índice:
(
-SW
: abreviação de--staged --worktree
)fonte
git show
basicamente despeja o conteúdo nastdout
(saída padrão), você pode simplesmente redirecionar essa saída para qualquer arquivo que desejar ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepath
é o comando certogit checkout
iria substituir o arquivo por uma outra versão, ao contráriogit show
, o que permite que você salve-o com um nome diferente, para que você chegar e ver tanto (a versão atual ea versão antiga). Não está claro se o OP deseja substituir sua versão atual por uma antiga.^^^
também pode ser escrito de maneira mais geral como~~~
ou, melhor~3
. O uso de tildes também tem a vantagem de não acionar a correspondência de nome de arquivo de alguns shells (zsh, por exemplo).git rev-parse
lida comrev:path
sintaxe? (Em um git mais recente que pudergit cat-file -p $REV:path
. No entanto,git show
trabalha para caminhos de diretório, bem como, portanto, não é apenas mais curto, geralmente é mais perto do que se quer.)Se você deseja substituir / substituir o conteúdo de um arquivo em sua ramificação atual pelo conteúdo de um arquivo de uma consolidação anterior ou de uma ramificação diferente, você pode fazer isso com estes comandos:
ou
Você precisará confirmar essas alterações para que sejam efetivas na ramificação atual.
fonte
git show SHA1:PATH
solução é impressa apenas no stdout.git help checkout
. I fez check-out um subdiretório a partir de uma determinada data, e usando esta abordagem, eu poderia obter esta sintaxe de trabalho:git checkout @{YYYY-MM-DD} sub-dir
Você precisa fornecer o caminho completo para o arquivo:
fonte
git show --name-only
é suficiente tambémfull/repo/path/to
e tentar:,git show 27cf8e84:my_file.txt
você será recompensado com uma mensagem como: fatal: O caminho 'full / repo / path / to / my_file.txt' existe, mas não 'my_file.txt' . Você quis dizer '27cf8e84: full / repo / path / to / my_file.txt' 'aka' 27cf8e84: ./ my_file.txt '? É como se o Git pudesse ter ajudado diretamente, mas optou por ser pedante aqui.A maneira mais fácil é escrever:
Onde:
Exemplo
Isso salvará my_file.txt da revisão 27cf8e como um novo arquivo com o nome my_file.txt.OLD
Foi testado com o Git 2.4.5.
Se você deseja recuperar o arquivo excluído, pode usar
HASH~1
(uma confirmação antes do HASH especificado).EXEMPLO:
fonte
git log file/path/name.ext
No Windows, com Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
fonte
E para despejá-lo em um arquivo (pelo menos no Windows) - Git Bash:
As
"
aspas são necessárias para preservar novas linhas.fonte
git show
sintaxe que mencionei acima.Isso ajudará você a obter todos os arquivos excluídos entre confirmações sem especificar o caminho, útil se houver muitos arquivos excluídos.
fonte
este comando obtém o arquivo copiado de confirmação específica.
fonte
Obtenha o arquivo de uma consolidação anterior através do check-out da consolidação anterior e do arquivo de cópia.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
fonte