Como fazer com que o git log mostre nomes de arquivos como svn log -v

987

O log do SVN possui um modo "-v" que gera nomes de arquivos alterados em cada confirmação, assim:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 jes5199 2007-01-03 14:39:41 -0800 (quarta-feira, 03 de janeiro de 2007) | 1 linha
Caminhos alterados:
   A / AUTORES
   A / COPYING
   A / ChangeLog
   A / EVOLUTION
   A / INSTALAR
   A / MacOSX

Existe uma maneira rápida de obter uma lista de arquivos alterados em cada commit no git?

jes5199
fonte
15
Pergunto-me por git logque não suporta apenas um -vswitch como tantos esperam / querem? </gripe>
MarkHu 5/17/17

Respostas:

1528

Para nomes completos do caminho dos arquivos alterados:

git log --name-only

Para nomes completos de caminhos e status de arquivos alterados:

git log --name-status

Para nomes de caminho abreviados e uma diferença de arquivos alterados:

git log --stat

Há muito mais opções, confira os documentos .

CB Bailey
fonte
17
Eu uso git log --numstat. Veja git help logpara mais opções.
ma11hew28
29
git log --name-only --onelinetambém é bastante interessante - uma linha colorida para o commit e um arquivo por linha. stackoverflow.com/a/14227496/1995714
cp.engr 15/15
4
Com o git 2.7.3, eu precisava usá git log --name-status --find-renames-lo para mostrar arquivos renomeados em vez de adição + exclusão.
Suzanne Dupéron
1
Observe que --statabrevia caminhos longos; a largura é configurável, mas os histogramas agrupados são mais difíceis de ler. Outros formatos, como --numstatsempre, imprimem caminhos completos.
Home
@ ma11hew28 Obrigado. --numstatestá na linha 946 dessa página de manual a partir do git 2.22.00. São muito mais opções do que a maioria das pessoas precisa.
Restabelecer Monica - M. Schröder
139

NOTA: está obsoleto, use em vez disso git whatchangedgit log

Novos usuários são encorajados a usar o git-log [1] . O whatchangedcomando é essencialmente o mesmo que git-log [1], mas o padrão é mostrar a saída diff do formato bruto e pular mesclagens.

O comando é mantido principalmente por razões históricas; Dedos de muitas pessoas que aprenderam o Git muito antes de serem git loginventados lendo a lista de discussão do kernel do Linux são treinados para digitá-lo.


Você pode usar o comando git whatchanged --statpara obter uma lista de arquivos que foram alterados em cada confirmação (junto com a mensagem de confirmação).

Referências

mipadi
fonte
50

git show também é um ótimo comando.

É meio que parecido svn diff, mas você pode passar um guia de confirmação e ver essa diferença.

ptc
fonte
46

Se você deseja obter os nomes dos arquivos apenas sem o restante da mensagem de confirmação, pode usar:

git log --name-only --pretty=format: <branch name>

Isso pode ser estendido para usar as várias opções que contêm o nome do arquivo:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

Uma coisa a ser observada ao usar esse método é que existem algumas linhas em branco na saída que precisarão ser ignoradas. Usar isso pode ser útil se você quiser ver os arquivos que foram alterados em uma filial local, mas ainda não foram enviados para uma filial remota e não há garantia de que a última versão do controle remoto já tenha sido extraída. Por exemplo :

git log --name-only --pretty=format: my_local_branch --not origin/master

Mostraria todos os arquivos que foram alterados na ramificação local, mas ainda não foram mesclados à ramificação mestre no controle remoto.

Hazok
fonte
1
Nota no espaço em branco nos exemplos acima - é como git log --stat --pretty="format:" $branchName,. Então, por exemplo git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD),. Enquanto estou nisso, aqui está o encantamento exata que acabou sendo relevante para o meu propósito:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher
41

Eu uso isso diariamente para mostrar o histórico com arquivos que foram alterados:

git log --stat --pretty=short --graph

Para mantê-lo breve, adicione um alias no seu .gitconfig, fazendo:

git config --global alias.ls 'log --stat --pretty=short --graph'
xsor
fonte
O meu está muito próximo disso, git log --pretty = oneline --graph --name-status. Acho mais conciso, apenas mostrando a lista dos arquivos que foram alterados.
Peter Suwara
15

Eu uso isso:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

que gera apenas uma lista de arquivos e seus estados (adicionados, modificados e excluídos):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...
Sofia
fonte
7

git diff --stat HEAD^!mostra arquivos alterados e contagens de linhas adicionadas / removidas para o último commit ( HEAD).

Parece-me que não há um comando único para obter uma saída concisa que consiste apenas em nomes de arquivos e contagens de linhas adicionadas e removidas para vários commits de uma só vez, então criei meu próprio script bash para isso:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

Para ser chamado, por exemplo. ./changed_files 99para obter as alterações de forma concisa de HEADpara HEAD~99. Pode ser canalizado, por exemplo. para less.

nrz
fonte
Você não pode git diff --stat HEAD..mastermostrar a diferença entre HEAD e mestre, ou isso não existia quando você postou sua resposta em 2012?
precisa saber é o seguinte
1
A pergunta do @Ferrybig OP é sobre como "obter uma lista de arquivos alterados em cada confirmação" , não sobre a diferença entre HEADe master. Essas são duas coisas diferentes.
Nrz 11/08/19
4

Acho que o seguinte é a exibição ideal para listar quais arquivos foram alterados por confirmação em um formato conciso:

git log --pretty=oneline --graph --name-status
Peter Suwara
fonte
3

Um resumo de respostas com exemplo de saída

Isso está usando um repositório local com cinco confirmações simples.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <[email protected]>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <[email protected]>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <[email protected]>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <[email protected]>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <[email protected]>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


Créditos para @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc

JamesThomasMoon1979
fonte
0

Outro comando útil seria git diff-tree <hash>onde o hash também pode ser um intervalo de hash (indicado por <old>..<new>notação). Um exemplo de saída:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

Os campos são:

modo de origem, modo de destino, hash de origem, hash de destino, status, nome do arquivo

Status é o que você esperaria: D (excluído), A (adicionado), M (modificado) etc. Consulte a página do manual para obter uma descrição completa.

Omer Dagan
fonte
0

Eu geralmente os uso para obter os logs:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"
Gaurav
fonte
1
Eu não sabia sobre essas opções, mas este post seria mais útil se explicasse que filtra o log. Por um momento, pensei que era uma maneira de mudar a maneira como os autores são listados na saída.
Stein