Home
Fundamentos ▾
Versionamento ▾
Deploy ▾
Inteligência Artificial ▾

Git + GitHub

Guia de apresentação para equipe Webinar 45 min 2 partes

🔧
Parte 1 de 2
Git
Sistema de controle de versão distribuído — como funciona por dentro
28
minutos

O que é Git 5 min

Git é um sistema de controle de versão distribuído — um software que rastreia todas as mudanças feitas em um conjunto de arquivos ao longo do tempo, permitindo voltar a qualquer versão anterior e colaborar com outras pessoas sem sobrescrever o trabalho de ninguém.

A origem — 2005

Abril de 2005 — Kernel do Linux
O kernel do Linux era desenvolvido por centenas de pessoas ao redor do mundo. Em 2005, o sistema de versionamento que usavam (BitKeeper, proprietário) revogou as licenças gratuitas após um incidente com a comunidade open source. O projeto ficou sem ferramenta de colaboração.

Linus Torvalds — criador do Linux — tinha requisitos claros: velocidade, design simples, suporte a desenvolvimento não-linear (milhares de branches paralelos), totalmente distribuído e capaz de lidar com projetos grandes como o kernel do Linux de forma eficiente.

Em 10 dias, Linus escreveu o núcleo do Git. Em 2 semanas, o próprio kernel do Linux já estava sendo gerenciado por ele.

O problema que Git resolve

❌ Sem controle de versão
📁 projeto-v1/, projeto-v2-final/, projeto-FINAL-MESMO/
💥 Duas pessoas editam o mesmo arquivo → perda de trabalho
"Quem mudou isso? Quando? Por quê?"
🔙 Impossível desfazer mudanças específicas
✅ Com Git
📸 Histórico completo de cada mudança
👥 Múltiplas pessoas, sem conflito de sobrescrita
🔍 Quem fez o quê, quando e por qual razão
🕰 Voltar a qualquer ponto da história

Distribuído vs Centralizado

VCS Centralizado (SVN, CVS)
🏛 Repositório único em um servidor central
🌐 Precisa de rede para quase tudo
Se o servidor cai, ninguém trabalha
🔒 Histórico fica só no servidor
VCS Distribuído (Git)
💻 Cada clone é um repositório completo
✈️ Trabalha offline — sincroniza depois
🔄 Servidor down? Histórico local intacto
🌐 Múltiplos remotos possíveis

Como o versionamento realmente funciona 5 min

A maioria dos VCS armazena diferenças (diffs) entre versões. Git funciona de forma radicalmente diferente: armazena snapshots completos do projeto a cada commit.

Snapshots vs Diffs

VCS baseado em diffs (SVN, CVS)
v1
A
B
C
v2
ΔA
ΔC
v3
ΔB

Para ver v3, reconstrói somando todos os deltas. Lento para histórico longo.

Git — baseado em snapshots
v1
A₁
B₁
C₁
v2
A₂
→B₁
C₂
v3
→A₂
B₃
→C₂

Arquivos não modificados viram ponteiros para versão anterior. Acesso direto a qualquer versão.

SHA-1 — Endereçamento por conteúdo

Cada objeto no Git tem um identificador único: o hash SHA-1 do seu conteúdo. Isso significa que dois arquivos com conteúdo idêntico sempre terão o mesmo hash — Git os armazena apenas uma vez (deduplicação automática). Se o hash bate, o conteúdo é garantidamente idêntico.

# Git calcula SHA-1 de cada objeto antes de armazenar
echo "hello" | git hash-object --stdin
# → ce013625030ba8dba906f756967f9e9ca394464a

# Cada commit, tree e blob tem um SHA único
git log --oneline
# a3f9c2e feat: adiciona autenticação
# 7b14d01 fix: corrige validação de email
# 9a2c88f chore: setup inicial do projeto
Imutabilidade: objetos Git são imutáveis. Mudar qualquer byte do conteúdo gera um SHA completamente diferente. Isso garante integridade — você sempre sabe que o que está lendo é exatamente o que foi commitado.

Modelo de Objetos do Git 5 min

Git é, na essência, um banco de dados de chave-valor endereçado por conteúdo. Armazena quatro tipos de objeto — juntos, eles representam todo o histórico do projeto.

