Por dentro do Git: Objetos e Hashing
O Git é rápido e confiável devido à forma como armazena os dados. Para dominar o Git, você deve entender o diretório .git. Esta pasta oculta contém tudo o que o Git precisa para rastrear seu projeto.
O Git utiliza quatro tipos principais de objetos para gerenciar seu trabalho:
- Blobs: Eles armazenam o conteúdo dos arquivos.
- Trees: Elas armazenam estruturas de diretórios e nomes de arquivos.
- Commits: Eles armazenam snapshots do seu projeto e metadados.
- Tags: Elas armazenam referências a versões específicas.
O Git identifica tudo usando hashing. Ele utiliza o algoritmo SHA-1 para transformar dados em um ID exclusivo. Esse ID funciona como uma impressão digital. Se você alterar um único caractere em um arquivo, o hash mudará completamente.
Como o Git constrói um snapshot:
Quando você faz o commit de um arquivo, o Git cria uma cadeia de objetos.
- O Blob armazena o texto ou os dados reais do seu arquivo.
- A Tree mapeia esse blob para um nome de arquivo e um caminho de pasta específicos.
- O Commit vincula a tree a um autor, um timestamp e uma mensagem.
O Git não armazena alterações ou "deltas". Ele armazena snapshots. Cada vez que você faz um commit, o Git cria novos objetos. Isso torna seu histórico imutável e fácil de recuperar.
Compreender essa estrutura ajuda você a corrigir erros, recuperar dados perdidos e gerenciar branches complexas.
Tente este mini projeto para vê-lo em ação:
- Inicialize um repo:
mkdir git-lab
cd git-lab
git init
- Crie um arquivo e encontre seu hash:
echo 'Hello Git' > hello.txt
git hash-object hello.txt
- Armazene o arquivo como um blob:
git hash-object -w hello.txt
- Verifique o tipo e o conteúdo do objeto:
git cat-file -t [YOUR_HASH]
git cat-file -p [YOUR_HASH]
- Crie um commit e veja a tree:
git add hello.txt
git commit -m 'Initial commit'
git ls-tree HEAD
Ao olhar sob o capô, você vê que o Git é mais do que apenas uma ferramenta de controle de versão. É um banco de dados altamente organizado de objetos endereçados por conteúdo.
Fonte: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc
Comunidade de aprendizado opcional: https://t.me/GyaanSetuAi
