Como listar apenas os nomes de arquivo que foram alterados entre dois commits?


Respostas:


2666
git diff --name-only SHA1 SHA2

em que você só precisa incluir o SHA suficiente para identificar as confirmações. Você também pode fazer, por exemplo

git diff --name-only HEAD~10 HEAD~5

para ver as diferenças entre a décima última confirmação e a quinta mais recente (mais ou menos).


152
Isso funciona para o git show também. git show --name-only SHA1.
August Lilleaas

78
git diff --name-status [TAG|SHA1]mostra quais operações foram feitas nos arquivos também
reconbotou 28/09

2
você também pode fazer: git diff --name-only HEAD @ {3} HEAD @ {0} para as confirmações exatas que você deseja comparar.
b01 29/11

7
@AugustLilleaas realmente utilizando a apresentação só irá mostrar os 2 commits específicos, se você tem commits entre os 2 que será deixado de fora
chrisan

4
Conforme observado abaixo, git diff --name-statusparece não querer mostrar arquivos adicionados. @sschuberth apontou git show, que parece funcionar corretamente para mim: git show --pretty=format: --name-status. Apenas fazendo git show --name-statusdá um pouco mais informação, mas ainda agradável e densa ... que vai ser meu novo comando Goto;)
travc

417
git diff --name-status [SHA1 [SHA2]]

é como --name-only, exceto que você obtém um prefixo simples informando o que aconteceu com o arquivo (modificado, excluído, adicionado ...)

git log --name-status --oneline [SHA1..SHA2]

é semelhante, mas as confirmações são listadas após a mensagem de confirmação, para que você possa ver quando um arquivo foi alterado.

  • se você estiver interessado no que aconteceu com determinados arquivos / pastas, pode anexar -- <filename> [<filename>...]à git logversão.

  • se você quiser ver o que aconteceu com uma única confirmação, chame-a de SHA1 e faça
    git log --name-status --oneline [SHA1^..SHA1]

Sinalizadores de status do arquivo:
M modificado - O arquivo foi modificado
C copy-edit - O arquivo foi copiado e modificado
R rename-edit - O arquivo foi renomeado e modificado
A adicionado - O arquivo foi adicionado
D excluído - O arquivo foi excluído
U O arquivo tem conflitos após uma mesclagem


Por acaso, digo git diff --name-status e deu o 'arquivo adicionado'.
aartist

1
Para o git log, ele precisa ter dois pontos entre os SHAs, como SHA1..SHA2, e o segundo SHA não é opcional, portanto, deve ser assim: git log --name-status --oneline [SHA1 .. SHA2]
twasbrillig

Existe uma maneira de excluir certos arquivos / determinados tipos de arquivo?
ago

3
A --relative[=<path>]opção pode ajudá-lo, não tenho certeza. Caso contrário, há sempre | erep -v '(.tmp|.foo|.dontwant)$'... #
1869

80

Parece que ninguém mencionou a opção --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Há também --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

e --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)

4
A resposta aceita está correta, mas isso é super útil e fornece algumas informações extras. Obrigado!
kontur

2
Concordou que esta é uma resposta mais útil, pois contém as estatísticas diff.
Internetross

52

Mas, para ver os arquivos alterados entre o seu ramo e seu ancestral comum com outro ramo (por exemplo, origem / mestre):

git diff --name-only `git merge-base origin/master HEAD`

1
Isso foi realmente útil! Eu gostaria de poder simplesmente dizer git diffstatus masterou algo semelhante, que desencadeia o acima.
oma

3
Or git show --pretty=format: --name-only origin/master...
precisa saber é o seguinte

Talvez você não consiga torná-lo um alias do git, mas definitivamente pode colocá-lo no seu .bashrc.
25416 Fred Fred

3
Ou ainda mais simples: git diff --name-only HEAD...master(observe os três pontos). Para uma explicação detalhada, veja aqui .
ostrokach

1
Parece a resposta mais correta! Simples git diff --name-only master..branchnão corresponde à lista PR do github. Desta forma, mais preciso. Mas de qualquer maneira eu tenho 173 arquivos cantados vs 171 no github PR. (sem merge-baseeu ter 228 vs 171)
x'ES

21

Para complementar a resposta de @ artfulrobot, se você quiser mostrar os arquivos alterados entre dois ramos:

git diff --name-status mybranch..myotherbranch

Tenha cuidado na precedência. Se você colocar o ramo mais novo primeiro, ele mostrará os arquivos como excluídos em vez de adicionados.

Adicionar um greppode refinar ainda mais as coisas:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Isso mostrará apenas os arquivos adicionados myotherbranch.


4
Regexes são bons e pode realmente fazer quase qualquer coisa. Neste caso, no entanto, também existe o --diff-filterque fornece essa funcionalidade nativamente, o que significa menos chances de resultados incorretos (por exemplo, falsos positivos).
Jasper

8

Adicione o alias abaixo ao seu e ~/.bash_profile, em seguida, execute source ~/.bash_profile; agora a qualquer momento, você precisa ver os arquivos atualizados no último commit, run, a showfilespartir do seu repositório git.

alias showfiles='git show --pretty="format:" --name-only'

2
Ou git config --global alias.showfiles 'show --pretty="format:" --name-only'para fazer git showfiles.
Cgmb # 9/17

7

Isso mostrará as alterações nos arquivos:

git diff --word-diff SHA1 SHA2

5

Observe também, se você deseja apenas ver os arquivos alterados entre o último commit e o anterior. Isso funciona bem:git show --name-only


3

Use git log --pretty = oneline> C: \ filename.log

que registrará apenas um on-line (--pretty = on-line) que é o nome do arquivo alterado. Também registrará todos os detalhes no seu arquivo de saída.


git log --pretty=onelinedá-me apenas o SHA e a mensagem de confirmação usando o git 2.10.1
damd

3

Como artfulrobot disse em sua resposta:

git diff --name-status [SHA1 [SHA2]]

Meu exemplo:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png

3

Apenas para alguém que precisa se concentrar apenas em arquivos Java, esta é a minha solução:

 git diff --name-status SHA1 SHA2 | grep '\.java$'

1

O seguinte funciona bem para mim:

$ git show --name-only --format=tformat: SHA1..SHA2

Também pode ser usado com um único commit:

git show --name-only --format=tformat: SHA1

o que é útil para uso no Jenkins, onde você recebe uma lista de SHAs de changeSet e deseja iterar sobre eles para ver quais arquivos foram alterados.

Isso é semelhante a algumas das respostas acima, mas usar tformat:ao invés de format:remover o espaço separador entre confirmações.


0

Com base em git diff --name-statuseu escrevi a extensão git-diffview git que processa uma visualização em árvore hierárquica do que mudou entre dois caminhos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.