Exploração

📦 Como o Git funciona por dentro

O Git não guarda diffs. Ele é um banco de objetos endereçados por conteúdo: cada arquivo, cada commit e cada diretório vira um objeto imutável identificado pelo SHA-1 do seu conteúdo. Clique nos nós abaixo para explorar como um pequeno repositório é representado internamente.

① Intuição

Pense no Git como um banco de dados de snapshots, não de diferenças. Quando você faz git commit, o Git não calcula "o que mudou" — ele tira uma foto completa do estado atual e salva cada arquivo como um blob, cada diretório como uma tree e o commit em si como outro objeto que aponta para a tree raiz.

A mágica: dois commits que compartilham um arquivo sem mudanças apontam para o mesmo blob. Não há cópia. O endereçamento por hash garante isso.

② Visualização — grafo de objetos

Este repositório tem 2 commits. O segundo alterou o README mas não tocou em main.py — veja como as duas trees compartilham o mesmo blob.

treeparenttreeREADMEmain.pyREADMEmain.pycommitc4b5a6commitf1e2d3tree6d7e8ftree3a4b5cblobg7h8i9blobd4e5f6bloba1b2c3
📦 commitc4b5a6
tree 6d7e8f
parentf1e2d3
Update README
Clique em qualquer objeto para inspecionar
📦 commit📁 tree📄 blob— linha amarela: blob compartilhado

③ Explicação técnica

Ao rodar git init, uma pasta .git/ é criada — ela é o banco de dados inteiro:

$ git init meu-projeto
$ cd meu-projeto

# .git/ é criado — tudo vive aqui
.git/
  objects/   ← banco de objetos (commits, trees, blobs)
  refs/      ← ponteiros nomeados (branches, tags)
  HEAD       ← "você está aqui"

Quando você faz git add, o Git computa o hash do conteúdo do arquivo e salva um blob no object store:

# Você escreve um arquivo
$ echo "print('hello')" > main.py

# git add calcula o SHA-1 do conteúdo e salva
$ git add main.py
# → cria .git/objects/d4/e5f6... (blob)

# O staging area (index) mapeia nome → hash
$ git ls-files --stage
100644 d4e5f6... 0  main.py

O endereçamento por conteúdo (content-addressed storage) é a ideia central:

# Objetos são identificados pelo SHA-1 do conteúdo
import hashlib

conteudo = b"blob 14\0print('hello')\n"
sha1 = hashlib.sha1(conteudo).hexdigest()
# → "d4e5f6abc..."

# Consequência: mesmo conteúdo = mesmo hash
# git NUNCA duplica blobs idênticos

Os 4 tipos de objeto

TipoConteúdoGerado por
blobBytes de um arquivogit add
treeLista de (modo, nome, hash)git commit
committree + parent + autor + mensagemgit commit
tagPonteiro nomeado para um commitgit tag -a

④ Projeto

Inspecione um repositório real:

  1. Entre em qualquer repo Git: cd meu-projeto
  2. Veja os últimos 3 commits: git log --oneline -3
  3. Inspecione um commit pelo hash: git cat-file -p <hash>
  4. Inspecione a tree que ele aponta: git cat-file -p <tree-hash>
  5. Leia um blob: git cat-file -p <blob-hash>
  6. Verifique um arquivo que não mudou em 2 commits — o hash do blob é idêntico!

⑤ Perguntas rápidas

⑥ Aplicações no mundo real