Tag
objeto: SHA commit
tagger: Alfredo
date: 2025-07-01
msg: "v1.0.0"
Commit
tree: 9a3ef...
parent: 7b14d...
author: Alfredo
date: 2025-07-01
msg: "feat: auth"
Tree
blob src/index.js
blob src/auth.js
tree src/utils/
blob README.md
Blob
conteúdo bruto
do arquivo
(sem nome)
🟠 Blob

Armazena o conteúdo de um arquivo. Não guarda o nome — só os dados. Dois arquivos com conteúdo igual compartilham o mesmo blob (sem duplicação).

🟢 Tree (Árvore)

Representa um diretório. Contém entradas com SHA-1, permissão, tipo e nome de cada arquivo/subdiretório. Forma a hierarquia de pastas.

🔵 Commit

Um snapshot completo do projeto em um momento. Aponta para a tree raiz, para o(s) commit(s) pai(s) — formando a cadeia de histórico — e guarda autor, timestamp e mensagem.

🟣 Tag (anotada)

Marca um ponto específico do histórico (normalmente um commit de release). Inclui nome do criador, data e mensagem. Pode ser assinada com GPG para garantir autenticidade.

Estrutura de Armazenamento 5 min

Git divide o trabalho em três zonas distintas. Entender onde cada mudança está é fundamental para usar Git com precisão.

📂
Zona 1
Working Directory
Seus arquivos no disco. O que você vê no editor. Mudanças aqui são "não rastreadas" pelo Git até você dizer o contrário.
git diff
git add
📋
Zona 2
Staging Area
O "rascunho" do próximo commit. Você escolhe exatamente quais mudanças entram. Também chamado de índice ou cache.
git diff --staged
git commit
🗄
Zona 3
Repository (.git)
O banco de dados Git. Contém todos os objetos (blobs, trees, commits, tags) e referências (branches, HEAD). Fica na pasta .git/.
git log

Ciclo de vida de um arquivo

Untracked
Novo arquivo, Git não sabe que existe
Unmodified
Rastreado, igual ao último commit
git add
Modified
Rastreado, mas editado no disco
Staged
Pronto para o próximo commit
git commit
Por que a Staging Area existe? Ela permite construir commits cirúrgicos. Você pode ter 10 arquivos modificados mas commitar apenas 3 deles — os mais coesos — deixando o resto para um commit separado com uma mensagem diferente.
# Ver estado atual
git status

# Adicionar arquivo específico ao stage
git add src/auth.js

# Adicionar partes específicas de um arquivo (interativo)
git add -p src/auth.js

# Ver o que está staged (será commitado)
git diff --staged

# Ver o que está modificado mas ainda não staged
git diff

# Criar o commit
git commit -m "feat: adiciona autenticação JWT"

# Atalho: add + commit de todos os rastreados
git commit -am "fix: corrige validação de email"

Ciclo de Vida do Código 6 min

Branch — um ponteiro leve

Um branch no Git é apenas um arquivo de texto contendo 41 bytes — o SHA-1 do commit que ele aponta. Criar um branch é instantâneo e não duplica nada. HEAD é um ponteiro especial que indica qual branch está ativo no momento.

Exemplo: feature branch
main
C1
9a2c88f
C2
7b14d01
C3
a3f9c2e
M
e7d4b12
feature
F1
c8e21f5
F2
d91a3e7
main branch
feature branch
merge commit (M)
# Criar e mudar para novo branch
git switch -c feature/autenticacao     # Git 2.23+ (recomendado)
git checkout -b feature/autenticacao   # forma clássica

# Ver todos os branches
git branch -a

# Visualizar o grafo de commits
git log --oneline --decorate --graph --all

Commit — snapshot identificado

Um commit é uma fotografia completa do projeto naquele momento, identificada por um SHA-1 único. Contém: referência à tree raiz (o diretório do projeto), referência ao(s) commit(s) pai(s) — formando a cadeia de histórico — autor, timestamp e mensagem.

Cadeia de pais — o que é o histórico

Todo commit aponta para o commit anterior (seu "pai"). Essa cadeia é o histórico. Git não guarda diffs — guarda snapshots. Diff é calculado comparando o snapshot do commit com o snapshot do pai.

