// aula 02 · Git & GitHub

Commits — Salvando
o histórico do projeto


O que é um commit?

📸 Uma fotografia do seu projeto

Um commit é um registro permanente do estado do projeto naquele momento. Cada commit tem: um hash SHA-1 único (ex: a3f5c2d), a mensagem que você escreveu, autor, data e um ponteiro para o commit anterior. É a unidade básica do histórico Git.

c1
primeiro commit
c2
adiciona login
c3
corrige bug
HEAD
você está aqui

O fluxo completo — do arquivo ao commit

# 1. Ver o que mudou
git status

# 2. Adicionar ao staging
git add index.html        # arquivo específico
git add css/             # pasta inteira
git add .               # tudo de uma vez
git add -p              # escolhe partes do arquivo interativamente

# 3. Fazer o commit
git commit -m "adiciona página de login"

# Atalho: add + commit juntos (só para arquivos já rastreados)
git commit -am "corrige typo no header"

Boas mensagens de commit

✅ Boas mensagens

  • Curtas e descritivas: "adiciona validação de e-mail no formulário"
  • Usam verbos no imperativo: "corrige", "adiciona", "remove", "atualiza"
  • Explicam o porquê, não só o o quê
  • Seguem um padrão consistente no projeto

❌ Mensagens ruins

  • "arrumei" — vago demais, o que foi arrumado?
  • "alterações" — não diz nada sobre o conteúdo
  • "asdfsdf" — sem sentido, impossível de rastrear
  • "WIP" — work in progress não deve ser commitado na main

Corrigindo e desfazendo commits

# Corrigir a mensagem do último commit (antes do push)
git commit --amend -m "mensagem corrigida"

# Adicionar arquivo esquecido ao último commit
git add arquivo-esquecido.txt
git commit --amend --no-edit

# Desfazer o último commit MAS manter as alterações no staging
git reset --soft HEAD~1

# Desfazer o último commit E descartar as alterações
git reset --hard HEAD~1

# Criar um commit que desfaz outro (seguro para histórico público)
git revert <hash-do-commit>

⚠️ reset --hard

Apaga os commits E as alterações. Use com cuidado — as mudanças desaparecem para sempre no seu working directory. Nunca use em commits já enviados ao GitHub.

✅ revert

Cria um novo commit que desfaz o anterior — sem apagar o histórico. É a forma segura de desfazer algo que já foi enviado ao repositório remoto.


Viajando pelo histórico

# Ver histórico completo
git log
git log --oneline
git log --oneline --graph --all   # com branches em gráfico

# Ver o que mudou em um commit específico
git show a3f5c2d

# Ir para um commit antigo (modo "detetive" — só leitura)
git checkout a3f5c2d

# Voltar para o estado atual
git checkout main

# Comparar dois commits
git diff a3f5c2d b7e9f1a

Conventional Commits — o padrão da indústria

🏷️ Prefixos que todo dev precisa conhecer

O Conventional Commits é uma convenção de mensagens de commit amplamente adotada. O formato é: tipo(escopo): descrição — onde o escopo é opcional e indica qual parte do projeto foi afetada. Ferramentas como o GitHub usam esses prefixos para gerar changelogs automáticos.

TipoQuando usarExemplo
feat Nova funcionalidade para o usuário feat: adiciona login com Google
fix Correção de um bug fix: corrige cálculo de desconto no carrinho
docs Mudanças apenas em documentação (README, comentários) docs: atualiza instruções de instalação
style Formatação, ponto e vírgula, espaços — sem mudança de lógica style: formata arquivo conforme PEP 8
refactor Refatoração — nem nova feature, nem correção de bug refactor: extrai lógica de validação para função
test Adição ou correção de testes automatizados test: adiciona testes para módulo de pagamento
perf Melhoria de performance sem mudar comportamento perf: otimiza query de busca de produtos
ci Mudanças em configuração de CI/CD (GitHub Actions, pipelines) ci: adiciona workflow de deploy automático
chore Tarefas de manutenção que não afetam o código fonte (atualizar dependências, configurações) chore: atualiza dependências do projeto
build Mudanças no sistema de build ou dependências externas build: adiciona webpack ao projeto
revert Reverte um commit anterior revert: feat: adiciona login com Google
BREAKING CHANGE Mudança que quebra compatibilidade com versão anterior — adiciona ! depois do tipo feat!: remove suporte ao Python 2

📐 Formato completo com escopo

O escopo é opcional mas ajuda a localizar onde a mudança aconteceu. Fica entre parênteses depois do tipo:

# Sem escopo
git commit -m "feat: adiciona sistema de notificações"

# Com escopo (qual módulo/área foi afetada)
git commit -m "feat(auth): adiciona login com Google"
git commit -m "fix(cart): corrige cálculo de frete grátis"
git commit -m "docs(readme): adiciona seção de instalação"
git commit -m "style(header): ajusta espaçamento do menu"

# Breaking change — adiciona ! e detalha no corpo
git commit -m "feat(api)!: endpoint de usuários agora exige token"

✅ Por que seguir esse padrão?

  • Histórico legível por qualquer pessoa do time
  • Gera changelogs automáticos com ferramentas como semantic-release
  • Facilita entender o impacto de cada mudança
  • Padrão esperado em projetos open source

💡 Dica — extensão no VS Code

Instale a extensão Conventional Commits no VS Code. Ela abre um guia passo a passo na hora de escrever a mensagem — você escolhe o tipo, escopo e descrição com autocompletar.