Introdução
Antes de escrever qualquer comando, é importante entender a diferença entre as duas ferramentas que usaremos ao longo deste guia:
- Git
- Sistema de controle de versão para monitorar alterações no código localmente
- GitHub
- Plataforma na nuvem que hospeda repositórios e facilita a colaboração entre múltiplos desenvolvedores
Conceitos Básicos
Dois conceitos são centrais para entender por que o Git existe e por que ele é tão valioso no desenvolvimento de software:
- Versionamento
- Prática de gerenciar diferentes estágios de um projeto, permitindo recuperar versões anteriores e evitar perda de dados
- Controle de versão
- Cria um histórico detalhado que identifica quem alterou o quê e quando, garantindo a integridade do código-fonte
Instalação
Debian / Ubuntu
sudo apt-get install git
Configuração
Usuário único
# Usuário
git config --global user.name "Seu Nome"
# E-mail
git config --global user.email "[email protected]"
# Gerar chave SSH
ssh-keygen -t ed25519 -C "[email protected]"
# Pressione Enter nas perguntas para usar os valores padrão
# Exibir a chave pública para copiar e colar no GitHub
cat ~/.ssh/id_ed25519.pub
# GitHub > Settings > SSH and GPG keys > New SSH key > Cole e salve
Múltiplos usuários (pessoal + trabalho)
Quando se utiliza o mesmo computador para projetos pessoais e profissionais, é necessário configurar identidades SSH separadas para cada conta GitHub.
1. Gerar as chaves SSH
ssh-keygen -t ed25519 -C "[email protected]"
# Quando solicitado o arquivo, digite: id_pessoal
# Generate public/private ed25519 key pair.
# Enter file in which to save the key (/c/Users/pessoal.ssh/id_ed25519): id_pessoal
# Enter passphrase (empty for no passphrase):
# Pressione Enter para deixar a passphrase em branco (ou defina uma)
ssh-keygen -t ed25519 -C "[email protected]"
# Quando solicitado o arquivo, digite: id_trabalho
# Generate public/private ed25519 key pair.
# Enter file in which to save the key (/c/Users/pessoal.ssh/id_ed25519): id_trabalho
# Enter passphrase (empty for no passphrase):
# Pressione Enter para deixar a passphrase em branco (ou defina uma)
2. Adicionar as chaves ao SSH agent
eval "$(ssh-agent -s)"
# Agent pid XXXX
ssh-add ~/.ssh/id_pessoal
# Identity added: id_pessoal
ssh-add ~/.ssh/id_trabalho
# Identity added: id_trabalho
3. Adicionar as chaves públicas ao GitHub
# Copie cada chave e adicione em:
# GitHub > Settings > SSH and GPG keys > New SSH key > Cole e salve
cat ~/.ssh/id_pessoal.pub
cat ~/.ssh/id_trabalho.pub
4. Criar o arquivo de configuração SSH
Crie ou edite o arquivo ~/.ssh/config:
# Conta pessoal
Host github.com-pessoal
HostName github.com
User git
IdentityFile ~/.ssh/id_pessoal
# Conta de trabalho
Host github.com-trabalho
HostName github.com
User git
IdentityFile ~/.ssh/id_trabalho
5. Testar as conexões
ssh -T [email protected]
# Hi <usuario-pessoal>! You've successfully authenticated...
ssh -T [email protected]
# Hi <usuario-trabalho>! You've successfully authenticated...
6. Clonar repositórios usando o host correto
git clone [email protected]:usuario-pessoal/repositorio.git
git clone [email protected]:usuario-trabalho/repositorio.git
Criando um Repositório
Para criar um novo repositório no GitHub, acesse Repositories > New e preencha as opções abaixo:
- Repository name
-
Nome simples e direto (ex:
meu-projeto,my-project) - Description
- Breve descrição do projeto (opcional, mas recomendado)
- Visibility
- Public (recomendado) ou Private
- Add a README file
- Apresenta o projeto na página inicial (recomendado)
- Add .gitignore
- Escolha o template da linguagem do projeto. Gerador: toptal.com/developers/gitignore
- Choose a license
- Define como seu código pode ser usado por outros. Referência: GitHub Docs — Licenças
.gitignore
O arquivo .gitignore instrui o Git a não
rastrear determinados arquivos ou pastas, como
dependências, variáveis de ambiente e arquivos gerados
automaticamente.
# Ignorar uma pasta inteira (ex: dependências do Node)
node_modules/
# Ignorar arquivos de configuração sensíveis (senhas)
.env
# Ignorar todos os arquivos que terminam com .log
*.log
# Ignorar arquivos específicos do sistema operacional
Thumbs.db
.DS_Store
# "!" Abre a exceção para o arquivo específico
!config_fixo.log
Comandos
Iniciando uma área de trabalho
# Clonar um repositório existente
git clone https://github.com/usuario/projeto.git
# Criar um repositório novo do zero
git init meu-projeto
Trabalhando com mudanças
# Adicionar arquivos para o próximo commit
git add index.html # um arquivo específico
git add . # todos os arquivos alterados
# Mover ou renomear um arquivo
git mv velho-nome.txt novo-nome.txt
# Descartar alterações não commitadas
git restore arquivo.txt # desfaz mudanças no arquivo
# Remover um arquivo do projeto e do índice
git rm arquivo.txt
Examinando histórico e estado
# Encontrar qual commit introduziu um bug
git bisect start
git bisect bad # commit atual tem o bug
git bisect good v1.0 # essa versão estava OK
# O Git navega automaticamente; você testa e repete:
git bisect good # ou: git bisect bad
# Ver o que mudou
git diff # mudanças ainda não adicionadas
git diff HEAD~1 # comparar com o commit anterior
# Buscar texto no código
git grep "função login"
# Ver histórico de commits
git log --oneline # resumido, uma linha por commit
# Ver detalhes de um commit
git show a3f5c1b # hash do commit
# Ver estado atual dos arquivos
git status
Gerenciando histórico e branches
# Criar ou listar branches
git branch # lista todas as branches
git branch nova-feature # cria uma branch nova
# Salvar as mudanças no histórico
git commit -m "Adiciona página de login"
# Unir uma branch na atual
git merge nova-feature
# Reaplicar commits sobre outra base
git rebase main # reaplica commits em cima da main
# Desfazer commits ou unstage arquivos
git reset HEAD~1 # desfaz o último commit (mantém arquivos)
# Trocar de branch
git switch nova-feature
git switch -c outra-branch # cria e já troca
# Marcar uma versão
git tag v1.0.0
Colaborando
# Baixar atualizações sem aplicar
git fetch origin
# Baixar e já aplicar atualizações
git pull origin main
# Enviar commits para o repositório remoto
git push origin main
Padronização de Commits
O que é Conventional Commits?
É uma convenção leve para mensagens de commit que segue um formato estruturado. Facilita a leitura do histórico, a geração automática de changelogs e o versionamento semântico (SemVer).
Especificação oficial: conventionalcommits.org
Estrutura do Commit
<tipo>[escopo opcional]: <descrição>
[corpo opcional]
[rodapé(s) opcional(is)]
Tipos Principais
| Tipo | Quando usar |
|---|---|
feat |
Nova funcionalidade |
fix |
Correção de bug |
docs |
Alterações apenas em documentação |
style |
Formatação, ponto e vírgula, espaços (sem mudança de lógica) |
refactor |
Refatoração de código (sem bug fix nem feature) |
perf |
Melhoria de performance |
test |
Adição ou correção de testes |
build |
Mudanças no sistema de build ou dependências externas |
ci |
Mudanças em arquivos e scripts de CI/CD |
chore |
Tarefas de manutenção que não alteram src ou testes |
revert |
Reverte um commit anterior |
Exemplos Práticos
feat: adiciona autenticação via OAuth2
fix: corrige cálculo de desconto no carrinho
docs: atualiza README com instruções de instalação
style: aplica formatação do prettier nos arquivos ts
refactor: extrai lógica de validação para módulo separado
perf: substitui loop por operação de batch no banco
test: adiciona testes unitários para UserService
chore: atualiza dependências para versões mais recentes
feat(auth): adiciona suporte a login com Google
fix(cart): corrige arredondamento de valores decimais
docs(api): documenta endpoint de criação de pedidos
test(payment): cobre cenários de falha na integração com Stripe
refactor(database): migra queries para uso de ORM
ci(github-actions): adiciona job de lint no pipeline de PR
build(docker): otimiza imagem para reduzir tamanho final
fix(auth): corrige expiração incorreta do token JWT
O token estava sendo gerado com timezone UTC+0 fixo,
causando expiração antecipada para usuários em fusos
negativos. Agora usa o timestamp do servidor corretamente.
feat(api)!: remove endpoint legado /v1/users
BREAKING CHANGE: O endpoint /v1/users foi removido.
Migre para /v2/users que retorna o mesmo contrato
com campos adicionais de paginação.
fix(billing): corrige cobrança duplicada em planos anuais
Detectado em produção via alertas do Datadog. A cobrança
ocorria duas vezes quando o webhook de confirmação do
gateway era recebido com delay superior a 30s.
Closes #482
Reviewed-by: Maria Silva
Co-authored-by: João Souza <[email protected]>
revert: feat(auth): adiciona suporte a login com Google
Refs: abc1234
Revertido por instabilidade no fluxo de callback em
ambientes com proxy reverso. Será retomado na próxima sprint.
Boas Práticas Avançadas
- Um commit = uma responsabilidade: cada commit deve representar uma única mudança lógica. Se você se pegar escrevendo "e" na descrição, provavelmente são dois commits.
-
Commits atômicos: o repositório
deve compilar e os testes devem passar em qualquer
commit do histórico. Isso é essencial para
git bisectfuncionar bem. -
Prefira
git commit --amenda commits de correção: se você ainda não fez push, emende o commit ao invés de criar umfix: corrige typo do commit anterior.
git add .
git commit --amend --no-edit # mantém a mensagem atual
git commit --amend # abre editor para alterar mensagem
Use git rebase -i para limpar o histórico
antes do merge — agrupe, reordene ou edite commits de
uma branch antes de abri-la para revisão.
git rebase -i HEAD~5 # abre editor para os últimos 5 commits
| Ação | Efeito |
|---|---|
pick |
Mantém o commit |
reword |
Mantém, mas edita a mensagem |
edit |
Para e permite emendas |
squash |
Junta com o commit anterior |
fixup |
Como squash, mas descarta a mensagem |
drop |
Remove o commit |