A ← B ← C ← D  (HEAD)
# D tem pai C · C tem pai B · B tem pai A
# A não tem pai → primeiro commit do repo

Merge commit tem 2 pais. O objeto armazena ambas as referências SHA:

tree  abc123
parent f1e2d3    ← pai 1 (branch atual)
parent 9a8b7c    ← pai 2 (branch mergeada)

# git log --graph mostra:
* D (merge)  — pai1=B, pai2=C
|\
| * C  — pai=A
* | B  — pai=A
|/
* A

Durante conflitos de merge, Git disponibiliza as três versões:

git show :1:arquivo  # ancestral comum (base)
git show :2:arquivo  # versão pai 1
git show :3:arquivo  # versão pai 2
Commits são imutáveis. Você nunca edita um commit existente — cria um novo que substitui. Isso garante que o histórico seja confiável.
# Boas mensagens de commit (Conventional Commits)
git commit -m "feat: adiciona login com Google OAuth"
git commit -m "fix: corrige timeout na chamada de API"
git commit -m "docs: atualiza README com instruções de setup"
git commit -m "refactor: extrai lógica de validação para helper"

# Ver detalhes de um commit
git show a3f9c2e

# Histórico com estatísticas
git log --stat --oneline

Merge — integrando branches

Git tem duas estratégias principais de merge, dependendo da situação:

Fast-forward Merge
Quando o branch de destino não tem novos commits

Git simplesmente avança o ponteiro do branch de destino. Nenhum commit de merge é criado. O histórico fica linear como se o trabalho tivesse sido feito diretamente no branch.

main:     A ─ B ─ C
feature:          C ─ D ─ E
# após merge → main aponta para E
Three-way Merge
Quando ambos os branches têm commits novos

Git usa três pontos: a ponta do branch atual, a ponta do branch a ser mergeado e o ancestral comum. Cria um merge commit com dois pais, preservando a história dos dois branches.

main:    A ─ B ─ C ─────── M
feature:         └─ D ─ E ─┘

Conflitos de merge

Quando dois branches modificam as mesmas linhas do mesmo arquivo, Git não sabe qual versão preservar e pausa o processo com marcadores de conflito:

<<<<<<< HEAD (sua versão)
  return user.authenticate(token)
=======
  return user.validateToken(token, options)
>>>>>>> feature/auth (versão sendo mergeada)

# 1. Editar o arquivo — remover marcadores, escolher (ou combinar) versões
# 2. Marcar como resolvido
git add src/auth.js
# 3. Finalizar o merge
git commit

Merge vs Rebase 4 min

Ambos integram mudanças de um branch em outro. A diferença está em como o histórico é escrito.

🔀 Merge
Preserva o histórico real
main:    A ─ B ─ C ─── M
feature:         └─ D ─┘
# M tem dois pais: C e D
✔ Preserva quando cada trabalho aconteceu
✔ Seguro para branches públicos/compartilhados
✔ Fácil de entender o que aconteceu
✘ Histórico "bagunçado" em projetos grandes
✘ Merge commits poluem o log
Quando usar Integrar branches de feature que outras pessoas estão usando. Pull requests em GitHub/GitLab. Branches públicos em geral.
🔁 Rebase
Reescreve o histórico como linear
antes:   main: A ─ B ─ C
         feat: B ─ D
após:    main: A ─ B ─ C ─ D'
# D' é D reescrito sobre C
✔ Histórico limpo e linear
✔ Fácil de seguir com git log
✘ Reescreve SHAs dos commits
✘ Perigoso em branches compartilhados
Quando usar Atualizar branch local com mudanças do main antes de abrir PR. Limpeza de histórico local antes de push. Nunca em commits já publicados que outros usam.
Regra de Ouro do Rebase: Nunca faça rebase de commits que já foram enviados (push) para um repositório público e que outras pessoas possam ter baseado trabalho neles. Rebase reescreve o histórico — quem clonou os commits antigos terá conflitos sérios.
# Fluxo típico com rebase (atualizar feature antes do PR)
git switch feature/auth
git fetch origin
git rebase origin/main    # replay dos commits da feature sobre o main atual

