O diff clássico trabalha com linhas inteiras. Se você muda uma palavra em um parágrafo, um diff de linha mostra a linha antiga inteira como removida e a linha nova inteira como adicionada, e deixa você localizar a diferença de fato a olho. Para código isso normalmente está bom. Para prosa, linhas longas de configuração, ou uma correção de um caractere, é frustrante.

Dando zoom

Um diff em nível de palavra primeiro alinha as linhas alteradas, depois as compara de novo na granularidade de palavras, destacando apenas as palavras que diferem. Um diff em nível de caractere vai ainda mais fino, marcando os caracteres exatos que mudaram. Ambos mantêm o texto inalterado da linha visível, então uma correção como mudar recieve para receive mostra apenas essas duas letras se movendo em vez de a frase inteira piscar.

Este é um segundo passo em cima do diff de linha, não um algoritmo diferente: a ferramenta decide quais linhas correspondem, depois compara o interior de cada par.

Quando usar qual

Diffs de linha são melhores para código-fonte, onde uma linha é uma unidade significativa e você se importa com quais linhas mudaram. Diffs em nível de palavra brilham para linguagem natural: documentação, artigos, traduções, onde as frases são longas e as edições, pequenas. Diffs em nível de caractere são a ferramenta para strings compactadas, hashes, URLs e valores de configuração de uma linha, onde a diferença pode ser um dígito.

Um hábito prático é ler o diff de linha primeiro para ver quais linhas mudaram, depois trocar para uma visão de palavra ou caractere em uma linha que mudou de um jeito que você não consegue ver de imediato. A visão mais fina responde "o que exatamente está diferente aqui" sem fazer você comparar duas strings longas à mão.

Granularidade mais fina é outra leitura, não uma leitura melhor

Diffs por palavra e por caractere são a ferramenta certa para prosa e para uma única linha editada, e enganam ativamente em código. Um diff por caractere de dois identificadores parecidos destaca as letras que eles compartilham, produzindo uma saída que puxa o olho para a coincidência em vez da substância.

A regra decorre do que está sendo comparado. Nível de linha para estrutura, de palavra para prosa, de caractere para um valor sob inspeção próxima — uma chave, um hash, uma string de versão, onde um único dígito trocado é a pergunta inteira.

Escolher a granularidade faz parte de formular a pergunta, e um diff confuso costuma ser um erro de granularidade, não uma mudança complicada.