Como listar os arquivos de um commit no git
Neste artigo você vai aprender a como listar os arquivos de um commit no git, verificando todos os alterados no commit
Pra listar os arquivos alterados em um commit no git o comando é:
git diff-tree –no-commit-id –name-only -r <hash_do_commit>
Cada flag tem um papel: –no-commit-id tira o id do commit da saída, –name-only deixa só os nomes dos arquivos e -r entra nas sub-árvores, devolvendo o caminho completo em vez de só o diretório de primeiro nível
Se você trocar –name-only por –name-status, cada arquivo vem acompanhado da letra de status: A (adicionado), C (copiado), D (removido), M (modificado), R (renomeado), T (mudança de tipo), U (não mesclado) e X (tipo desconhecido)
Uma alternativa que dá a mesma lista de nomes é o git show –pretty="" –name-only <hash_do_commit>
E atenção nos dois casos em que a saída vem vazia: commit de merge (use -m ou -c) e commit inicial do repositório (use –root)

Fala programador(a), beleza? Bora aprender mais os branches, commit e também git!
Para realizar esta ação vamos utilizar o comando git diff-tree
Precisaremos de algumas flags para trazer a informação limpa e de forma objetiva
- –no-commit-id: não mostrar o id do commit;
- –name-only: exibe o nome só dos arquivos alterados;
- -r: alcança arquivos de sub-trees;
Então o comando completo fica:
git diff-tree --no-commit-id --name-only -r <hash_do_commit>
Onde <hash_do_commit> deve ser substituído pela hash do seu commit alvo
As hashs podem ser encontrados pelo comando git log, que lista todas as hashes dos commits já realizados
Você também pode substituir a flag –name-only por –name-status, que vai te dar mais informações da mudança que ocorreu em cada arquivo
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Quer aprender mais sobre git? Veja este curso gratuito:
Desta maneira você reberá três dados possíveis diferentes:
- M: para arquivos que foram modificados;
- D: Para arquivos removidos;
- A: Para arquivos adicionados;
E então assim você consegue obter os arquivos que foram modificados baseado no commit que você precisa checar
Conclusão
Neste artigo você aprendeu a como listar os arquivos de um commit em git
Utilizamos o comando git diff-tree, que com algumas flags chega em um resultado bem interessante
O arquivo é baseado na hash do commit que queremos checar, este é o argumento que define o que vem como resposta
Confira nossos cursos gratuitos no Youtube, com vídeos todos os dias!
Se inscreva e ative o sininho para receber as notificações e aprender mais ainda sobre desenvolvimento web!
Veja também nosso catálogo de cursos na Udemy, todos com exercícios e projetos práticos, nas mais diversas tecnologias
O link acima contém um cupom de desconto para os cursos!
Todas as letras de status do –name-status:
Aquelas três letras são as que tu mais vai ver no dia a dia, mas a saída do –name-status tem mais opções que isso
A lista completa é essa:
A: arquivo adicionado
C: arquivo copiado
D: arquivo removido
M: arquivo modificado
R: arquivo renomeado
T: mudou o tipo do arquivo
U: arquivo não mesclado
X: tipo de mudança desconhecido (se aparecer, provavelmente é bug)
Se liga num detalhe que confunde muita gente: o C e o R vêm SEMPRE acompanhados de um score, que é o percentual de similaridade entre o arquivo antigo e o novo
E o M também pode vir com um score, o de dissimilaridade, quando o arquivo foi praticamente reescrito
Ou seja, ver algo como R100 na frente do nome não é erro, é o git te dizendo o quanto aquele arquivo continuou parecido =)
O comando não retornou nada, e agora? (commit de merge)
Tome cuidado com esse aqui, porque parece que o comando quebrou e não quebrou
Por padrão o git diff-tree não mostra diferenças para commits de merge, então a saída vem vazia mesmo
Pra ver os arquivos de um merge você tem dois caminhos:
git diff-tree -m –no-commit-id –name-only -r <hash_do_commit>
O -m mostra a diferença em relação a cada um dos pais do merge
git diff-tree -c –no-commit-id –name-only -r <hash_do_commit>
Já o -c mostra o diff combinado, listando só os arquivos que foram modificados em relação a TODOS os pais
Na prática: quer ver tudo que entrou pelo merge, vai de -m
Quer só o que foi resolvido de fato ali no merge (conflito na mão, por exemplo), vai de -c
E o primeiro commit do repositório?
Mesma pegadinha, motivo diferente
O commit inicial (o famoso root commit) não tem pai pra comparar, então o git diff-tree também devolve vazio nele
A solução é a flag –root:
git diff-tree –root –no-commit-id –name-only -r <hash_do_commit_inicial>
Com o –root o git trata aquele commit como um grande evento de criação, e aí sim ele lista os arquivos que nasceram ali
Já me ferrei achando que o repositório estava corrompido por causa disso haha
Fazendo o mesmo com git show:
O git diff-tree é o comando mais indicado quando você vai jogar essa saída dentro de um script, porque ele devolve os nomes limpos e mais nada
Mas se tu só quer olhar rapidinho no terminal, o git show resolve também
git show –pretty="" –name-only <hash_do_commit>
Aquele –pretty="" vazio é o que derruba o cabeçalho do commit (autor, data, mensagem) e te deixa só a lista de nomes
Quer o status junto?
git show –name-status <hash_do_commit>
E se você quiser os arquivos com o resumo de linhas em vez do diff inteiro rolando na tela:
git show –stat <hash_do_commit>
Esse último é meu preferido pra revisar commit dos outros antes de dar merge
Listar TODOS os arquivos do commit, e não só os alterados:
Aqui mora uma confusão clássica, e vale parar pra separar as duas coisas
Tudo que a gente viu até agora lista o que MUDOU naquele commit
Se o que tu quer é ver todos os arquivos que existiam no projeto naquele ponto da história, o comando é outro:
git ls-tree -r –name-only <hash_do_commit>
O -r entra nas sub-árvores e o –name-only tira o resto da informação, deixando só os caminhos
Um detalhe que pega desavisado: os caminhos saem relativos ao diretório em que você está
Se tu rodou de dentro de uma subpasta e a saída veio estranha, use assim:
git ls-tree -r –name-only –full-tree <hash_do_commit>
O –full-tree ignora onde você está e devolve tudo a partir da raiz do repositório
E o git log tem um atalho bacana pra esse mesmo problema:
git log -1 –name-only <hash>
Ele mostra o commit e, junto, os nomes dos arquivos daquele commit
Não é tão limpo quanto o git diff-tree pra script, porque vem com o cabeçalho do commit junto, mas pra uma olhada rápida quebra o galho
Uma coisa que eu repito muito quando gravo aula de terminal, lá no curso de Linux, é que quase todo comando é a mesma receita: comando + parâmetro
No ls é assim, tu tem o comando cru que mostra o básico, aí bota -l e a saída vira uma porrada de informação detalhada, bota -a e aparece o que estava escondido, e ainda dá pra unir os parâmetros na mesma linha
O git diff-tree segue exatamente essa lógica, e é por isso que eu prefiro ensinar flag por flag em vez de mandar o leitor decorar a linha inteira
Quando você entende que –no-commit-id só está limpando a saída, que –name-only está escolhendo O QUE aparece e que -r está escolhendo ATÉ ONDE ele desce na árvore, você para de copiar comando da internet e passa a montar o seu
Então faça o teste no seu repositório: roda o comando sem o -r e depois com o -r no mesmo commit, e compara as duas saídas
A diferença entre ver só a pasta de primeiro nível e ver o caminho completo aparece na hora, e isso gruda muito mais do que qualquer explicação minha aqui =)
Perguntas frequentes
Como listar os arquivos alterados em um commit no git?
Use git diff-tree –no-commit-id –name-only -r <hash_do_commit>
A saída é só a lista dos nomes dos arquivos que aquele commit mudou, sem id de commit e sem diff, que é justamente o formato que você joga dentro de um script sem precisar tratar nada
Para que serve cada flag do git diff-tree?
–no-commit-id não imprime o id do commit na saída
–name-only mostra apenas os nomes dos arquivos alterados, sem o resto da informação de diff
-r entra recursivamente nas sub-árvores, devolvendo o caminho completo dos arquivos em vez de parar no diretório de primeiro nível
Como ver o status de cada arquivo (modificado, removido, adicionado)?
Troque –name-only por –name-status
Aí cada linha vem com uma letra na frente do nome: A (adicionado), C (copiado), D (removido), M (modificado), R (renomeado), T (mudou o tipo do arquivo), U (não mesclado) e X (tipo de mudança desconhecido)
C e R vêm sempre com um score de similaridade junto, e o M pode vir com um score de dissimilaridade quando o arquivo foi praticamente reescrito
Por que o git diff-tree não retorna nada no meu commit?
Quase sempre é um destes dois casos
Se for um commit de merge, o git diff-tree não mostra diferenças por padrão, então a saída vem vazia mesmo
Se for o commit inicial do repositório, ele não tem pai pra comparar e você precisa da flag –root
Como listar os arquivos de um commit de merge?
Use git diff-tree -m –no-commit-id –name-only -r <hash_do_commit> pra ver a diferença em relação a cada um dos pais do merge
Ou git diff-tree -c –no-commit-id –name-only -r <hash_do_commit> pro diff combinado, que lista só os arquivos modificados em relação a todos os pais
Como listar os arquivos do primeiro commit do repositório?
Adicione a flag –root: git diff-tree –root –no-commit-id –name-only -r <hash_do_commit_inicial>
Com ela o git trata o commit inicial como um grande evento de criação e lista os arquivos normalmente
Dá pra listar os arquivos de um commit com git show?
Dá sim
git show –pretty="" –name-only <hash_do_commit> devolve a mesma lista de nomes sem o cabeçalho do commit
git show –name-status <hash_do_commit> traz os nomes com o status de cada um
E git show –stat <hash_do_commit> mostra os arquivos com o resumo de linhas em vez do diff completo
Como listar todos os arquivos que existem em um commit, e não só os alterados?
Aí o comando é outro: git ls-tree -r –name-only <hash_do_commit>
O -r entra nas sub-árvores e o –name-only deixa só os caminhos
Lembrando que os caminhos saem relativos ao diretório em que você está, então se quiser tudo a partir da raiz do repositório use também o –full-tree
Como descobrir a hash do commit?
Pelo git log, que lista o histórico com as hashes dos commits já feitos
E ele mesmo já resolve o problema numa tacada: git log -1 –name-only <hash> lista os nomes dos arquivos daquele commit, só que com o cabeçalho do commit junto
Leia também
Formações
Formação SAAS com IA
Tire usas ideias do papel criando softwares com IA, integre pagamentos e lance seu projeto!
- 291 aulas
- 18 projetos
- 24h 17min
Blog | Mais populares

As diferenças de var, let e const

Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]

ChatGPT: o que é, como usar, dicas e como acessar login
ChatGPT é uma ferramenta de processamento de linguagem natural (NLP) baseada na arquitetura GPT-3.5, desenvolvida pela OpenAI. Sua criação representa um marco significativo no campo […]