# Se conflito:
# 1. resolver conflito
git add arquivo-resolvido
git rebase --continue     # continua para o próximo commit
# ou
git rebase --abort        # desiste do rebase

# Merge final (no GitHub isso vira PR)
git switch main
git merge feature/auth    # agora é fast-forward, sem merge commit

Worktree — múltiplos checkouts 3 min

git worktree permite ter múltiplos diretórios de trabalho ativos ao mesmo tempo, todos conectados ao mesmo repositório Git (.git/). Você pode ter dois branches abertos em diretórios separados, sem stash, sem clonar novamente.

Quando usar

Você está no meio de uma feature. Chega um bug crítico em produção. Sem worktree, precisaria de stash ou de um clone separado:

# Criar um worktree para o hotfix em um diretório separado
git worktree add ../hotfix-1234 main

# Agora você tem:
# ~/projeto/          → sua feature em andamento (intacta)
# ~/hotfix-1234/      → branch main, para corrigir o bug

# Depois de corrigir e commitar no hotfix-1234:
git worktree remove ../hotfix-1234

# Listar todos os worktrees ativos
git worktree list

# Criar worktree com branch novo
git worktree add -b fix/login-timeout ../fix-login main
Abordagem Repositório Branches simultâneos Uso de disco
git worktree Único .git compartilhado Sim, N diretórios Mínimo
git clone Repositório separado Um por clone Alto (duplica tudo)
git stash Mesmo repo Não (salva temporariamente) Mínimo

Resumo dos Comandos Principais 3 min

Setup e Configuração
git config --global user.nameDefine nome do autor
git config --global user.emailDefine email do autor
git initInicia repositório no diretório atual
git clone <url>Clona repositório remoto
Fluxo Básico
git statusEstado atual do repositório
git add <arquivo>Adiciona arquivo ao stage
git add -pStage interativo por partes (hunks)
git commit -m "msg"Cria commit com mensagem
git diffMudanças não staged
git diff --stagedMudanças staged (será commitado)
git log --oneline --graphHistórico visual compacto
git show <sha>Detalhes de um commit
Branches e Merge
git switch -c <branch>Cria e muda para branch
git switch <branch>Muda para branch existente
git branch -d <branch>Deleta branch (seguro)
git merge <branch>Integra branch no atual
git rebase <branch>Replay commits sobre outro branch
git cherry-pick <sha>Aplica commit específico no branch atual
Desfazer e Recuperar
git restore <arquivo>Descarta mudanças no working dir
git restore --staged <arquivo>Remove do stage (mantém mudança)
git revert <sha>Cria commit que desfaz outro (seguro)
git stashSalva mudanças temporariamente
git stash popRestaura último stash
git reset --soft HEAD~1Desfaz commit, mantém no stage
Remotos
git remote -vLista remotos configurados
git fetch originBaixa mudanças sem integrar
git pullfetch + merge (ou rebase)
git push origin <branch>Envia branch para remoto
🐙
Parte 2 de 2
GitHub
Hospedagem, colaboração e automação — como a equipe trabalha junto
17
minutos

O que é GitHub 3 min

GitHub é uma plataforma de hospedagem de repositórios Git na nuvem, combinada com ferramentas de colaboração, automação e gerenciamento de projeto. É o maior host de código do mundo: mais de 100 milhões de desenvolvedores e mais de 420 milhões de repositórios.

Abril de 2008 — Fundação
Tom Preston-Werner, Chris Wanstrath e PJ Hyett fundaram o GitHub com uma premissa simples: tornar Git acessível e social. O repositório Grit (biblioteca Ruby para Git) foi o primeiro a ser hospedado na plataforma.

Em 2018, a Microsoft adquiriu o GitHub por US$ 7,5 bilhões. Desde então, investiu significativamente na plataforma — GitHub Actions, Codespaces, Copilot — mantendo-a independente e open-source-friendly.

Git resolve o controle de versão local e distribuído. GitHub resolve a camada de colaboração: onde o código vive na nuvem, como pessoas trabalham juntas, como mudanças são revisadas antes de entrar no projeto, como automações são disparadas.

Integração Git ↔ GitHub 3 min

