🔍
Ferramentas para Desenvolvedores
March 19, 20266 min readBy BrowseryTools Team

Como Comparar Arquivos de Texto e Encontrar Diferenças sem Nenhum Software

Aprenda como os algoritmos de diff de texto funcionam, como ler a saída de diff unificado, a diferença entre diffs em nível de linha e palavra, e como o git diff funciona por baixo dos panos.

diffcomparação de textogitrevisão de códigocomparação de arquivos

Todo desenvolvedor já enfrentou essa situação: duas versões de um arquivo que deveriam ser idênticas, mas algo mudou. Talvez seja um arquivo de configuração que foi editado manualmente em um servidor. Talvez seja um contrato que voltou de um advogado com alterações não declaradas. Talvez seja um arquivo de tradução que um fornecedor devolveu e você precisa verificar se nada foi acidentalmente excluído. Em todos esses casos, a resposta é a mesma: execute um diff.

Você pode comparar quaisquer dois blocos de texto instantaneamente usando a Ferramenta de Diff de Texto do BrowseryTools — gratuita, sem cadastro, tudo fica no seu navegador.

Por que o Diff de Texto Importa

O diff de texto não é apenas uma ferramenta para desenvolvedores. Qualquer situação em que existem duas versões de um documento e as diferenças precisam ser identificadas é um problema de diff:

  • Revisão de código — entender o que mudou entre duas versões do código-fonte antes de aprovar um merge
  • Comparação de contratos e documentos jurídicos — identificar exatamente quais cláusulas foram adicionadas, removidas ou modificadas entre rascunhos
  • Gerenciamento de configuração — confirmar que um arquivo de configuração implantado corresponde à versão no controle de origem
  • Verificação de conteúdo traduzido — verificar que um documento traduzido cobre todas as mesmas seções do original
  • Validação de dados — comparar exportações CSV de dois sistemas para encontrar discrepâncias
  • Revisão de texto — detectar alterações não intencionais entre um rascunho de documento e sua versão publicada

Como os Algoritmos de Diff Funcionam

O problema central que um algoritmo de diff resolve é: dadas duas sequências A e B, encontrar o conjunto mínimo de edições (inserções e exclusões) necessárias para transformar A em B. Isso é formalmente o problema da Subsequência Comum Mais Longa (LCS). O diff então reporta o que não estava no LCS — as linhas únicas em A (exclusões) e as linhas únicas em B (inserções).

Dois algoritmos dominam as implementações práticas:

  • Diff de Myers (1986) — o algoritmo por trás do comando diff Unix original e do Git. Eugene Myers o projetou para encontrar o script de edição mais curto (o diff com o menor número total de inserções e exclusões) em tempo O(ND), onde N é o tamanho total de ambas as entradas e D é o número de diferenças. É rápido e produz diffs mínimos, mas pode produzir saída contraintuitiva quando grandes blocos de código são movidos.
  • Diff de Patience — desenvolvido por Bram Cohen (criador do BitTorrent) e usado pelo Bazaar, depois popularizado pelo Kaleidoscope. Em vez de trabalhar linha por linha, o diff de patience primeiro combina linhas únicas que aparecem exatamente uma vez em ambos os arquivos. Isso produz saída que preserva muito melhor os limites de funções e blocos do que o diff de Myers para código-fonte. O Git o suporta via git diff --patience.

Lendo a Saída de Diff Unificado

O formato de diff unificado é a saída padrão do git diff e da maioria das ferramentas de diff. Uma vez que você entende a notação, ela se torna imediatamente legível.

--- a/config.yml       (arquivo original)
+++ b/config.yml       (arquivo modificado)
@@ -10,7 +10,8 @@     (cabeçalho do hunk)
 server:
   host: localhost
-  port: 3000
+  port: 8080
+  timeout: 30
   debug: false

Os elementos principais para ler:

  • Linhas começando com - — presentes no original, removidas na nova versão (mostradas em vermelho)
  • Linhas começando com + — não estavam no original, adicionadas na nova versão (mostradas em verde)
  • Linhas sem prefixo (espaço) — linhas de contexto inalteradas, mostradas para orientação
  • O cabeçalho de hunk @@ — lê-se como "começando na linha 10, mostrando 7 linhas do original; começando na linha 10, mostrando 8 linhas da nova versão." O formato é @@ -início,contagem +início,contagem @@.

