Oque é Git
O que é¶
Git é um sistema de versionamento distribuído baseado em conteúdo endereçável por hash. Em operação DevOps, ele não versiona apenas aplicação, mas também infraestrutura, manifests Kubernetes, pipelines e runbooks.
Esta nota cobre:
- Git internals (blob, tree, commit).
- rebase vs merge.
- hooks, bisect, reflog.
- Estratégias avançadas de branching e versionamento.
Por que isso existe¶
Sem padrão de versionamento, o time perde rastreabilidade, dificulta rollback e aumenta lead time. Em ambientes com CI/CD e GitOps, o Git vira o mecanismo de auditoria e controle de mudança.
Problemas que este guia reduz: - Conflitos frequentes por branches longas. - Históricos confusos com merges não intencionais. - Releases sem convenção de versão. - Dificuldade em descobrir qual commit quebrou produção.
Como funciona internamente¶
Git internals: blobs, trees e commits¶
commit
├─ metadata (author, committer, message, parent)
└─ tree (snapshot da raiz)
├─ blob (conteúdo de arquivo)
└─ tree (subdiretório)
- Blob: conteúdo bruto de um arquivo.
- Tree: índice de nomes e permissões apontando para blobs/trees.
- Commit: ponteiro para uma tree + metadados + commit pai.
Comandos para inspecionar objetos:
git cat-file -t <hash>
git cat-file -p <hash>
git ls-tree -r HEAD
Merge vs Rebase¶
- Merge preserva a topologia real (cria commit de merge).
- Rebase reaplica commits em outra base (histórico linear).
Exemplo:
# Atualizar branch de feature com main
git checkout feat/api-timeout
git fetch origin
git rebase origin/main
# Resolver conflitos e continuar
git rebase --continue
Recomendação prática:
- Use rebase local para manter histórico limpo antes de abrir PR.
- Use merge commit ou squash merge conforme política do repositório.
Advanced workflows¶
- Trunk-based: branch curta (1-2 dias), merge frequente, feature flags.
- GitFlow: útil em times com release train e versionamento rígido.
- Release branch: estabilização antes de promover para produção.
- Hotfix branch: correção imediata a partir de
main/tag de produção.
Exemplos práticos¶
Conventional Commits + SemVer¶
feat:incrementa MINOR.fix:incrementa PATCH.feat!ouBREAKING CHANGE:incrementa MAJOR.
Exemplos:
feat(api): adiciona paginação por cursor
fix(worker): corrige retry exponencial
feat!: remove endpoint /v1/legacy
Boas práticas¶
- Proteja
maincom PR obrigatório e checks obrigatórios. - Exija commits assinados (GPG/Sigstore) em repositórios críticos.
- Padronize mensagem de commit com Conventional Commits.
- Prefira branches curtas para reduzir conflito.
- Use tags anotadas para releases (
git tag -a v1.4.0 -m "release").
Armadilhas comuns¶
- Rebase em branch compartilhada sem alinhamento com o time.
- Merge de PR sem rodar testes obrigatórios.
- Usar
git push --forcesem--force-with-lease. - Tratar
reflogcomo backup permanente (expira com GC).