Módulo 03 — Versionamento com Git e GitHub • Bloco 3: Rebase, Recuperação & Autenticação Criptográfica


📝 1. Script de Demonstração Prática: Remotos, Concorrência e Pull Rebase

O script a seguir cria um ambiente de rede simulado localmente: inicializa um repositório bare central (representando o GitHub), conecta dois clones independentes (Alice e Bob), induz um cenário clássico de divergência concorrente (ahead e behind) e demonstra a sincronização linear perfeita via git pull --rebase:

#!/usr/bin/env bash
# ==============================================================================
# Laboratório Prático - Capítulo 12: Remotos, Tracking e git pull --rebase
# ==============================================================================

set -e
BASE_DIR="/tmp/lab_git_remotos"
rm -rf "$BASE_DIR"
mkdir -p "$BASE_DIR"
cd "$BASE_DIR"

echo "=== 1. Criando Repositório Bare Central (Representando o GitHub) ==="
git init --bare servidor_central.git

echo -e "\n=== 2. Clonando como Desenvolvedor Alice e criando o projeto ==="
git clone servidor_central.git dev_alice
cd dev_alice
git config --local user.name "Alice Dev"
git config --local user.email "alice@techcorp.io"
git config --local pull.rebase true

echo "# Microsserviço de Notificações" > README.md
git add README.md
git commit -m "docs: commit inicial de apresentacao"
git push -u origin main

echo -e "\n=== 3. Clonando como Desenvolvedor Bob ==="
cd "$BASE_DIR"
git clone servidor_central.git dev_bob
cd dev_bob
git config --local user.name "Bob Dev"
git config --local user.email "bob@techcorp.io"
git config --local pull.rebase true

echo -e "\n=== 4. Simulando Concorrência: Bob comita e envia para o servidor ==="
echo "def enviar_email(): pass" > notifier.py
git add notifier.py
git commit -m "feat(notifier): modulo de envio de emails transacionais"
git push origin main

echo -e "\n=== 5. Alice faz commit local sem saber que Bob enviou código ==="
cd "$BASE_DIR/dev_alice"
echo "def enviar_sms(): pass" > sms.py
git add sms.py
git commit -m "feat(sms): modulo de notificacao via SMS"

echo -e "\n=== 6. Diagnosticando a Divergência no clone de Alice ==="
# Alice executa fetch seguro para atualizar origin/main
git fetch origin

# Inspecionando o status detalhado
echo "Status de tracking de Alice (deve acusar ahead 1, behind 1):"
git status -sb

echo -e "\nVisualizando o que Bob fez no servidor que Alice ainda não tem:"
git log main..origin/main --oneline

echo -e "\n=== 7. Resolvendo a Divergência com git pull --rebase ==="
# O pull com rebase lineariza o commit de Alice sobre o commit de Bob
git pull --rebase origin main

echo -e "\nGrafo perfeitamente linear consolidado de Alice:"
git log --graph --oneline --all

# Agora o envio ao servidor ocorre com sucesso via Fast-Forward
echo "Enviando alterações linearizadas para o servidor:"
git push origin main

echo -e "\n=== 8. Testando Higiene com git fetch --prune ==="
# Bob deleta uma branch remota no servidor
cd "$BASE_DIR/dev_bob"
git switch -c branch-temporaria
echo "temp" > temp.txt; git add temp.txt; git commit -m "temp"
git push -u origin branch-temporaria
git push origin --delete branch-temporaria

# Alice roda fetch com prune para limpar o ponteiro fantasma
cd "$BASE_DIR/dev_alice"
echo "Executando fetch com prune no clone de Alice:"
git fetch --prune origin

echo -e "\n=== Laboratório Concluído com Sucesso ==="

🔍 2. Inspeção Detalhada e Diagnóstico Forense

Comandos essenciais para auditar conexões e referências remotas:

# 1. Listar todas as URLs de remotos configuradas (Fetch e Push)
git remote -v

# 2. Inspecionar o relatório completo de tracking de um remote
git remote show origin

# 3. Alterar a URL de um remote existente (ex.: migração de HTTPS para SSH)
git remote set-url origin git@github.com:empresa/novo-repo.git

# 4. Listar todas as branches remotas rastreadas localmente
git branch -r