🖥
Git Local
Repositório na sua máquina.
Commits, branches, histórico.
git push
git pull / fetch
☁️
GitHub Remote
Repositório na nuvem.
Origin (upstream) do projeto.

Configurar o remote

# Ligar repositório local ao GitHub (novo repo)
git remote add origin git@github.com:usuario/repo.git

# Verificar remotes
git remote -v

# Enviar branch pela primeira vez
git push -u origin main        # -u define upstream (lembra o tracking)

# Próximos pushes nesse branch
git push

# Baixar mudanças sem integrar (recomendado)
git fetch origin
git merge origin/main          # ou: git rebase origin/main

# Atalho: fetch + merge/rebase
git pull --rebase origin main

SSH vs HTTPS

Protocolo Autenticação Recomendado para
SSH Chave pública/privada (~/.ssh) Uso diário — sem senha, seguro
HTTPS Token de acesso pessoal (PAT) CI/CD, ambientes sem SSH, scripts
# Gerar chave SSH
ssh-keygen -t ed25519 -C "seu@email.com"

# Exibir chave pública (colar no GitHub → Settings → SSH keys)
cat ~/.ssh/id_ed25519.pub

# Testar conexão
ssh -T git@github.com
# → Hi usuario! You've successfully authenticated.

Vantagens da Integração 2 min

☁️
Backup na nuvem
Repositório seguro e acessível de qualquer lugar. Se seu HD morrer, o código está seguro.
👥
Colaboração estruturada
Pull Requests garantem que nenhum código entra sem revisão. Discussões vinculadas ao código.
⚙️
CI/CD integrado
GitHub Actions dispara testes, linting e deploy automaticamente em cada push ou PR.
🔍
Rastreabilidade
Issues linkadas a PRs linkados a commits. Histórico completo de decisões e mudanças.
🔐
Controle de acesso
Permissões granulares: quem pode ler, escrever, aprovar PRs, fazer push direto em branches protegidos.
📊
Visibilidade
Dashboards de contribuição, insights de repositório, gráficos de atividade, métricas de PR.

Recursos do GitHub 5 min

🐛
Issues
Rastreamento de tarefas, bugs e features. Suporta labels, milestones, assignees, templates e sub-issues. fixes #42 em um PR fecha a issue automaticamente no merge.
🔀
Pull Requests
Proposta formal de merge. Centraliza: diff do código, commits, checks de CI, discussões e reviews. Draft PRs permitem abrir discussão antes do código estar pronto.
🛡
Branch Protection
Regras que protegem branches críticos: exige N aprovações, bloqueia push direto, força CI verde, proíbe force push, exige histórico linear.
👤
CODEOWNERS
Arquivo que mapeia caminhos a donos. GitHub solicita review automaticamente dos owners quando um PR toca arquivos deles. Integra com branch protection.
📋
Projects
Planejamento visual tipo kanban/tabela. Issues e PRs aparecem como cards. Campos customizados (status, prioridade, sprint). Automações built-in.
Actions
CI/CD nativo. Workflows em YAML disparados por push, PR, schedule, etc. Marketplace com milhares de actions reutilizáveis.

Branch Protection — configurações principais

Regra O que protege
Require pull request reviews Exige N aprovações antes do merge
Require review from Code Owners CODEOWNERS devem aprovar PRs que tocam seus arquivos
Dismiss stale reviews Invalida aprovações quando novo código é adicionado
Require status checks CI/CD deve passar antes do merge
Require linear history Proíbe merge commits — força squash ou rebase
Prevent force push Bloqueia git push --force no branch
Prevent deletion Impede deleção acidental do branch
Include administrators Aplica as regras também para admins (sem exceções)

CODEOWNERS — exemplo

# .github/CODEOWNERS
# Última regra que corresponde tem precedência

*                     @org/equipe-geral        # qualquer arquivo
*.js *.ts             @fulano @ciclana          # arquivos JS/TS
/docs/                @org/equipe-docs          # pasta docs
src/auth/             @org/equipe-seguranca     # autenticação
.github/CODEOWNERS    @org/admin                # o próprio CODEOWNERS

Code Review Workflow 4 min

O workflow de code review no GitHub é construído ao redor dos Pull Requests. É o processo que garante que código seja revisado, discutido e aprovado antes de entrar no branch principal.

