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

1954

Eu tenho um monte de commits no repo. Quero ver uma lista de arquivos alterados entre duas confirmações - de SHA1 para SHA2.

Que comando devo usar?

Shawn
fonte
3
Para uma consolidação e seu pai: stackoverflow.com/questions/424071/...
Ciro Santilli郝海东冠状病六四事件法轮功

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).

Pedro
fonte
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

artfulrobot
fonte
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(-)
leeyuiwah
fonte
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`
Tim James
fonte
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.

Max MacLeod
fonte
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'
Zorayr
fonte
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
Julio Marins
fonte
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

Parris
fonte
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.

Agni
fonte
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
Jaime Montoya
fonte
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$'
K. Símbolo
fonte
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.

blindsnowmobile
fonte
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.

Bernard Opic
fonte