Como posso listar todos os commits que alteraram um arquivo específico?

803

Existe uma maneira de listar todos os commits que alteraram um arquivo específico?

Daniel
fonte
1
Você está procurando alterações em um arquivo em uma única ramificação; em todas as filiais locais; em todas as filiais em um único controle remoto; ou através de tudo isso? Eu acho que em tudo isso exigirá um script.
benhorgen

Respostas:

1083

Os --followtrabalhos para um arquivo específico

git log --follow -- filename

Diferença para outras soluções dadas

Observe que outras soluções incluem git log path(sem o --follow). Essa abordagem é útil se você deseja acompanhar, por exemplo, alterações em um diretório , mas tropeça quando os arquivos são renomeados (portanto, use --follow filename).

jackrabb1t
fonte
32
+1 --followcontas para renomeações, então isso é mais robusto do quegit log -- path
Gabe Moothart
42
Observe que --followaceita um caminho , que pode ser um arquivo, mas também um diretório. No caso deste último, ele será executado recursivamente e relatará alterações em todos os arquivos abaixo desse ponto. (Este comportamento não está documentado na página de manual e não pode ser permanente.)
StvnW
5
Qual a diferença entre aquele e apenasgit log filename?
Vato
8
@SaulOrtega, git log filenamenão segue a renomeação de arquivos, ou seja, mostrará todos os commits relativos a esse nome de arquivo (não ao arquivo real). Se você criar arquivos Xe Y, alterou os dois, excluiu Ye renomeou Xpara Ye também os alterou, e executar git log Y, você receberá mensagens para o antigo Y e o novo . E o contrário, --followvocê receberá confirmações sobre esse arquivo quando ele foi nomeado X e quando ele foi nomeado Y.
MarSoft
7
usar "git log --all filename" para ver todos os commits em todos os ramos
Lebnik
122

git log pathdeve fazer o que quiser. Do git loghomem :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
Gabe Moothart
fonte
11
Não funciona se o caminho do arquivo foi alterado. A resposta de jackrabbit funciona nesse caso.
Kwahn #
1
Isso funciona se você precisar restringir o log para um ramo específico
AMS
63

Eu estive olhando isso de perto e todas essas respostas não parecem realmente me mostrar todos os commits em todos os ramos.

Aqui está o que eu descobri brincando com as opções de exibição de edição do gitk. Isso mostra todas as confirmações para um arquivo, independentemente da ramificação, local, reflog e remoto.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

Também trabalha com git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename
BigMiner
fonte
11
Isso é perfeito para quando alguém faz alterações, mas elas esquecem onde confirmaram as alterações.
earthmeLon
2
Muito útil. Inclui também stash commits
Juan Antonio Tubío
Essa deve ser a resposta preferida. A questão era encontrar todos os commits, este aqui.
carl verbiest
Observe que --refloginclui confirmações que foram reformuladas / alteradas ou descartadas. Talvez isso deva ser óbvio, mas tentei usar isso git loge estava tentando descobrir por que estava vendo confirmações aparentemente duplicadas!
Soren Bjornstad 9/07/19
43

Use o comando abaixo para obter confirmações para um arquivo específico:

git log -p filename
Sankar Subburaj
fonte
8
Entendo que isso não responde exatamente à pergunta, pois ele queria uma lista de confirmações, mas isso é ouro e está no meu arquivo.
zkent
3
Isso não funcionará se o arquivo não existir na ramificação com check-out atualmente. Você pode adicionar o ramo como git log -p mybranch -- filenameou apenas usar git log --all -- filenamepara procurar em todos os ramos.
Soren Bjornstad 9/07/19
37

Deve ser tão simples quanto git log <somepath>; verifique a página de manual ( git-log(1)).

Pessoalmente, gosto de usar git log --stat <path>para poder ver o impacto de cada confirmação no arquivo.

