Como funciona a comparação de textos
Um diff responde a uma única pergunta: o que precisa mudar para transformar o primeiro texto no segundo? Este guia explica como as ferramentas de diff encontram a resposta, como ler o resultado e como preparar duas versões para que o resultado mostre as mudanças que importam, e não ruído.
O que um diff mostra
A maioria das ferramentas de diff, incluindo o Comparar textos da LeedyBox, compara textos linha por linha. Cada linha do resultado é de um de três tipos: inalterada (nas duas versões), removida (só no original) ou adicionada (só na nova versão). Não existe o tipo “alterada”, então uma linha em que uma palavra mudou aparece duas vezes, uma como removida e outra como adicionada:
Dear customer,
- Your order ships on Monday.
+ Your order ships on Tuesday.
Kind regards
As marcas seguem uma convenção antiga: - para removida, + para adicionada e um espaço para linhas inalteradas. As cores, geralmente vermelho e verde, repetem a mesma informação.
Como as linhas são associadas
Uma ferramenta de diff procura a sequência mais longa de linhas que aparecem nos dois textos na mesma ordem: a maior subsequência comum. Essas linhas ficam como inalteradas; todo o resto é marcado como removido ou adicionado. Se o original é A, B, C, D e o texto novo é A, C, B, D, a maior sequência comum tem três linhas, por exemplo A, B, D, então C aparece como movida: removida em um lugar e adicionada em outro.
Muitas vezes há várias respostas igualmente longas, e cada ferramenta escolhe de um jeito. Por isso o mesmo par de arquivos pode gerar diffs um pouco diferentes em dois programas. O Git usa por padrão o algoritmo de Myers e oferece patience e histogram como alternativas, que costumam dar resultados mais legíveis em código com muitas linhas que contêm apenas uma chave de fechamento.
Encontrar a maior sequência comum exige um trabalho que cresce com o número de linhas de um texto multiplicado pelo do outro. A ferramenta da LeedyBox primeiro separa as linhas idênticas do início e do fim, compara o restante e para com uma mensagem quando esse produto passa de 4.000.000, por exemplo cerca de 2.000 contra 2.000 linhas diferentes.
Ler diffs unificados do Git e de revisões de código
O controle de versão mostra apenas as partes alteradas de um arquivo, no formato de diff unificado:
--- a/config.yml
+++ b/config.yml
@@ -12,4 +12,5 @@
server:
- port: 8080
+ port: 8081
+ timeout: 30
database:
As linhas --- e +++ indicam o arquivo antigo e o novo. O cabeçalho do bloco @@ -12,4 +12,5 @@ significa: este bloco começa na linha 12 e ocupa 4 linhas no arquivo antigo, e começa na linha 12 e ocupa 5 linhas no novo. Algumas linhas inalteradas em volta de cada mudança, três por padrão, dão o contexto. Uma ferramenta que mostra o texto inteiro, como a da LeedyBox, não tem cabeçalhos de bloco porque todas as linhas estão visíveis; por isso a saída dela não pode ser aplicada como patch.
Preparar os textos para uma comparação útil
Um diff compara caracteres, não significado. Pequenas diferenças invisíveis tornam as linhas diferentes e podem esconder as mudanças reais:
- Espaços e tabulações no fim das linhas, ou tabulações em uma versão e espaços na outra. Remova os espaços finais e use o mesmo recuo nas duas.
- Caracteres invisíveis como um espaço não separável ou um espaço de largura zero, comuns em texto copiado de páginas web e processadores de texto.
- Formas Unicode. Uma letra acentuada como é pode ser guardada como um caractere ou como e mais um acento combinante. Texto de nomes de arquivo do macOS ou de alguns PDFs costuma usar a segunda forma.
- Aspas curvas e travessões. Processadores de texto trocam " por “ ” e - por –, então uma cópia colada não bate mais com o original em texto simples.
- Finais de linha. O Windows termina as linhas com CR LF, e o macOS e o Linux com LF. Os navegadores transformam toda quebra de linha de uma caixa de texto em LF, então essa diferença não aparece na ferramenta da LeedyBox, mas aparece em ferramentas que comparam arquivos diretamente.
- Formatação de dados e código. JSON reindentado ou chaves em outra ordem fazem quase todas as linhas diferirem. Formate as duas versões do mesmo jeito antes, por exemplo com as chaves ordenadas e o mesmo recuo.
Comparar textos corridos
Em documentos comuns, um parágrafo inteiro costuma ser uma única linha longa, então uma só palavra editada marca o parágrafo todo como removido e adicionado. Dois hábitos ajudam. Antes de comparar, coloque cada frase em sua própria linha, para que só a frase alterada se destaque. Ou use uma ferramenta que compare palavras dentro das linhas, como git diff --word-diff ou a comparação com controle de alterações dos processadores de texto.
Texto copiado de um PDF tem sua própria armadilha: as linhas quebram onde o layout da página as quebrou, e palavras podem aparecer hifenizadas no fim da linha. Junte de novo as linhas de cada parágrafo antes de compará-lo com um documento de origem.
O que um diff por linhas não consegue dizer
- Movimentos. Um parágrafo movido para outro lugar aparece como removido em um ponto e adicionado em outro. Algumas ferramentas, como o git com
--color-moved, marcam blocos movidos à parte. - Significado. Dois textos que dizem a mesma coisa com outras palavras diferem por completo, e uma mudança de um único caractere, como um “not” que falta, parece pequena mas pode inverter uma frase.
- Conteúdo binário. Documentos do Word, PDFs e imagens não são texto simples. Extraia o texto primeiro ou use o recurso de comparação do programa que os criou.
Privacidade ao comparar documentos
Contratos, arquivos de configuração e logs costumam conter nomes, chaves ou senhas. Alguns serviços de comparação on-line salvam o texto colado nos seus servidores, às vezes com um link compartilhável. O Comparar textos da LeedyBox roda no seu navegador e não envia nem guarda o texto, mas ainda vale a pena remover segredos antes de colar um arquivo de configuração em qualquer lugar.
Perguntas frequentes
Por que um parágrafo inteiro aparece como alterado se editei só uma palavra?
O parágrafo é uma única linha, e diffs por linhas comparam linhas inteiras. Divida o texto em frases ou linhas mais curtas antes de comparar, ou use uma comparação por palavras.
Posso ignorar diferenças de espaços?
A ferramenta da LeedyBox compara as linhas exatamente. Limpe os dois textos antes, por exemplo removendo espaços finais e convertendo tabulações em espaços; para arquivos, o git oferece opções como --ignore-space-change.
Como comparo dois documentos do Word?
O Word tem um recurso Comparar embutido que também mostra mudanças de formatação. Para comparar só o texto, copie o conteúdo dos dois documentos para uma ferramenta de comparação de texto.
O que é uma mesclagem de três vias (three-way merge)?
Quando duas pessoas editam o mesmo original, uma ferramenta de mesclagem compara cada versão com o original comum. Mudanças em lugares diferentes são combinadas automaticamente; mudanças nas mesmas linhas são apontadas como conflitos que uma pessoa precisa resolver.