Era uma vez, um arquivo no meu projeto que eu gostaria de obter agora.
O problema é: não tenho idéia de quando o excluí e em que caminho estava.
Como localizo as confirmações deste arquivo quando ele existia?
Era uma vez, um arquivo no meu projeto que eu gostaria de obter agora.
O problema é: não tenho idéia de quando o excluí e em que caminho estava.
Como localizo as confirmações deste arquivo quando ele existia?
Respostas:
Se você não souber o caminho exato, poderá usar
git log --all --full-history -- "**/thefile.*"
Se você souber o caminho que o arquivo estava, você pode fazer o seguinte:
git log --all --full-history -- <path-to-file>
Isso deve mostrar uma lista de confirmações em todas as ramificações que tocaram nesse arquivo. Em seguida, você pode encontrar a versão do arquivo que deseja e exibi-la com ...
git show <SHA> -- <path-to-file>
Ou restaure-o na sua cópia de trabalho com:
git checkout <SHA>^ -- <path-to-file>
Observe o símbolo de sinal de intercalação ( ^
), que recebe a finalização da compra antes da identificação, porque no momento da <SHA>
confirmação do arquivo é excluído, precisamos observar a confirmação anterior para obter o conteúdo do arquivo excluído
git log -- <path>
não terá saída quando você estiver em uma ramificação na qual o arquivo nunca existiu. Você deve sempre usar git log --all -- <path>
, para garantir que não perca as alterações que ocorreram em outros ramos. O comando git log -- <path>
pode ser muito perigoso se você tiver mais de um ramo e tender a esquecer caminhos e ramos (como eu) e também será perigoso se você trabalhar com outros desenvolvedores.
git checkout <SHA>^ -- <path-to-file>
(observe o símbolo ^), porque no momento do <SHA> commit o arquivo é excluído, precisamos observar o commit anterior para obter o conteúdo do arquivo excluído
Obtenha uma lista dos arquivos excluídos e copie o caminho completo do arquivo excluído
git log --diff-filter=D --summary | grep delete
Execute o próximo comando para encontrar o ID de confirmação dessa confirmação e copie o ID de confirmação
git log --all -- FILEPATH
Mostrar diff do arquivo excluído
git show COMMIT_ID -- FILE_PATH
Lembre-se, você pode gravar a saída em um arquivo usando >
como
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree
.
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
e agora você pode fazer o seguinte:git-grep-latest some_text
linux pipes
.. você vai gostar.
Não foi possível editar a resposta aceita, portanto, adicione-a como resposta aqui,
para restaurar o arquivo no git, use o seguinte (observe o sinal '^' logo após o SHA)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
deve funcionar da mesma forma sem a necessidade de envolvê-lo com aspas.
Suponha que você queira recuperar um arquivo chamado MyFile
, mas não tenha certeza de seu caminho (ou extensão):
Prelim .: Evite confusão, pisando na raiz do git
Um projeto não trivial pode ter vários diretórios com nomes semelhantes ou idênticos.
> cd <project-root>
Encontre o caminho completo
git log --diff-filter = D - resumo | grep delete | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
é o caminho e o arquivo que você está procurando.
Determine todas as confirmações que afetaram esse arquivo
git log --oneline --follow - completo / caminho / para / MyFile.js
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Finalize o arquivo
Se você escolher o primeiro commit listado (o último cronologicamente, aqui bd8374c), o arquivo não será encontrado, pois foi excluído nesse commit.
> git checkout bd8374c -- full/path/to/MyFile.js
`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`
Basta selecionar o commit anterior (acrescentar um sinal de intercalação):
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"
e na step3, observe as aspas ao redor do hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
@ Amber deu a resposta correta! Apenas mais uma adição, se você não souber o caminho exato do arquivo, poderá usar curingas! Isso funcionou para mim.
git log --all -- **/thefile.*
Abaixo está um comando simples, no qual um usuário dev ou git pode passar um nome de arquivo excluído do diretório raiz do repositório e obter o histórico:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
Se alguém puder melhorar o comando, faça.
Tente usar um dos visualizadores, como gitk
para que você possa navegar pelo histórico para encontrar o arquivo meio lembrado. (use gitk --all
se necessário para todos os ramos)
--all
opção é crítica para sua resposta e a resposta aceita.
Resumo:
Você pesquisa o caminho completo do arquivo no histórico de arquivos excluídos git log --diff-filter=D --summary | grep filename
Você restaura seu arquivo da confirmação antes de ser excluído
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
Aqui está a minha solução:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>