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.

  1. O Blob armazena o texto ou os dados reais do seu arquivo.
  2. A Tree mapeia esse blob para um nome de arquivo e um caminho de pasta específicos.
  3. 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:

  1. Inicialize um repo:
mkdir git-lab
cd git-lab
git init
  1. Crie um arquivo e encontre seu hash:
echo 'Hello Git' > hello.txt
git hash-object hello.txt
  1. Armazene o arquivo como um blob:
git hash-object -w hello.txt
  1. Verifique o tipo e o conteúdo do objeto:
git cat-file -t [YOUR_HASH]
git cat-file -p [YOUR_HASH]
  1. 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