Pular para conteúdo

Aula 18 - Resolução de Conflitos Complexos e Rebasing Interativo 🔀

Objetivo Pedagógico

Objetivo: Dominar a estrutura de dados interna do Git (blobs, trees, commits, refs), o rebase interativo (git rebase -i), a resolução avançada de conflitos de merge e a ferramenta de segurança git reflog.


📑 1. Fundamentos Teóricos & Análise Técnica

O Git é fundamentalmente um sistema de arquivos indexado por conteúdo criptográfico (Content-Addressable Storage) baseado em um Grafo Acíclico Direcionado (DAG).

O domínio da manipulação do histórico do repositório exige conhecimento profundo das ferramentas de reestruturação: 1. Merge vs. Rebase: - git merge: Cria um Merge Commit com múltiplos pais, preservando o histórico histórico de bifurcação exato. Útil para registrar a integração formal de branches de release. - git rebase: Desconecta os commits da ramificação atual e os reaplica linearmente sobre a ponta da ramificação base. Resulta em um histórico limpo e sequencial (Linear History), facilitando auditorias e operações de git bisect. 2. Rebase Interativo (git rebase -i): Permite reescrever o histórico local antes de torná-lo público: - pick: Manter o commit. - reword: Alterar a mensagem do commit mantendo o código. - edit: Pausar para alterar arquivos no commit. - squash: Fundir o commit no commit anterior, combinando mensagens. - fixup: Fundir o commit no commit anterior, descartando a mensagem auxiliar. - drop: Descartar completamente o commit. 3. Resolução de Conflitos: Quando duas ramificações modificam os mesmos blocos de código, o Git interrompe a operação e insere marcadores de conflito (<<<<<<<, =======, >>>>>>>). A resolução técnica requer inspeção do ancestral comum (Base) via ferramentas como git merge-tool ou diff 3-way. 4. A Rede de Segurança Definitiva (git reflog): O Git mantém um diário de referência (Reference Log) gravando todas as movimentações do ponteiro HEAD. Qualquer commit acidentalmente perdido durante um rebase ou reset destrutivo pode ser recuperado a partir de seu hash no reflog.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    subgraph Histórico Antes do Rebase
        C1["Commit C1"] --> C2["Commit C2 (Base)"]
        C2 --> F1["Commit F1 (Feature)"]
        F1 --> F2["Commit F2 (Feature)"]
        C2 --> M1["Commit M1 (Main)"]
    end
    subgraph Histórico Após Rebase Linear
        M1 --> F1Prime["F1' (Reaplicado sobre M1)"]
        F1Prime --> F2Prime["F2' (Histórico 100% Linear)"]
    end
    style C1 fill:#e1f5fe,stroke:#01579b
    style M1 fill:#fff3e0,stroke:#e65100
    style F2Prime fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Regra de Ouro do Rebase: Jamais realize rebase em ramificações públicas compartilhadas por múltiplos desenvolvedores. - Diff 3-Way na Resolução: Análise comparando a versão Local (Ours), a versão Remota (Theirs) e o Ancestral Comum (Base). - Git Rerere (Reuse Recorded Resolution): Funcionalidade do Git que memoriza resoluções de conflitos passadas e as reaplica automaticamente em operações futuras. - Recuperação com Reflog: Capacidade de reverter qualquer estado anterior do repositório através de git reset --hard HEAD@{n}.


🛠️ 2. Implementação Prática em Git Internals, Rebase Interativo e Rastreabilidade

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// interactive_rebase_and_rescue.sh (Scripts de Rebase e Recuperação de Emergência)
#!/usr/bin/env bash
# 1. Iniciar rebase interativo dos últimos 3 commits para sanitizar histórico
# git rebase -i HEAD~3

# 2. Resolução de conflito durante rebase
# Supondo que um conflito ocorra em config.json:
echo "Resolvendo conflito manualmente..."
# (Edição do arquivo resolvendo marcadores <<<<<<< e >>>>>>>)
git add config.json

# Prosseguir com o rebase
git rebase --continue

# 3. Cenário de Emergência: Rebase desastroso ou commits perdidos!
# Como recuperar qualquer estado anterior usando reflog:
echo "Visualizando histórico absoluto do HEAD:"
git reflog -n 5

# Restaurar o repositório exatamente ao estado antes de iniciar o rebase
# git reset --hard HEAD@{1}
echo "Repositório restaurado com segurança absoluta!" 

💡 Análise Passo a Passo do Código

  1. Uso de git rebase --continue: Permite avançar incrementalmente commit por commit na pilha de rebase após resolver conflitos pontuais.
  2. Inspeção de Reflog: Audita todos os saltos de ponteiro do repositório, garantindo que nenhum dado comitado seja destruído.
  3. Preservação da Linearidade: Produz grafos limpos que simplificam a identificação de bugs por bissecção binária.

🎯 3. Próximos Passos & Sequência Didática