Diff em Nível de Palavra vs Linha vs Caractere

A granularidade de um diff determina o quanto é útil para uma determinada tarefa.

  • Diff em nível de linha — o padrão para código-fonte. Cada linha é tratada como uma unidade atômica. Rápido e adequado para código onde as linhas são curtas e significativas. Se uma única palavra mudar em um parágrafo longo, a linha inteira é mostrada como alterada.
  • Diff em nível de palavra — adequado para prosa e documentação. Palavras alteradas dentro de uma linha são destacadas individualmente, fornecendo um sinal muito mais claro em documentos com muito texto. A maioria das ferramentas de comparação de documentos (Controle de Alterações do Microsoft Word, histórico de versões do Google Docs) opera no nível de palavra.
  • Diff em nível de caractere — destaca mudanças de caracteres individuais dentro das palavras. Mais útil para detectar erros de digitação sutis, mudanças de espaços em branco, caracteres invisíveis (espaços de largura zero, espaços não quebráveis) ou diferenças de codificação. Essencial para comparar dados que parecem visualmente idênticos mas diferem no nível de byte.

A Ferramenta de Diff de Texto do BrowseryTools destaca as diferenças inline, facilitando a identificação de mudanças num relance sem ler o formato de diff unificado manualmente.

Git Diff por Baixo dos Panos

Quando você executa git diff, o Git calcula o diff de Myers entre as versões de objetos armazenadas em seu banco de dados de objetos. Alguns flags úteis alteram o comportamento:

git diff                      # unstaged changes vs last commit
git diff --staged             # staged changes vs last commit
git diff HEAD~3               # current state vs 3 commits ago
git diff main...feature       # what feature branch adds to main
git diff --word-diff          # word-level highlighting
git diff --patience           # use patience algorithm (better for code)
git diff --stat               # summary: files changed, insertions, deletions

Entendendo git diff main...feature especificamente: a notação de três pontos mostra o que o branch de feature adicionou desde que divergiu do main, excluindo quaisquer mudanças que tenham ocorrido no main desde o ponto de ramificação. Isso é quase sempre o que você quer para revisão de pull request, em vez dos dois pontos main..feature que comparam diretamente as pontas atuais de ambos os branches.

Casos de Uso Práticos

Comparando Arquivos de Configuração

Arquivos de configuração (YAML, TOML, JSON, .env) são fontes frequentes de bugs em produção quando as versões implantadas divergem das versões controladas por origem. Antes de depurar um misterioso problema de produção, fazer diff da configuração ao vivo com a configuração esperada frequentemente revela a causa imediatamente.

Comparação de Contratos e Documentos

Quando um rascunho de contrato volta da outra parte, nunca confie em um resumo do que mudou. Exporte ambas as versões para texto simples e execute um diff. Advogados são conhecidos por alterar termos definidos, adicionar limites de responsabilidade ou modificar prazos de aviso de formas que uma leitura rápida não percebe. Um diff em nível de palavra torna cada mudança visível.

Verificação de Documento Traduzido

Ao trabalhar com conteúdo traduzido, compare a estrutura do documento traduzido com a do original. Um diff estrutural de títulos de seção e contagens de parágrafos revela se alguma seção foi acidentalmente omitida ou mesclada durante a tradução.

Ferramentas de Diff Comparadas

  • git diff — embutido, nível de linha, formato diff unificado, sem GUI. A linha de base para todo trabalho de código.
  • vimdiff — diff lado a lado baseado em terminal dentro do Vim. Poderoso para comparações rápidas sem sair do terminal; curva de aprendizado íngreme.
  • Beyond Compare — ferramenta de desktop comercial com sincronização de pastas, diff binário e merge de três vias. O padrão ouro para comparação de documentos não-desenvolvedor.
  • Meld — ferramenta de diff GUI gratuita e multiplataforma com suporte a merge de três vias. A melhor alternativa gratuita ao Beyond Compare.
  • BrowseryTools Text Diff — instantâneo, baseado em navegador, sem instalação. Melhor para comparações únicas rápidas, especialmente para texto que você não gostaria de colar em um serviço online.

🛠️

Try the Tools — 100% Free, No Sign-Up

Everything runs in your browser. No uploads. No accounts. No ads.

Explore All Tools →