Mentoria Aceleração Digital · Anexo técnico
Manual de
Git & GitHub.
Do primeiro git init ao pull request revisado — comandos, boas práticas e os cuidados que evitam perder trabalho.
13
Módulos práticos
40+
Comandos comentados
6
Armadilhas evitadas

Referência
Git 2.x
GitHub CLI 2.x · Conventional Commits
Índice
Treze módulos. Do zero ao fluxo de time.
Instalação
Git, SSH e GitHub CLI
Conceitos
Repositório, staging, commit, HEAD
Fluxo do dia a dia
init, clone, add, commit, push
Branches
Criar, trocar, mesclar, deletar
Commits
Mensagens boas e Conventional Commits
Remotos & GitHub
origin, upstream, fork
Pull Requests
Do branch ao merge revisado
Merge, Rebase, Squash
Quando usar cada um
Desfazendo erros
restore, reset, revert, reflog
.gitignore & segredos
O que nunca deve ir pro repo
Comandos avançados
stash, cherry-pick, bisect, tag
GitHub CLI
gh — PRs e issues no terminal
Cuidados
Armadilhas que perdem trabalho
Módulo 00 · Instalação
00
Instalando Git, SSH e GitHub CLI.
Três ferramentas, um ambiente pronto para trabalhar com controle de versão.
Módulo 00 · Instalar o Git
Um comando por sistema operacional.
macOS
brew install git git --version
Sem Homebrew? O Xcode Command Line Tools já traz o Git: xcode-select --install.
Windows
winget install --id Git.Git -e --source winget
Instala o Git Bash junto — use-o como terminal padrão para os comandos deste manual.
Linux (Debian/Ubuntu)
sudo apt update sudo apt install git
Módulo 00 · Configuração inicial
Identidade + editor + chave SSH.
Rode isso uma vez por computador, antes do primeiro commit.
# Identidade — aparece em todo commit que você fizer
git config --global user.name "Seu Nome"
git config --global user.email "voce@exemplo.com"
# Branch padrão em novos repositórios
git config --global init.defaultBranch main
# Editor usado para mensagens de commit (opcional)
git config --global core.editor "code --wait"
# Ver toda a configuração aplicada
git config --list# Gera um par de chaves (Ed25519 — o padrão recomendado hoje)
ssh-keygen -t ed25519 -C "voce@exemplo.com"
# Adiciona a chave ao agente SSH
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# Copia a chave pública para colar em GitHub → Settings → SSH Keys
cat ~/.ssh/id_ed25519.pub
# Testa a conexão
ssh -T git@github.comMódulo 00 · GitHub CLI
gh — o GitHub direto no terminal.
Instalar
brew install gh # ou: winget install --id GitHub.cli
Autenticar
gh auth login
Escolha HTTPS ou SSH e siga o fluxo no navegador.
Módulo 01 · Conceitos fundamentais
01
Como o Git enxerga seu projeto.
Cinco ideias que explicam praticamente todo comando.
Repositório
A pasta .git dentro do projeto — o banco de dados de todo o histórico.
Working directory
Os arquivos como estão agora no disco, incluindo mudanças não salvas.
Staging area (index)
A 'bandeja' de mudanças escolhidas para entrar no próximo commit.
Commit
Uma fotografia permanente do projeto, com autor, data e mensagem.
HEAD
Um ponteiro para o commit em que você está agora — quase sempre a ponta de um branch.
Branch
Um ponteiro móvel para um commit — uma linha do tempo paralela e barata de criar.
Módulo 01 · Os três estados
Working dir → staging → repositório.
Modificado
Editou o arquivo, mas ainda não avisou o Git (git add).
Preparado (staged)
git add colocou o arquivo na bandeja do próximo commit.
Commitado
git commit gravou a bandeja como um ponto permanente no histórico.
Módulo 02 · Fluxo do dia a dia
02
Os comandos que você usa toda hora.
Do repositório novo ao commit enviado para o GitHub.
Módulo 02 · Criar ou clonar
# Criar um repositório novo na pasta atual
git init
# Clonar um repositório existente do GitHub
git clone https://github.com/usuario/repositorio.git
# Clonar via SSH (recomendado se a chave já está configurada)
git clone git@github.com:usuario/repositorio.git
# Clonar em uma pasta com outro nome
git clone git@github.com:usuario/repositorio.git nome-da-pastaMódulo 02 · Ver, preparar e commitar
# O que mudou desde o último commit
git status
# Diferenças linha a linha (working dir vs staging)
git diff
# Preparar arquivos específicos
git add caminho/arquivo.ts
# Preparar tudo que mudou (cuidado — revise antes com git status)
git add .
# Registrar o commit com uma mensagem clara
git commit -m "feat: adiciona validação de e-mail no cadastro"
# Ver o histórico de commits
git log --oneline --graph --decorateMódulo 02 · Sincronizar com o GitHub
# Enviar seus commits para o remoto
git push
# Primeira vez enviando um branch novo
git push -u origin nome-do-branch
# Trazer e já aplicar as mudanças do remoto
git pull
# Só baixar as mudanças, sem aplicar ainda (mais seguro para inspecionar)
git fetch
git log origin/main --onelineCuidado
git pull = git fetch + git merge. Se você tem mudanças locais não commitadas, o pull pode gerar conflito. Prefira git fetch quando quiser inspecionar antes de misturar.
Módulo 03 · Branches
03
Uma linha do tempo por tarefa.
Nunca trabalhe direto na main — nem sozinho.
# Criar um branch novo a partir do atual
git branch nome-do-branch
# Criar E já trocar para ele (o jeito mais comum)
git checkout -b nome-do-branch
# equivalente moderno:
git switch -c nome-do-branch
# Trocar de branch
git switch main
# Listar branches (local e remoto)
git branch -a
# Mesclar um branch dentro do atual
git switch main
git merge nome-do-branch
# Apagar um branch já mesclado
git branch -d nome-do-branch
# Apagar um branch remoto
git push origin --delete nome-do-branchMódulo 03 · Convenção de nomes
O nome do branch conta a história.
| Prefixo | Uso | Exemplo |
|---|---|---|
| feature/ | Nova funcionalidade | feature/checkout-pix |
| fix/ | Correção de bug | fix/login-token-expirado |
| chore/ | Manutenção, sem mudar comportamento | chore/atualiza-dependencias |
| hotfix/ | Correção urgente direto de produção | hotfix/erro-pagamento |
| docs/ | Só documentação | docs/manual-instalacao |
Módulo 03 · Trunk-based vs Git Flow
Trunk-based (recomendado)
Um branch principal (main). Branches de feature curtos, que voltam pra main em dias, não semanas. Menos conflito, deploy contínuo.
Git Flow (times grandes)
main + develop + release/* + hotfix/*. Mais estrutura, mais cerimônia — útil quando há versões paralelas em produção.
Módulo 04 · Mensagens de commit
04
Escreva para quem vai debugar às 3h.
Conventional Commits: um padrão simples que vira changelog automático.
tipo(escopo): descrição no imperativo.
| Tipo | Quando usar |
|---|---|
| feat | Nova funcionalidade para o usuário |
| fix | Correção de bug |
| docs | Só documentação |
| style | Formatação, sem mudar lógica (espaços, ponto e vírgula) |
| refactor | Reorganiza código sem mudar comportamento |
| perf | Melhoria de performance |
| test | Adiciona ou corrige testes |
| chore | Build, dependências, configuração |
feat(checkout): adiciona pagamento via Pix
fix(auth): corrige expiração de token que derrubava sessão
docs(readme): explica variáveis de ambiente necessárias
refactor(api): extrai validação de e-mail para função própria
chore(deps): atualiza vite para 8.0.16Módulo 04 · Boas práticas
Um assunto por commit
Se a mensagem tem 'e', considere dois commits.
Imperativo
'adiciona', não 'adicionado' ou 'adicionando'.
Até ~50 caracteres
No título. Detalhes vão no corpo da mensagem.
Commite cedo, commite direto
Commits pequenos são fáceis de reverter e revisar.
Módulo 05 · Remotos & GitHub
05
origin, upstream e fork.
Onde seu repositório local conversa com o mundo.
origin
O apelido padrão do repositório remoto de onde você clonou — normalmente o seu próprio, no GitHub.
upstream
O repositório original, quando o seu é um fork. Usado para trazer atualizações de quem você "forkou".
fork
Sua cópia de um repositório de outra pessoa, no seu GitHub — para contribuir sem acesso de escrita ao original.
# Ver remotos configurados
git remote -v
# Adicionar o repositório original como upstream (após dar fork)
git remote add upstream https://github.com/dono-original/repositorio.git
# Trazer as atualizações do upstream para o seu main local
git fetch upstream
git switch main
git merge upstream/main
# Trocar a URL de um remoto (ex.: HTTPS → SSH)
git remote set-url origin git@github.com:usuario/repositorio.gitMódulo 06 · Pull Requests
06
Do branch ao merge revisado.
O PR é onde o trabalho em equipe realmente acontece.
Cinco passos, sempre na mesma ordem.
Branch
git switch -c feature/algo a partir da main atualizada.
Commits
Pequenos, com mensagens claras, enviados com git push -u.
Abrir o PR
No GitHub ou com gh pr create — descreva o quê e o porquê.
Revisão
Peça review; responda comentários com novos commits.
Merge
Squash, merge ou rebase — conforme a convenção do time.
Módulo 06 · Boa descrição de PR
## O que mudou
Breve resumo da mudança e por quê.
## Como testar
1. Passo a passo para reproduzir/validar.
## Screenshots (se for mudança visual)
## Checklist
- [ ] Testei localmente
- [ ] Sem segredos ou dados sensíveis no diff
- [ ] Atualizei documentação, se necessárioMódulo 06 · Proteção de branch
No GitHub
Settings → Branches → Branch protection rules na main: exigir PR, exigir review aprovado e checks de CI verdes antes do merge.
Por quê
Impede push direto na main — inclusive o seu, por engano — e garante que todo código passou por olhos e por testes.
Módulo 07 · Merge, Rebase, Squash
07
Três formas de juntar histórico.
Cada uma conta uma história diferente no log.
Merge
git switch main git merge feature/x
Preserva o histórico exato, cria um commit de merge. Honesto, mas o log fica com mais ramificações visuais.
Rebase
git switch feature/x git rebase main
Reescreve os commits do branch como se tivessem sido feitos depois da main. Log linear e limpo.
Squash
No merge do PR (botão "Squash and merge" no GitHub), todos os commits do branch viram um só na main. Ótimo para branches com commits de "WIP", "ajuste", "de novo".
Regra de ouro do rebase
Nunca dê rebase em um branch que outras pessoas já baixaram e estão usando — ele reescreve commits (muda os hashes). Rebase é seguro no seu próprio branch de feature, antes de virar PR ou logo após.
Módulo 08 · Desfazendo erros
08
Quase tudo no Git tem volta.
Saber qual comando usar evita perder trabalho por pânico.
# Descartar mudanças não commitadas de um arquivo (CUIDADO: apaga de vez)
git restore caminho/arquivo.ts
# Tirar um arquivo do staging, mantendo as mudanças no arquivo
git restore --staged caminho/arquivo.ts
# Ver o que mudou antes de descartar (sempre rode antes do restore)
git diff caminho/arquivo.ts# Desfaz o último commit, mantendo as mudanças como staged (o mais seguro)
git reset --soft HEAD~1
# Desfaz o último commit e tira do staging, mas mantém no working dir
git reset --mixed HEAD~1
# Desfaz o último commit E apaga as mudanças (PERIGOSO — só em commits locais)
git reset --hard HEAD~1
# Cria um commit NOVO que desfaz um commit antigo já publicado (o jeito seguro em equipe)
git revert <hash-do-commit># Histórico de tudo que o HEAD já apontou — inclusive commits "perdidos"
git reflog
# Voltar para um estado específico encontrado no reflog
git reset --hard HEAD@{2}Módulo 08 · Qual comando usar
| Situação | Comando |
|---|---|
| Mudei um arquivo e quero descartar | git restore <arquivo> |
| Dei git add sem querer | git restore --staged <arquivo> |
| Commit local errado, quero editar | git reset --soft HEAD~1 |
| Commit já publicado no remoto | git revert <hash> |
| "Sumiu" um commit ou branch | git reflog |
Módulo 09 · .gitignore & segredos
09
O que nunca deve entrar no repositório.
Um segredo vazado no histórico do Git é considerado comprometido para sempre.
# Dependências e build
node_modules/
dist/
build/
.next/
# Variáveis de ambiente e segredos
.env
.env.local
.env.*.local
*.pem
*.key
# Sistema operacional e editor
.DS_Store
.vscode/
*.logSe um segredo já foi commitado
Trocar a chave/senha no serviço de origem é obrigatório e imediato — apagar do Git não desfaz o vazamento, porque o histórico pode já ter sido clonado ou indexado. Depois de trocar a credencial, remova o rastro do histórico com git filter-repo ou o BFG Repo-Cleaner, e force um push coordenado com o time.
Módulo 09 · Prevenção
.env sempre no .gitignore
Antes do primeiro commit do projeto, não depois.
.env.example
Versione um modelo com as chaves em branco, para orientar o time.
git-secrets / gitleaks
Ferramenta que bloqueia commit se detectar padrão de chave/token.
Módulo 10 · Comandos avançados
10
Para quando o dia a dia não basta.
Guarde temporariamente, escolha um commit específico, ou ache o culpado de um bug.
# Guarda as mudanças e limpa o working directory
git stash
# Guarda com uma descrição (facilita achar depois)
git stash push -m "ajuste de layout no checkout"
# Listar stashes guardados
git stash list
# Trazer de volta o último stash (e removê-lo da lista)
git stash pop
# Aplicar sem remover da lista
git stash applygit switch main
git cherry-pick <hash-do-commit>git bisect start
git bisect bad # o commit atual está com o bug
git bisect good v1.2.0 # essa tag/commit estava bom
# o Git vai pulando commits no meio — teste e responda:
git bisect good # ou
git bisect bad
# até apontar o commit exato. Depois:
git bisect reset# Criar uma tag anotada (recomendado — guarda autor, data e mensagem)
git tag -a v1.0.0 -m "Primeira versão estável"
# Enviar tags para o remoto
git push origin v1.0.0
git push origin --tagsMódulo 11 · GitHub CLI
11
O GitHub sem sair do terminal.
gh cobre PRs, issues e repositórios inteiros.
# Criar um repositório novo no GitHub a partir da pasta atual
gh repo create nome-do-repo --public --source=. --push
# Abrir um PR do branch atual para a main
gh pr create --base main --title "feat: checkout via Pix" --body "Descrição da mudança"
# Ver PRs abertos
gh pr list
# Fazer checkout local de um PR para revisar
gh pr checkout 42
# Aprovar e mesclar
gh pr review 42 --approve
gh pr merge 42 --squashgh issue create --title "Bug: erro 500 no cadastro" --body "Passos para reproduzir..."
gh issue list --state open
gh issue close 17Módulo 12 · Cuidados
12
As seis armadilhas que perdem trabalho.
Nenhuma é rara — todo mundo cai em uma cedo ou tarde.
git push --force na main
Sobrescreve o histórico remoto e pode apagar commits de colegas. Se precisar mesmo, use --force-with-lease — ele falha se alguém enviou algo que você ainda não viu.
git commit --amend já publicado
Reescreve o commit. Se outra pessoa já deu pull, o histórico dela diverge do seu. Só emende commits que ainda não foram enviados.
git reset --hard sem checar
Apaga mudanças não commitadas de vez. Rode git status e git diff antes, sempre.
Commitar .env ou credenciais
Configure o .gitignore antes do primeiro commit do projeto — ver Módulo 09.
Trabalhar direto na main
Sem branch, sem PR, sem revisão — qualquer erro vai direto para todo o time. Ative branch protection (Módulo 06).
rm -rf .git por engano
Apaga todo o histórico local. Sem um remoto atualizado, é irrecuperável — dê push com frequência.
Módulo 12 · Hábitos que evitam os seis
git status
Antes de qualquer comando que apague ou sobrescreva algo.
Branch + PR
Sempre — mesmo trabalhando sozinho. Cria um checkpoint revisável.
Push frequente
Seu commit só está seguro de verdade quando existe em outro lugar além do seu disco.
★ Cheatsheet
Os comandos, numa tabela só.
| Comando | O que faz |
|---|---|
| git init | Cria um repositório novo |
| git clone <url> | Copia um repositório remoto |
| git status | Mostra o que mudou |
| git diff | Mostra as diferenças linha a linha |
| git add <arquivo> | Prepara um arquivo para o commit |
| git commit -m "msg" | Grava um commit |
| git log --oneline --graph | Histórico resumido e visual |
| git switch -c <branch> | Cria e troca para um branch novo |
| git switch <branch> | Troca de branch |
| git merge <branch> | Mescla um branch no atual |
| git rebase <branch> | Reaplica commits sobre outro branch |
| git push -u origin <branch> | Envia um branch novo ao remoto |
| git pull | Traz e aplica mudanças do remoto |
| git fetch | Só traz, sem aplicar |
| git restore <arquivo> | Descarta mudanças não commitadas |
| git reset --soft HEAD~1 | Desfaz o último commit, mantém mudanças staged |
| git revert <hash> | Cria um commit que desfaz outro (seguro em equipe) |
| git stash / git stash pop | Guarda e recupera mudanças temporárias |
| git reflog | Histórico de tudo — recupera o "perdido" |
| gh pr create | Abre um Pull Request pelo terminal |
Checklist antes de abrir um PR
Sete perguntas. Sempre nessa ordem.
Rodei git status e git diff — sei exatamente o que estou enviando?
Existe algum segredo, .env ou credencial no diff?
As mensagens de commit seguem o padrão do time (Módulo 04)?
Meu branch está atualizado com a main (git fetch + rebase ou merge)?
Testei localmente o que estou entregando?
A descrição do PR explica o quê e o porquê — não só o quê?
Removi console.log, comentários de debug e código morto?