1
Branch + commits
Desenvolvedor cria um branch, faz commits e abre um PR (possivelmente como Draft durante o desenvolvimento).
2
PR aberto / Ready for Review
GitHub notifica automaticamente os CODEOWNERS dos arquivos modificados. Revisores são adicionados manual ou automaticamente.
3
CI/CD roda
GitHub Actions executa testes, linting, build. Status de cada check aparece no PR. Branch protection pode bloquear merge até tudo passar.
4
Review do código
Revisores comentam em linhas específicas do diff. Podem usar Suggested Changes (o autor aplica com um clique). Threads são marcadas como "Resolved" conforme resolvidas.
5
Aprovação
Reviewer submete review formal. Se "Request changes", bloqueia merge. Novo push invalida aprovações anteriores (com "Dismiss stale reviews" ativo).
6
Merge
Com todas as aprovações e checks verdes, o PR pode ser mergeado. Estratégia configurável: merge commit, squash, rebase. Issue vinculada fecha automaticamente.

Tipos de Review

💬
Comment
Feedback geral sem bloquear nem aprovar. Para sugestões não-críticas ou perguntas.
Approve
Aprova o PR para merge. Conta para o número mínimo de aprovações configurado na branch protection.
🚫
Request Changes
Bloqueia o merge. O PR fica bloqueado até o reviewer aprovar novamente após as correções.

Estratégias de Merge no PR

Estratégia Resultado Quando usar
Merge commit Preserva todos os commits + merge commit Branches com histórico valioso
Squash and merge Comprime tudo em 1 commit no main Features com commits de rascunho
Rebase and merge Replay linear, sem merge commit Histórico limpo, commits bem escritos

GitHub CLI 3 min

gh é a CLI oficial do GitHub. Permite interagir com Issues, PRs, repos e Actions diretamente do terminal, sem abrir o browser.

# Instalar (Debian/Ubuntu)
sudo apt install gh

# Autenticar (abre browser)
gh auth login

# Verificar autenticação
gh auth status

Repositórios

gh repo createCria repositório (interativo ou com flags)
gh repo clone usuario/repoClona repositório
gh repo forkFaz fork do repositório atual
gh repo view --webAbre repositório no browser
gh repo syncSincroniza fork com upstream

Issues

gh issue createCria issue (interativo)
gh issue listLista issues abertas
gh issue view 42Ver detalhes da issue #42
gh issue comment 42 -b "texto"Comentar na issue
gh issue close 42Fechar issue

Pull Requests

gh pr createCria PR (interativo, com título e body)
gh pr listLista PRs abertos
gh pr view 15Ver detalhes do PR #15
gh pr checkout 15Faz checkout local do branch do PR
gh pr review 15 --approveAprova o PR
gh pr review 15 --request-changes -b "msg"Solicita mudanças
gh pr merge 15 --squashMerge com squash
gh pr diff 15Ver diff do PR no terminal
# Fluxo completo com gh CLI
git switch -c feature/nova-autenticacao
# ... commits ...
gh pr create --title "feat: nova autenticação OAuth" \
             --body "Implementa login com Google. Fecha #38." \
             --assignee @me \
             --label "feature"

# Outro desenvolvedor revisa:
gh pr checkout 22
gh pr review 22 --approve --body "LGTM, excelente trabalho"

# Merge após aprovações
gh pr merge 22 --squash --delete-branch
Dica: gh respeita o repositório do diretório atual. Em qualquer pasta git com remote no GitHub, os comandos gh pr list, gh issue list etc. operam no repositório correto automaticamente.

Fim da apresentação

Guias de referência completos disponíveis:

📖 Guia Git Completo → 📖 Guia GitHub Completo →
1 / 14
~45 min restantes
Modo Apresentação
P
Entrar / sair (fullscreen)
Esc
Sair
Navegação
Próxima seção
Seção anterior
Scroll vertical
Home
Primeiro slide
End
Último slide
Recursos
Z
Foco — só seção atual
Espaço
Timer pausar / iniciar
?
Fechar esta ajuda
Parte 1 — Git
Seção 1 de 14
⏱ 0 min
Clique para avançar