Existe um comando no Git para ver (despejado no stdout ou em $PAGER
ou $EDITOR
) uma versão específica de um arquivo específico?
git checkout <sha1-of-the-commit-you-need>
depoisgit checkout HEAD
Existe um comando no Git para ver (despejado no stdout ou em $PAGER
ou $EDITOR
) uma versão específica de um arquivo específico?
git checkout <sha1-of-the-commit-you-need>
depoisgit checkout HEAD
Respostas:
Você pode usar git show
com um caminho da raiz do repositório ( ./
ou ../
para o caminho relativo):
$ git show REVISION:path/to/file
Substitua REVISION
por sua revisão real (pode ser um SHA de confirmação do Git, um nome de tag, um nome de filial, um nome de confirmação relativo ou qualquer outra maneira de identificar uma confirmação no Git)
Por exemplo, para visualizar a versão do arquivo <repository-root>/src/main.c
de 4 confirmações atrás, use:
$ git show HEAD~4:src/main.c
O Git para Windows requer barras, mesmo em caminhos relativos ao diretório atual. Para mais informações, consulte a página de manual git-show
.
Fazer isso por data é assim:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Observe que HEAD@{2013-02-25}
significa "onde o HEAD estava em 25/02/2013" neste repositório (usando o reflog ), não "o último commit antes de 25-02-2013 neste ramo no histórico".
master
em vez de HEAD@{2013-02-25}
, se você estiver em um ramo
git log --since='2016-04-28 23:59:59 +0100'
?
Se você gosta de GUIs, pode usar o gitk:
inicie o gitk com:
gitk /path/to/file
Escolha a revisão na parte superior da tela, por exemplo, por descrição ou data. Por padrão, a parte inferior da tela mostra o diff dessa revisão (correspondente ao botão de opção "patch").
Para ver o arquivo da revisão selecionada:
gitk REVISION /path/to/file
. Isso pode ser útil quando você deseja verificar uma determinada versão, por exemplo.
Você também pode especificar um commit hash
(muitas vezes também chamado commit ID
) com o git show
comando .
git show <commitHash>:/path/to/file
git log /path/to/file
commit hash
tal como commit 06c98...
(06c98 ... sendo o hash cometer)commit hash
git show <commitHash>:/path/to/file
usando as commit hash
etapas 3 e path/to/file
1.Nota: adicionar ./
ao especificar um caminho relativo parece importante, ie git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
.
git show <SHA1> --name-only
para obtê-lo.
Além da resposta de Jim Hunziker ,
você pode exportar o arquivo da revisão como,
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Espero que isto ajude :)
Para ver rapidamente as diferenças com as revisões mais antigas de um arquivo:
git show -1 filename.txt
> comparar com a última revisão do arquivo
git show -2 filename.txt
> comparar com a segunda última revisão
git show -3 fielname.txt
> comparar com a última terceira revisão
git log -p
mostrará não apenas os logs de confirmação, mas também o diff de cada confirmação (exceto as confirmações de mesclagem). Então você pode pressionar /
, digite o nome do arquivo e pressione enter
. Pressione n
ou p
para ir para a ocorrência seguinte / anterior. Dessa forma, você não apenas verá as alterações no arquivo, mas também as informações de confirmação.
git log -pm
que também mostraria confirmações de mesclagem.
git log -p -- filename.txt
para restringir o histórico apenas ao arquivo desejado.
Você pode usar um script como este para despejar todas as versões de um arquivo para separar arquivos:
por exemplo
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
Obtenha o script aqui como resposta a outra pergunta semelhante
git_root
, git_log_short
E git_log_message_for_commit
estão faltando.
MANEIRA 1: (prefiro assim)
git reflog
git diff-tree --no-commit-id --name-only -r <commitHash>
exemplo:
git diff-tree --no-commit-id --name-only -r d2f9ba4
// "d2f9ba4" é o ID de confirmação de "1."
git show <commitHash>:/path/to/file
exemplo:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
// "Src / ..." é o caminho do arquivo de "2".
MANEIRA 2:
git reflog
git reset --hard %commit ID%
git reset --hard c14809fa
Auxiliar para buscar vários arquivos de uma determinada revisão
Ao tentar resolver conflitos de mesclagem, esse auxiliar é muito útil:
#!/usr/bin/env python3
import argparse
import os
import subprocess
parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
file_relative = os.path.relpath(os.path.abspath(path), toplevel)
base, ext = os.path.splitext(path)
new_path = base + '.old' + ext
with open(new_path, 'w') as f:
subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)
Uso:
git-show-save other-branch file1.c path/to/file2.cpp
Resultado: o seguinte contém as versões alternativas dos arquivos:
file1.old.c
path/to/file2.old.cpp
Dessa forma, você mantém a extensão do arquivo para que seu editor não se queixe e possa encontrar facilmente o arquivo antigo ao lado do mais novo.