# Diff de texto

> Compare dois blocos de texto e veja exatamente o que mudou, linha a linha, com destaque em nível de palavra nas linhas editadas. Opcionalmente, ignore espaços em branco ou maiúsculas e minúsculas. Tudo é calculado no seu navegador; seu texto nunca é enviado a lugar nenhum.

- Tool: https://ronutz.com/pt-BR/tools/diff
- Family: Texto e utilitários

---

## O que faz

Compare dois blocos de texto e veja exatamente o que mudou: uma visão linha a linha de adições e remoções, com destaque em nível de palavra dentro das linhas que foram editadas, para você identificar a mudança específica. Você pode, opcionalmente, ignorar espaços em branco ou maiúsculas e minúsculas. Tudo é calculado no seu navegador; seu texto nunca é enviado a lugar nenhum.

## Como um diff é calculado

Um bom diff não é uma comparação ingênua linha a linha; ele encontra o menor conjunto de mudanças que transforma o primeiro texto no segundo. A ferramenta faz isso calculando a **maior subsequência comum** (LCS, longest common subsequence) dos dois textos: a maior sequência de tokens que aparece, na mesma ordem, em ambos. Tudo o que está nessa subsequência comum permanece inalterado; tudo o que está no primeiro texto mas não na LCS é uma **remoção**, e tudo o que está no segundo texto mas não na LCS é uma **inserção**. Essa é a ideia no coração do clássico algoritmo de diff de Myers, e ela produz um script de edição mínimo, o menor número de adições e remoções que explica a diferença.

## Dois níveis: linhas e palavras

A mesma operação de LCS roda em duas granularidades. Para a visão principal, os tokens são linhas inteiras, o que dá a você a familiar lista de linhas adicionadas e removidas. Para uma linha que foi alterada, em vez de adicionada ou removida por completo, a ferramenta roda o diff novamente com palavras, espaços e pontuação como tokens, e destaca apenas as partes da linha que de fato diferem. Esse destaque em linha é o que transforma "esta linha mudou" em "esta palavra mudou".

## Determinismo

Quando dois scripts de edição diferentes são igualmente curtos, um diff precisa escolher um, e a ferramenta escolhe sempre da mesma forma (ela prefere uma remoção quando as duas direções são igualmente boas). Esse desempate fixo torna a saída determinística: as mesmas duas entradas sempre produzem o mesmo diff, sem depender de tempo ou de qualquer coisa externa.

## Como usar

Cole o texto original de um lado e o texto alterado do outro, e leia as diferenças linha a linha com os destaques de palavra em linha. Ative as opções de ignorar espaços em branco ou ignorar maiúsculas e minúsculas quando você se importa com o conteúdo, e não com a formatação.

## Standards and references

- [Myers (1986) - An O(ND) Difference Algorithm and Its Variations (Algorithmica 1:251-266)](http://www.xmailserver.org/diff2.pdf) - the LCS / shortest-edit-script algorithm behind diff
- [POSIX diff utility - The Open Group Base Specifications](https://pubs.opengroup.org/onlinepubs/009695399/utilities/diff.html) - the diff utility and its minimal change-list output

## Related reading

- [Como funciona o diff de texto](https://ronutz.com/pt-BR/learn/how-diff-works.md): Um diff encontra o menor conjunto de inserções e remoções que transforma um texto em outro. Por baixo está a maior subsequência comum: as linhas que as duas versões compartilham, na mesma ordem, formam a espinha dorsal inalterada, e todo o resto é uma adição ou uma remoção.
- [Como ler um diff](https://ronutz.com/pt-BR/learn/reading-a-diff.md): Como ler um diff linha a linha: linhas inalteradas, adicionadas e removidas, os marcadores de mais e menos, os números de linha dos dois lados, o destaque palavra a palavra e o que ignorar espaços e ignorar maiúsculas realmente mudam. Mais o que um diff não consegue dizer.
- [Diffs de três vias e conflitos de merge](https://ronutz.com/pt-BR/learn/diff-three-way-and-merge-conflicts.md): Um diff normal compara duas versões e não consegue dizer qual delas mudou. Um diff de três vias adiciona um ancestral comum, que é o que torna o merge automático possível e o que produz os marcadores de conflito <<<<<<< ======= >>>>>>>. Este artigo explica o terceiro insumo e como ler e resolver um conflito.
- [Diffs em nível de palavra e de caractere](https://ronutz.com/pt-BR/learn/diff-word-and-character-level.md): Um diff de linha marca a linha inteira como alterada mesmo quando um único caractere mudou. Diffs em nível de palavra e de caractere destacam exatamente a parte da linha que mudou, o que é muito mais fácil de ler para prosa, linhas longas e edições pequenas. Este artigo cobre a diferença e quando cada lente é a certa.
- [Edições mínimas: por que um diff pode parecer errado](https://ronutz.com/pt-BR/learn/diff-minimal-edits.md): Um diff mostra o menor conjunto de inserções e remoções que transforma um texto no outro. Como o menor conjunto não é único e o algoritmo precisa escolher, um diff pode alinhar linhas de formas contraintuitivas, culpando o bloco errado ou dividindo uma seção movida. Saber disso torna diffs estranhos legíveis.
