Introdução
Neste laboratório, você aprenderá como verificar se um arquivo existe no histórico de um repositório Git. Exploraremos dois métodos principais: usar o comando git ls-tree para inspecionar o conteúdo de um commit específico e utilizar git log com o caminho de um arquivo para visualizar o histórico de um arquivo em particular.
Através de exercícios práticos, você praticará o uso de git ls-tree para examinar os arquivos presentes em um snapshot de commit e empregará git log -- <file> para verificar a existência e o histórico de um arquivo. Também testaremos esses métodos com arquivos inexistentes para entender seu comportamento.
Executar git ls-tree para Verificar Arquivo
Nesta etapa, exploraremos como olhar dentro de nossa máquina do tempo Git usando o comando git ls-tree. Este comando nos permite ver o conteúdo de um commit específico, como olhar dentro de uma cápsula do tempo selada sem abri-la completamente.
Primeiro, vamos garantir que estamos no diretório do nosso projeto:
cd ~/project/my-time-machine
Agora, vamos usar git ls-tree para ver o conteúdo do nosso último commit. Precisamos do ID do commit, que você pode obter da saída de git log. Alternativamente, você pode usar HEAD, que se refere ao último commit.
git ls-tree HEAD
Você deve ver uma saída semelhante a esta:
100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 message.txt
Vamos detalhar esta saída:
100644: Este é o modo do arquivo, indicando que é um arquivo regular.blob: Isso nos diz que é um objeto "blob" no Git, que é como o Git armazena o conteúdo do arquivo.a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9: Este é o identificador único (hash) do objeto blob, representando o conteúdo exato do arquivomessage.txtno momento do commit.message.txt: Este é o nome do arquivo.
O comando git ls-tree é útil para inspecionar o conteúdo de um commit sem fazer o checkout desse commit. Ele mostra os arquivos e diretórios que faziam parte desse snapshot específico no tempo. Isso é diferente de git status, que mostra o estado atual do seu diretório de trabalho em comparação com o último commit.
Compreender git ls-tree ajuda você a ver como o Git armazena o histórico do seu projeto como uma série de snapshots, cada um com seu próprio conjunto de arquivos e diretórios.
Usar git log -- Arquivo para Verificação
Na etapa anterior, usamos git ls-tree para ver o conteúdo de um commit. Agora, vamos explorar outra maneira de visualizar o histórico relacionado a um arquivo específico usando git log com o caminho do arquivo.
Certifique-se de que você ainda está no diretório do seu projeto:
cd ~/project/my-time-machine
Agora, vamos usar git log para ver o histórico do nosso arquivo message.txt:
git log -- message.txt
Você deve ver a entrada de log para o commit onde criamos message.txt:
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Your Name <your.email@example.com>
Date: Mon Aug 7 10:00:00 2023 +0000
Send a message to the future
A parte -- message.txt do comando diz ao git log para mostrar apenas os commits que afetaram o arquivo message.txt. Isso é incrivelmente útil quando você tem um projeto grande com muitos arquivos e deseja ver apenas o histórico de um arquivo específico.
Este comando ajuda você a responder a perguntas como:
- Quando este arquivo foi criado?
- Quem fez a última alteração neste arquivo?
- Quais foram as alterações feitas neste arquivo em um commit específico?
À medida que seu projeto cresce e você faz mais commits, usar git log -- <file> se tornará essencial para entender o histórico e a evolução de arquivos individuais dentro do seu projeto.
Pressione q para sair da visualização do log.
Testar Arquivos Inexistentes
Nas etapas anteriores, usamos com sucesso git ls-tree e git log -- <file> para inspecionar um arquivo que existe em nosso repositório Git. Agora, vamos ver o que acontece quando tentamos usar esses comandos em um arquivo que não existe no histórico do repositório.
Certifique-se de que você está no diretório do seu projeto:
cd ~/project/my-time-machine
Primeiro, vamos tentar usar git ls-tree em um arquivo não existente, por exemplo, nonexistent.txt:
git ls-tree HEAD nonexistent.txt
Você não deve ver nenhuma saída. Isso ocorre porque git ls-tree lista apenas as entradas que estão presentes na árvore especificada (neste caso, a árvore em HEAD). Como nonexistent.txt não está na árvore do último commit, ele não mostra nada.
Agora, vamos tentar usar git log no mesmo arquivo não existente:
git log -- nonexistent.txt
Você deve ver uma saída semelhante a esta:
fatal: no such path 'nonexistent.txt' in HEAD
Este é um comportamento diferente! git log -- <file> procura especificamente por commits que afetaram o caminho do arquivo fornecido ao longo do histórico. Se o caminho do arquivo nunca existiu em nenhum commit, o Git informa que "no such path" (não existe tal caminho).
Essa diferença de comportamento destaca como esses comandos funcionam:
git ls-treeinspeciona um snapshot específico (commit) e lista seu conteúdo.git log -- <file>pesquisa o histórico inteiro por alterações relacionadas a um caminho de arquivo específico.
Compreender essas diferenças ajuda você a escolher o comando certo para a tarefa. Se você deseja ver quais arquivos estavam em um commit, use git ls-tree. Se você deseja ver o histórico de um arquivo, use git log -- <file>.
Resumo
Neste laboratório, aprendemos como verificar se um arquivo existe dentro do histórico de um repositório Git sem fazer o checkout de commits específicos. Primeiro, exploramos o comando git ls-tree, que nos permite inspecionar o conteúdo de um commit específico (como HEAD) e ver os arquivos e seus respectivos hashes de blob. Este comando fornece um snapshot do repositório em um ponto específico no tempo, mostrando os modos de arquivo, tipos de objeto, IDs de objeto e nomes de arquivo.
Em seguida, começamos a explorar o uso de git log com o caminho de um arquivo para visualizar o histórico de commits especificamente relacionado a esse arquivo. Este método nos permite ver quando um arquivo foi adicionado, modificado ou excluído, fornecendo uma perspectiva diferente sobre sua existência na linha do tempo do repositório.



