01/17

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

Composição editorial de código e terminal

Referência

Git 2.x

GitHub CLI 2.x · Conventional Commits

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.

Configuração inicial · git config
# 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
Chave SSH · autenticação com o GitHub
# 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.com

Mó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.

A

Repositório

A pasta .git dentro do projeto — o banco de dados de todo o histórico.

B

Working directory

Os arquivos como estão agora no disco, incluindo mudanças não salvas.

C

Staging area (index)

A 'bandeja' de mudanças escolhidas para entrar no próximo commit.

D

Commit

Uma fotografia permanente do projeto, com autor, data e mensagem.

E

HEAD

Um ponteiro para o commit em que você está agora — quase sempre a ponta de um branch.

F

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.

1

Modificado

Editou o arquivo, mas ainda não avisou o Git (git add).

2

Preparado (staged)

git add colocou o arquivo na bandeja do próximo commit.

3

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

Começar um projeto
# 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-pasta

Módulo 02 · Ver, preparar e commitar

O ciclo básico
# 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 --decorate

Módulo 02 · Sincronizar com o GitHub

push, pull e fetch
# 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 --oneline

Cuidado

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, trocar e mesclar
# 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-branch

Módulo 03 · Convenção de nomes

O nome do branch conta a história.

PrefixoUsoExemplo
feature/Nova funcionalidadefeature/checkout-pix
fix/Correção de bugfix/login-token-expirado
chore/Manutenção, sem mudar comportamentochore/atualiza-dependencias
hotfix/Correção urgente direto de produçãohotfix/erro-pagamento
docs/Só documentaçãodocs/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.

TipoQuando usar
featNova funcionalidade para o usuário
fixCorreção de bug
docsSó documentação
styleFormatação, sem mudar lógica (espaços, ponto e vírgula)
refactorReorganiza código sem mudar comportamento
perfMelhoria de performance
testAdiciona ou corrige testes
choreBuild, dependências, configuração
Exemplos reais
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.16

Módulo 04 · Boas práticas

1

Um assunto por commit

Se a mensagem tem 'e', considere dois commits.

2

Imperativo

'adiciona', não 'adicionado' ou 'adicionando'.

3

Até ~50 caracteres

No título. Detalhes vão no corpo da mensagem.

4

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.

Gerenciar remotos
# 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.git

Mó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.

1

Branch

git switch -c feature/algo a partir da main atualizada.

2

Commits

Pequenos, com mensagens claras, enviados com git push -u.

3

Abrir o PR

No GitHub ou com gh pr create — descreva o quê e o porquê.

4

Revisão

Peça review; responda comentários com novos commits.

5

Merge

Squash, merge ou rebase — conforme a convenção do time.

Módulo 06 · Boa descrição de PR

Template de descrição
## 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ário

Mó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.

Desfazer no working directory e no staging
# 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
Desfazer commits
# 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>
Recuperar o que parecia perdido
# 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çãoComando
Mudei um arquivo e quero descartargit restore <arquivo>
Dei git add sem querergit restore --staged <arquivo>
Commit local errado, quero editargit reset --soft HEAD~1
Commit já publicado no remotogit revert <hash>
"Sumiu" um commit ou branchgit 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.

.gitignore essencial
# 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/
*.log

Se 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

A

.env sempre no .gitignore

Antes do primeiro commit do projeto, não depois.

B

.env.example

Versione um modelo com as chaves em branco, para orientar o time.

C

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.

stash — guardar mudanças sem commitar
# 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 apply
cherry-pick — trazer um commit específico de outro branch
git switch main
git cherry-pick <hash-do-commit>
bisect — achar qual commit introduziu um bug
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
tag — marcar versões
# 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 --tags

Módulo 11 · GitHub CLI

11

O GitHub sem sair do terminal.

gh cobre PRs, issues e repositórios inteiros.

Repositórios e Pull Requests com gh
# 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 --squash
Issues
gh issue create --title "Bug: erro 500 no cadastro" --body "Passos para reproduzir..."
gh issue list --state open
gh issue close 17

Módulo 12 · Cuidados

12

As seis armadilhas que perdem trabalho.

Nenhuma é rara — todo mundo cai em uma cedo ou tarde.

1

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.

2

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.

3

git reset --hard sem checar

Apaga mudanças não commitadas de vez. Rode git status e git diff antes, sempre.

4

Commitar .env ou credenciais

Configure o .gitignore antes do primeiro commit do projeto — ver Módulo 09.

5

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).

6

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ó.

ComandoO que faz
git initCria um repositório novo
git clone <url>Copia um repositório remoto
git statusMostra o que mudou
git diffMostra 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 --graphHistó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 pullTraz e aplica mudanças do remoto
git fetchSó traz, sem aplicar
git restore <arquivo>Descarta mudanças não commitadas
git reset --soft HEAD~1Desfaz o último commit, mantém mudanças staged
git revert <hash>Cria um commit que desfaz outro (seguro em equipe)
git stash / git stash popGuarda e recupera mudanças temporárias
git reflogHistórico de tudo — recupera o "perdido"
gh pr createAbre um Pull Request pelo terminal

Checklist antes de abrir um PR

Sete perguntas. Sempre nessa ordem.

1

Rodei git status e git diff — sei exatamente o que estou enviando?

2

Existe algum segredo, .env ou credencial no diff?

3

As mensagens de commit seguem o padrão do time (Módulo 04)?

4

Meu branch está atualizado com a main (git fetch + rebase ou merge)?

5

Testei localmente o que estou entregando?

6

A descrição do PR explica o quê e o porquê — não só o quê?

7

Removi console.log, comentários de debug e código morto?