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
- Uso de
git rebase --continue: Permite avançar incrementalmente commit por commit na pilha de rebase após resolver conflitos pontuais. - Inspeção de Reflog: Audita todos os saltos de ponteiro do repositório, garantindo que nenhum dado comitado seja destruído.
- 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto