📚 Aula: Controle de Versionamento

Do Caos à Colaboração: A Evolução do Código

🎯 Objetivos da Aula

Ao final desta sessão, você será capaz de:

  1. Entender a necessidade histórica do versionamento.
  2. Diferenciar arquiteturas Centralizadas (CVCS) de Distribuídas (DVCS).
  3. Dominar o fluxo de estados do Git (Working Directory, Staging, Local Repo).
  4. Executar o ciclo básico de vida de um arquivo versionado.

1. O que é Controle de Versão (VCS)?

O Cenário do Caos (A Era Pré-VCS)

Antigamente, a "gestão" era feita via pastas:

  • projeto_final.zip
  • projeto_final_v2_ajustes.zip
  • projeto_final_AGORA_VAI_EDICAO_CLIENTE.zip

Problemas: Quem alterou a linha 50? Por que o sistema parou de funcionar ontem? Como juntar o meu código com o do colega sem apagar nada?

🛠️ A Solução: Version Control System (VCS)

Um VCS é como uma "Máquina do Tempo" para o seu código.

Funcionalidades Principais:

  • Reversão: Voltar o projeto inteiro para um estado anterior.
  • Integridade: Saber exatamente quem introduziu um bug.
  • Ramificação (Branching): Testar ideias novas sem quebrar a versão que já está em produção.

2. Evolução Histórica e Modelos

A) Era Centralizada (Ex: SVN, CVS)

  • Modelo: Cliente-Servidor.
  • Funcionamento: Existe um servidor único. Para ver o histórico ou comitar, você precisa estar online.
  • Risco: Se o servidor pifar e não houver backup, o histórico de 10 anos da empresa morre.

B) Era Distribuída (Ex: Git, Mercurial)

  • Revolução: Cada desenvolvedor tem uma cópia idêntica de todo o banco de dados (histórico completo) no seu HD.
  • Vantagem: Rapidez total (operações locais) e segurança (cada PC é um backup).

📊 Comparativo: Centralizado vs. Distribuído

Característica Centralizado (SVN) Distribuído (Git)
Histórico Apenas no Servidor Local e Remoto
Acesso Offline Impossível (apenas leitura) Total (Commits locais)
Velocidade Depende da Rede Instantânea
Ramificação Pesada / Complexa Leve / Essencial

3. A Origem do Git (Curiosidade Histórica)

Ano: 2005
Protagonista: Linus Torvalds (Criador do Linux).

Contexto: A comunidade Linux usava um software proprietário chamado BitKeeper. Quando a gratuidade foi revogada, Linus decidiu criar sua própria ferramenta em apenas duas semanas.

"Eu sou um bastardo egoísta, e chamo todos os meus projetos de 'eu'. Primeiro o Linux, agora o Git (gíria inglesa para 'pessoa desagradável')." — Linus Torvalds.

4. Os 3 Estados do Git

Para entender o Git, você precisa entender onde o seu arquivo está:

  1. Working Directory: Sua pasta local (arquivos que você está editando).
  2. Staging Area (Index): Uma área de "preparação". Você escolhe o que vai no próximo commit.
  3. Repository (.git): Onde as fotos (snapshots) do seu projeto são salvas permanentemente.

5. Mãos na Massa: Comandos Essenciais

Configuração Inicial

git config --global user.name "Seu Nome"
git config --global user.email "seu@email.com"

O Ciclo de Vida

git init                # Cria um novo repositório
git status              # O "GPS" do desenvolvedor (mostra onde você está)
git add arquivo.txt     # Leva o arquivo para o "palco" (Staging)
git commit -m "Sua msg" # Tira a foto oficial do momento

6. Colaboração Remota (GitHub/GitLab)

O Git é a ferramenta. O GitHub é a rede social/hospedagem.

  • git clone <url>: Baixa um projeto existente.
  • git pull: Traz as novidades da nuvem para o seu PC.
  • git push: Envia suas fotos (commits) locais para a nuvem.

7. Estudo de Caso: O Conflito

Cenário:

  • Ana altera a linha 10 do arquivo login.js para "Botão Azul".
  • Beto altera a mesma linha 10 para "Botão Verde".
  • Ambos tentam enviar o código.

O que o Git faz?
Ele impede o overwrite automático. Ele marca o arquivo e diz: "Humanos, decidam qual versão fica!". Isso garante que nenhum código seja apagado por acidente.

💡 Boas Práticas (Para a vida profissional)

  • Commits Atômicos: Não faça 10 tarefas e um commit "várias coisas". Faça um commit para cada pequena correção.

  • Mensagens Claras: - ❌ git commit -m "ajustes"

  • ✅ git commit -m "corrige erro de validação no campo de email"

  • Ignore o Lixo: Use o arquivo .gitignore para não versionar pastas de dependências (ex: node_modules) ou arquivos de senha.

🛠️ Atividade Prática

  1. Inicie um repositório: git init.
  2. Crie um arquivo README.md.
  3. Adicione ao staging: git add ..
  4. Comite: git commit -m "docs: adiciona readme inicial".
  5. Crie uma nova branch: git checkout -b feature-test.
  6. Altere o arquivo e veja a diferença com git diff.

🏁 Conclusão

O versionamento não é apenas sobre "salvar arquivos", é sobre rastreabilidade, segurança e colaboração. Sem Git, o desenvolvimento de software moderno seria impossível.

Dúvidas?
"Git is easy to use, but hard to learn." — Vamos praticar!