git - Encontre commit onde o arquivo foi adicionado

208

Digamos que eu tenho um arquivo foo.js que foi confirmado há algum tempo. Gostaria simplesmente de encontrar o commit onde este arquivo foi adicionado pela primeira vez.

Depois de ler as respostas e meu próprio conserto, isso funciona para mim

git log --follow --diff-filter=A --find-renames=40% foo.js
Steven Penny
fonte

Respostas:

318

Aqui está uma maneira mais simples e "pura Git" de fazer isso, sem necessidade de pipeline:

git log --diff-filter=A -- foo.js

Verifique a documentação. Você pode fazer o mesmo com Excluídos, Modificados etc.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

Eu tenho um alias útil para isso, porque eu sempre esqueço:

git config --global alias.whatadded 'log --diff-filter=A'

Isso torna tão simples quanto:

git whatadded -- foo.js

O liner abaixo procurará recursivamente os subdiretórios do $PWDfor, foo.jssem precisar fornecer um caminho absoluto ou relativo ao arquivo, nem o arquivo precisará estar no mesmo diretório que o$PWD

git log --diff-filter=A -- **foo.js
stelterd
fonte
27
+1! No entanto, meu arquivo estava em uma subpasta, portanto, só funcionou depois que adicionei um asterisco na frente.git log --diff-filter=A -- *subfolder/foo.js
Geo
4
Como isso funciona em arquivos mesclados de outras ramificações, mas que não foram necessariamente adicionados à ramificação que está sendo mesclada pelo usuário que está executando a mesclagem?
precisa saber é o seguinte
O link do documento acima não pula para as informações da bandeira. Talvez tenha mudado desde a publicação. git-scm.com/docs/git-log#Documentation/…
webbower 19/03/19
1
Sim, eles mudaram a estrutura da âncora nos documentos. Atualizado, obrigado!
stelterd
@geo Acho que entendi o que você está dizendo, mas não realmente, mas tenho um caso de uso semelhante, em que geralmente permaneço na raiz do projeto de um diretório git e emito comandos a partir daí, e usar o liner fornecido git log --diff-filter=A -- foo.jsnão imprimiu o comprometer ID / hash para STDOUT no meu terminal em vez i teve que fornecer o caminho relativo para o arquivo a partir da raiz repo git, a fim de obter os resultados desejados
iPatch
17
git log --oneline -- foo.js | tail -n 1
Seth Robertson
fonte
1
Eu seria bom ter --follow.
Yasushi Shoji
A solução aceita não funcionou para mim, mas funcionou. Obrigado!
Stevie Howard
1

O seguinte pode não ser do seu interesse, mas acho que o ajudará no futuro e faz parte do ecossistema de depuração no Git:

Você pode usar git-blamepara mostrar qual revisão e autor modificou pela última vez cada linha de um arquivo, especialmente a anotação de arquivo. Visite https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Por exemplo,

git blame -L 174,190  xx.py
Reidel
fonte
Você poderia explicar por favor o que cada um dos operandos faz? Sei que você forneceu um link para o rtfm relevante, mas um pouco de elucidação tornaria sua postagem um ponto único.
Rossmcm 6/02
Como o livro do Pro-Git diz: Se você rastrear um bug no seu código e quiser saber quando ele foi introduzido e por quê, a anotação de arquivo geralmente é a melhor ferramenta. Ele mostra qual commit foi o último a modificar cada linha de qualquer arquivo. Portanto, este exemplo que eu mostrei usa a opção -L para limitar a saída às linhas 174 a 190 e a última coisa é apenas o arquivo de destino que você deseja verificar ( xx.py) neste caso um @rossmcm arquivo python
Reidel