Como Comparar Ficheiros de Texto: Ferramentas e Técnicas Diff
Comparar texto é uma tarefa diária para programadores. Quer esteja a rever alterações de código, a depurar desvios de configuração ou a fundir documentos, compreender a saída diff é essencial. Este guia abrange os algoritmos, ferramentas e técnicas para uma comparação de texto eficaz.
Compreender a Saída Diff
O formato clássico unified diff mostra as alterações entre dois ficheiros:
--- original.txt
+++ modified.txt
@@ -1,5 +1,6 @@
Line 1: unchanged
-Line 2: removed text
+Line 2: modified text
+Line 2.5: added line
Line 3: unchanged
Line 4: unchanged
-Line 5: also removed
- As linhas que começam com
-foram removidas (do original) - As linhas que começam com
+foram adicionadas (na versão modificada) - As linhas que começam com
(espaço) são contexto inalterado - Os marcadores
@@mostram os números de linha afetados
Algoritmos Diff
Algoritmo de Myers
O algoritmo predefinido utilizado pelo Git e pela maioria das ferramentas diff. Encontra o script de edição mais curto — o número mínimo de inserções e eliminações para transformar um ficheiro noutro. Produz diffs limpos e legíveis para a maioria do conteúdo.
Patience Diff
Melhor para texto estruturado como código-fonte. Em vez de encontrar a edição mais curta, primeiro faz a correspondência de linhas únicas que aparecem em ambos os ficheiros e depois aplica diff às secções entre elas. Isto frequentemente produz diffs mais significativos que se alinham com blocos lógicos de código.
git diff --patience
Histogram Diff
Uma melhoria do patience diff, utilizado como predefinição do Git desde a versão 2.x. Trata melhor linhas repetidas e produz saída mais limpa para ficheiros com alterações estruturais significativas.
Comparar Texto Online
Para comparações rápidas sem instalar ferramentas, o nosso Verificador de Diferenças de Texto oferece vistas lado a lado e em linha diretamente no seu navegador. Cole dois textos e veja as alterações destacadas instantaneamente — todo o processamento acontece localmente.
Ferramentas Diff de Linha de Comandos
diff (POSIX)
A ferramenta clássica Unix:
# Unified format (most readable)
diff -u file1.txt file2.txt
# Side-by-side
diff -y file1.txt file2.txt
# Ignore whitespace
diff -w file1.txt file2.txt
# Recursive directory comparison
diff -r dir1/ dir2/
git diff
Mesmo fora de um repositório Git, o git diff oferece saída superior:
# Compare two files
git diff --no-index file1.txt file2.txt
# Word-level diff (highlights changed words, not whole lines)
git diff --word-diff
# Stat summary (files changed, insertions, deletions)
git diff --stat
colordiff / delta
Para saída colorida no terminal:
# colordiff: drop-in replacement for diff
colordiff file1.txt file2.txt
# delta: modern diff viewer for Git
git diff | delta
Diff para Revisão de Código
Uma revisão de código eficaz depende de diffs legíveis. Eis técnicas para melhorar a qualidade do diff:
1. Manter os Commits Focados
Diffs grandes que abrangem centenas de linhas são difíceis de rever. Cada commit deve abordar uma preocupação:
- Separar alterações de formatação de alterações de lógica
- Dividir refatorações grandes em passos incrementais
- Mover ficheiros num commit, modificá-los noutro
2. Utilizar Diff ao Nível da Palavra
Diffs ao nível da linha escondem a alteração real quando uma linha tem uma pequena modificação enterrada numa string longa:
# Shows only the changed words, not entire lines
git diff --word-diff
3. Ignorar Espaços em Branco nas Revisões
Alterações de formatação adicionam ruído a diffs significativos:
git diff -w # Ignore all whitespace changes
git diff -b # Ignore whitespace amount changes
4. Rever com Contexto
Mais linhas de contexto ajudam a compreender o código envolvente:
git diff -U10 # Show 10 lines of context (default is 3)
Tratar Conflitos de Merge
Quando o Git encontra alterações conflituantes, marca o conflito no ficheiro:
<<<<<<< HEAD
const timeout = 5000;
=======
const timeout = 10000;
>>>>>>> feature-branch
Para resolver:
- Compreender ambas as alterações — por que razão foi feita cada uma?
- Decidir qual versão manter, ou combiná-las
- Remover os marcadores de conflito
- Testar o resultado
Para merges complexos, utilize uma ferramenta de merge de três vias que mostra o ancestral comum juntamente com ambas as versões.
Comparar Conteúdo Não Textual
JSON Diff
O diff de texto padrão tem dificuldade com JSON porque a ordem das chaves e alterações de formatação criam ruído. O diff semântico de JSON compara a estrutura de dados real. Consulte a nossa ferramenta JSON Diff para comparação estrutural.
CSV Diff
Dados tabulares precisam de comparação consciente de colunas. O diff padrão trata cada linha como uma string, falhando alterações ao nível da célula.
Ficheiros Binários
O diff não consegue comparar ficheiros binários de forma significativa. Para imagens, utilize ferramentas de diff visual. Para documentos, converta primeiro para texto ou utilize ferramentas de comparação específicas do formato.
Diff em Automação
Pipelines CI/CD
Utilize diff para verificar saída esperada em testes:
command_under_test > actual_output.txt
diff expected_output.txt actual_output.txt
# Exit code 0 = identical, 1 = different
Deteção de Desvios de Configuração
Compare a configuração em produção com o estado esperado:
diff deployed_config.yaml expected_config.yaml
Rastreamento de Alterações na Documentação
Acompanhe alterações na documentação para revisão:
git diff --stat HEAD~5..HEAD -- docs/
FAQ
O que significa "hunk" na saída diff?
Um hunk é um bloco contíguo de alterações num diff. Cada linha @@ inicia um novo hunk. O Git agrupa alterações próximas em hunks únicos — se duas alterações estão a 3 linhas de distância uma da outra (o contexto predefinido), aparecem no mesmo hunk. Os hunks podem ser staged independentemente utilizando git add -p.
Como comparo dois ramos no Git?
Utilize git diff branch1..branch2 para ver todas as diferenças entre dois ramos. Adicione --stat para um resumo, ou -- path/to/file para comparar um ficheiro específico. Para comparar o que um ramo adicionou desde que divergiu, utilize três pontos: git diff branch1...branch2.
Recursos Relacionados
- Verificador de Diferenças de Texto — Compare texto lado a lado no seu navegador
- Guia de Depuração JSON Diff — Comparação estrutural para dados JSON
- Folha de Consulta Regex — Correspondência de padrões para encontrar alterações específicas