Como Verificar se um Commit Git Modificou um Arquivo Específico

GitBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se um commit Git específico modificou um arquivo em particular. Exploraremos dois métodos diferentes para alcançar isso: usando o comando git show --name-only para uma visão geral rápida dos arquivos alterados e utilizando o comando git diff-tree, mais fundamental, com as opções relevantes para identificar modificações de arquivos dentro de um commit.

Através de exemplos práticos, você verá como esses comandos fornecem informações valiosas sobre as mudanças introduzidas por um commit, ajudando você a entender o escopo e o impacto dos commits históricos em seu repositório Git. Também testaremos esses métodos com arquivos não modificados para solidificar sua compreensão.

Executar git show --name-only

Nesta etapa, exploraremos como visualizar informações sobre um commit específico usando o comando git show. Este comando é incrivelmente útil para inspecionar os detalhes de um commit, incluindo as mudanças que ele introduziu.

Usaremos a opção --name-only com git show. Essa opção informa ao Git para mostrar apenas os nomes dos arquivos que foram alterados no commit, o que é uma maneira rápida de ver quais arquivos foram afetados.

Primeiro, vamos garantir que estamos no diretório do nosso projeto. Abra seu terminal e navegue até o diretório my-time-machine:

cd ~/project/my-time-machine

Agora, vamos usar git show com a opção --name-only para ver os arquivos alterados em nosso último commit. Lembre-se, nosso último commit foi aquele em que adicionamos message.txt.

git show --name-only HEAD

Aqui, HEAD é um ponteiro especial no Git que se refere ao commit mais recente em sua branch atual.

Você deve ver uma saída semelhante a esta:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

message.txt

A saída mostra os detalhes do commit (hash do commit, autor, data e mensagem) seguido pelo nome do arquivo que foi alterado neste commit, que é message.txt.

Usar git show --name-only é uma maneira rápida de obter um resumo de quais arquivos foram modificados em um commit específico sem ver o diff completo (as alterações reais dentro dos arquivos). Isso é útil quando você só quer saber o escopo de um commit.

Usar git diff-tree para Mudanças de Arquivos

Nesta etapa, exploraremos outra maneira de ver os arquivos alterados em um commit, usando o comando git diff-tree. Embora git show --name-only seja uma maneira comum, git diff-tree é um comando mais fundamental que mostra as diferenças entre dois objetos de árvore (que representam o estado do seu projeto em um commit específico).

Usaremos git diff-tree com as opções -r e --name-only. A opção -r torna o comando recursivo, o que significa que ele procurará em subdiretórios. A opção --name-only, semelhante a git show, listará apenas os nomes dos arquivos que são diferentes.

Primeiro, certifique-se de estar no diretório my-time-machine:

cd ~/project/my-time-machine

Agora, vamos usar git diff-tree para ver os arquivos alterados em nosso último commit. Precisamos do hash do commit (o identificador único) do commit. Você pode obtê-lo na saída de git log ou git show. Para nosso primeiro commit, você também pode usar HEAD.

git diff-tree -r --name-only HEAD

Você deve ver uma saída semelhante a esta:

message.txt

Esta saída é mais simples do que git show --name-only porque git diff-tree está principalmente focado em mostrar as diferenças entre as árvores, não os detalhes completos do commit. Quando usado com --name-only, ele apenas lista os arquivos que foram adicionados, excluídos ou modificados entre o pai do commit e o próprio commit. Como nosso primeiro commit não tinha pai, ele mostra os arquivos adicionados nesse commit.

Entender git diff-tree é útil porque é um comando de nível inferior que outros comandos Git frequentemente usam internamente. Ele ajuda você a entender como o Git rastreia as mudanças entre diferentes versões do seu projeto.

Testar com Arquivos Não Modificados

Nas etapas anteriores, vimos como git show --name-only e git diff-tree -r --name-only mostram os arquivos que foram alterados em um commit específico. Agora, vamos ver o que acontece quando executamos esses comandos em um commit onde nenhum arquivo foi modificado (o que não é o caso do nosso único commit, mas podemos simular a ideia).

Como nosso repositório atual tem apenas um commit onde um arquivo foi adicionado, executar esses comandos nesse commit sempre mostrará message.txt. Para ilustrar o conceito de mostrar apenas arquivos modificados, vamos imaginar que tínhamos um commit que não alterou nenhum arquivo (isso geralmente acontece com commits de merge ou commits que alteram apenas metadados, mas para este exercício, focaremos na saída quando nenhum arquivo for listado).

Se você executasse git show --name-only ou git diff-tree -r --name-only em um commit que não modificou nenhum arquivo, a saída para a parte dos nomes dos arquivos estaria vazia.

Vamos executar novamente os comandos que aprendemos para reforçar o conceito. Certifique-se de estar no diretório my-time-machine:

cd ~/project/my-time-machine

Execute git show --name-only novamente:

git show --name-only HEAD

A saída será semelhante a:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

message.txt

Agora execute git diff-tree -r --name-only novamente:

git diff-tree -r --name-only HEAD

A saída será:

message.txt

Ambos os comandos mostram corretamente message.txt porque esse arquivo foi introduzido neste commit. A principal conclusão aqui é que esses comandos são projetados para listar apenas os arquivos que foram alterados (adicionados, excluídos ou modificados) no commit especificado. Se um commit não alterar nenhum arquivo, esses comandos (especificamente a parte da listagem de arquivos) não mostrariam nada.

Este comportamento é importante para entender o escopo das mudanças introduzidas por um commit. Ele ajuda você a identificar rapidamente quais partes do seu projeto foram afetadas por uma alteração específica.

Resumo

Neste laboratório, aprendemos como verificar quais arquivos foram modificados em um commit Git específico. Exploramos dois métodos principais: usando git show --name-only e git diff-tree com as opções -r e --name-only.

Primeiro, usamos git show --name-only HEAD para ver rapidamente os nomes dos arquivos alterados no último commit, demonstrando sua utilidade para uma visão geral concisa. Posteriormente, introduzimos git diff-tree, um comando mais fundamental, e o usamos com as opções -r e --name-only para obter um resultado semelhante, destacando seu mecanismo subjacente para comparar objetos de árvore (tree objects). Finalmente, testamos esses comandos com commits que não modificaram um arquivo específico para confirmar seu comportamento e compreensão.