rfunduk
fonte
9
Ou mesmo -pse você quiser ver o diff completo, não apenas que ele teve algum número de linhas modificadas.
Cascabel
É verdade, mas isso é bastante barulhento, considerando que a maioria dos arquivos foi alterada várias vezes ao longo de suas vidas. Não quero ver diferenças completas de todos os commit que já tocaram em um arquivo. Normalmente, procuro algo específico, para que eu possa obter um registro com apenas impactos e, git showem seguida, nos commits específicos que parecem ser importantes.
Rfunduk 13/09/10
git log --stat --follow - * .html => lista de saída de confirmações com exatamente um arquivo em cada confirmação. Muito agradável!
Sergio Belevskij 7/02/19
18

Como alternativa (desde o Git 1.8.4), também é possível obter todos os commits que alteraram uma parte específica de um arquivo. Você pode obter isso passando a linha inicial e o número da linha final.

O resultado retornado seria a lista de confirmações que modificaram esta parte específica. O comando é como:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

onde upperLimitestá o start_line_numbere lowerLimité oending_line_number

Mais informações - https://www.techpurohit.com/list-some-useful-git-commands

jitendrapurohit
fonte
17

Como jackrabb1t apontou, --followé mais robusto, pois continua listando o histórico além de renomear / mover. Portanto, se você estiver procurando por um arquivo que não esteja atualmente no mesmo caminho ou que tenha sido renomeado por várias confirmações, --follow o rastreará.

Essa pode ser uma opção melhor se você deseja visualizar as alterações de nome / caminho:

git log --follow --name-status -- <path>

Mas se você quiser uma lista mais compacta, apenas com o que importa:

git log --follow --name-status --format='%H' -- <path>

ou mesmo

git log --follow --name-only --format='%H' -- <path>

A desvantagem é que --followsó funciona para um único arquivo.

Roberto
fonte
4
--followfunciona para um único caminho , que pode ser um diretório. Se for aprovado em um diretório, ele será executado recursivamente e relatará alterações em todos os arquivos abaixo desse ponto.
StvnW
10

Se você está tentando - seguir um arquivo excluído em uma confirmação anterior, use

git log --follow -- filename
Snovelli
fonte
3
Para gitiniciantes: use git log -p --follow -- filenamepara exibir as alterações também. Observe também: "filename" pode ser um arquivo, um diretório ou um submódulo.
Tino
8

Se você deseja visualizar todas as confirmações que alteraram um arquivo, em todas as ramificações, use o seguinte:

git log --follow --all <filepath>
Always_Beginner
fonte
8

Se você deseja procurar todos os commits por filenamee não por filepath , use:

git log --all -- '*.wmv'
País das maravilhas
fonte
6

Se você deseja ver todas as alterações feitas nas confirmações que alteraram um arquivo específico (em vez de apenas as alterações feitas no próprio arquivo), você pode passar --full-diff:

git log -p --full-diff [branch] -- <path>
Cúbico
fonte
ou sem o[branch]
Anentropic
1
@Anentropic Os colchetes deveriam indicar que o argumento é opcional.
Cubic
É tudo o que eu preciso, mostra a mudança completa, inclui algumas alterações da mesclagem.
ThanhLD
5

Use git log --all <filename>para visualizar os commits que influenciam <filename>em todas as ramificações.

Lebnik
fonte
4
gitk <path_to_filename>

Supondo que o pacote "gitk" já esteja instalado.

Se não estiver instalado, faça o seguinte:

sudo apt-get install gitk

E tente o comando acima. É para Linux ... Pode ajudar os usuários de Linux se eles querem uma GUI.

Breen ho
fonte
Para usuários do Windows, observe que o gitkpacote inclui o Git for Windows.
Soren Bjornstad 23/03
2

Para obter apenas uma lista dos hashes de confirmação, use git rev-list

 git rev-list HEAD <filename>

Resultado:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

o que significa que 5 confirmações tocaram neste arquivo. É a ordem cronológica inversa, portanto, o primeiro commit na lista b7c4f0d7é o mais recente.

Boris
fonte
1

No Linux, você pode usar o gitk para isso.

Pode ser instalado usando "sudo apt-get install git-gui gitk". Ele pode ser usado para ver confirmações de um arquivo específico por "gitk <Filename>".

Chamila Wijayarathna
fonte
1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Referência

AnshBikram
fonte