Como obter uma lista de todos os arquivos que foram alterados entre dois commit do Git?

178

Devido à burocracia, preciso obter uma lista de todos os arquivos alterados no meu repositório para um relatório (comecei com o código-fonte existente).

O que devo executar para obter esta lista?

Chen Kinnrot
fonte
34
"devido à burocracia" xD
ptim

Respostas:

238

Para arquivos alterados entre um determinado SHA e seu commit atual:

git diff --name-only <starting SHA> HEAD

ou se você deseja incluir arquivos alterados, mas ainda não confirmados:

git diff --name-only <starting SHA>

De maneira mais geral, a sintaxe a seguir sempre informa quais arquivos foram alterados entre duas confirmações (especificadas por seus SHAs ou outros nomes):

git diff --name-only <commit1> <commit2>
Âmbar
fonte
2
e se você quiser saber os arquivos modificados para um determinado cometer fazer:git diff --name-only <SHA> <SHA>^
thebugfinder
3
Usar o --name-statussinalizador em vez de --name-onlyé útil para obter uma lista de arquivos e ver seu status de modificação, como Adicionado ou Modificado.
Thane Plummer
@Amber deve mencionar as notas de @Thane Plummer que --name-statusmostra o que aconteceu a eles
Zoltán Süle
64

Para encontrar os nomes de todos os arquivos modificados desde seu último commit:

git diff --name-only

Ou (para obter mais informações, incluindo arquivos não rastreados):

git status
Tim Bellis
fonte
48
  • Para listar todos os arquivos alterados rastreados em estágios :

    git diff --name-only
    
  • Para listar todos os arquivos alterados rastreados em estágios :

    git diff --name-only --staged
    
  • Para listar todos os arquivos alterados rastreados em estágios e não em estágios :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Para listar todos os arquivos não rastreados (os listados por git status, para não incluir nenhum arquivo ignorado):

    git ls-files --other --exclude-standard
    

Se você estiver usando isso em um shell script, e você quer verificar programaticamente se estes comandos retornou nada, você vai estar interessado em git diff's --exit-codeopção.

Flimm
fonte
16

Quando adicionei / modifiquei / excluí muitos arquivos (desde a última confirmação), gosto de ver essas modificações em ordem cronológica.

Para isso eu uso:

  • Para listar todos os arquivos não faseados:

    git ls-files --other --modified --exclude-standard
    
  • Para obter a data da última modificação de cada arquivo:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Embora ruvim sugira nos comentários :

xargs -0 stat -c '%y %n' -- 
  • Para classificá-los do mais antigo para o mais recente:

    sort
    

Um alias facilita o uso:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Ou (mais curto e mais eficiente, graças ao ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Por exemplo:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Agora posso revisar minhas modificações, da mais antiga para a mais recente.

VonC
fonte
Por que não usar xargse chamada única stat? O one-liner completo:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim 15/11/19
@ruvim Obrigado. Muito boa sugestão. Eu editei a resposta para incluir seu comentário, para ter mais visibilidade.
VonC 15/11/19
4

Eu preciso de uma lista de arquivos que alteraram o conteúdo entre dois commits (adicionados ou modificados apenas), então usei:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

As diferentes opções de filtro diff da documentação do git diff :

filtro diff = [(A | C | D | M | R | T | U | X | B)… [*]]

Selecione apenas os arquivos adicionados (A), copiados (C), excluídos (D), modificados (M), renomeados (R), com o tipo (por exemplo, arquivo normal, link simbólico, submódulo, ...) alterado (T), não estão imersos (U), são desconhecidos (X) ou tiveram seu emparelhamento quebrado (B). Qualquer combinação dos caracteres de filtro (incluindo nenhum) pode ser usada. Quando * (Tudo ou nenhum) é adicionado à combinação, todos os caminhos são selecionados se houver algum arquivo que corresponda a outros critérios na comparação; se não houver arquivo que corresponda a outros critérios, nada será selecionado.

Além disso, essas letras maiúsculas podem ser excluídas para excluir. Por exemplo, --diff-filter = ad exclui caminhos adicionados e excluídos.

Se você deseja listar também o status (por exemplo, A / M), mude --name-onlypara --name-status.

Forragem
fonte
3

A lista de estágios modificados pode ser obtida usando git statuso grepcomando abaixo. Algo como git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....
Super Nova
fonte
Note que isso só pode ser utilizado para alterações unstaged, então ele não é útil para 'arquivos que mudou entre dois commits git'
John Vandenberg
2

Com git showvocê pode obter um resultado semelhante. Para consultar o commit (como parece na git logvisualização) com a lista de arquivos incluídos, use:

git show --name-only [commit-id_A]^..[commit-id_B]

Onde [commit-id_A]está o commit inicial e [commit-id_B]o último commit que você deseja mostrar.

Atenção especial com o ^símbolo. Se você não colocar isso, as informações de commit-id_A não serão implantadas.

Kurapika
fonte
1

Se você quiser verificar os arquivos alterados, precisará cuidar de muitas pequenas coisas, como qual será o melhor para usar, como se você quiser verificar quais arquivos foram alterados, apenas digite

status git - mostrará os arquivos com alterações

se você quiser saber quais alterações devem ser feitas, ele pode ser verificado de maneiras,

git diff - mostrará todas as alterações em todos os arquivos

só é bom quando apenas um arquivo é modificado

e se você quiser verificar um arquivo específico, use

git diff

Saurabh Pal
fonte