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)

listar os arquivos de um commit capa

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
Formação Recomendada

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

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação SAAS com IA

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