🌐 Idioma: 🇧🇷 Português

Diff de Texto Online 2026

Compare dois textos linha a linha. Destaca linhas adicionadas, removidas e inalteradas — como o git diff.

Texto A (original)
Texto B (modificado)
Resultado do Diff
Cole os textos acima e clique em Comparar

🔀 O que é Diff?

Diff (abreviação de difference) é o processo de comparar duas versões de um texto e identificar exatamente o que mudou entre elas — quais linhas foram adicionadas, quais foram removidas e quais permaneceram iguais. É uma das ferramentas mais fundamentais do desenvolvimento de software e da gestão de documentos.

O formato de saída padrão do diff usa convenções visuais simples: linhas com + foram adicionadas na versão nova, linhas com foram removidas da versão original, e linhas sem prefixo (ou com espaço) permaneceram iguais. Essa notação foi padronizada pelo utilitário Unix diff nos anos 1970 e é usada até hoje em Git, GitHub, code reviews e editores de código.

Formato Unified Diff
--- arquivo_original.txt
+++ arquivo_modificado.txt
@@ -1,5 +1,5 @@
 Linha que não mudou
-Linha que foi REMOVIDA
+Linha que foi ADICIONADA
 Outra linha igual
-Texto antigo aqui
+Texto novo aqui

🕰️ A História do Diff: de Unix ao Git

1974
diff nasce no Unix — Douglas McIlroy e Hunt-McIlroy
O utilitário diff é criado nos Bell Labs por Douglas McIlroy e implementado por James Hunt e McIlroy com base no algoritmo LCS (Longest Common Subsequence — Maior Subsequência Comum). Publicado no Unix V5, o diff torna-se imediatamente essencial para programadores que precisam rastrear mudanças em código-fonte. O paper original de Hunt e McIlroy ("An Algorithm for Differential File Comparison") continua sendo referência até hoje.
1984
GNU diff e patch — diff vira padrão universal
O projeto GNU reimplementa o diff como software livre, introduzindo o formato unified diff (diff -u) — o formato com ---, +++ e cabeçalhos @@ que usamos até hoje. O utilitário complementar patch permite aplicar um arquivo diff a qualquer sistema, tornando possível distribuir apenas as mudanças entre versões de software, não o arquivo completo.
1990s
CVS e Subversion — diff entra nos sistemas de controle de versão
Os primeiros sistemas de controle de versão amplamente usados (CVS em 1990, Subversion em 2000) integram o diff como operação central. Ao fazer um svn diff ou cvs diff, o programador vê exatamente o que mudou desde o último commit. O diff deixa de ser uma ferramenta de linha de comando isolada e vira o núcleo do fluxo de trabalho de desenvolvimento colaborativo.
2005
Git — Linus Torvalds reinventa o diff distribuído
Linus Torvalds cria o Git para gerenciar o kernel Linux após um conflito com o BitKeeper. O git diff torna-se a operação mais usada por desenvolvedores do mundo — mostrando diferenças entre commits, branches e arquivos. O Git introduz o conceito de diff de blobs (objetos binários), tornando possível rastrear mudanças em qualquer tipo de arquivo, não apenas texto.
2008
GitHub — diff visual e code review na web
O GitHub populariza o diff visual com destaque de cores em pull requests e code reviews. O que antes era uma saída de terminal monocromática torna-se uma interface intuitiva com linhas verdes (adicionadas) e vermelhas (removidas) que qualquer pessoa consegue entender. O "pull request diff" vira o centro do processo de revisão de código em praticamente toda empresa de tecnologia do mundo.
Hoje
Diff além do código — textos, JSONs, configs e planilhas
O conceito de diff expandiu para muito além do código-fonte: documentos legais, políticas de privacidade, arquivos de configuração, JSONs de API, contratos e até conteúdo de sites são comparados com ferramentas de diff. Ferramentas online como esta permitem que qualquer pessoa — não apenas desenvolvedores — use o poder do diff sem instalar nada.

⚙️ Como Funciona o Algoritmo de Diff

Por baixo de qualquer ferramenta de diff está um algoritmo que precisa responder: qual é a menor quantidade de mudanças necessária para transformar o texto A no texto B? Isso é chamado de edit distance (distância de edição) ou LCS problem.

📐

LCS — Longest Common Subsequence (Maior Subsequência Comum): O algoritmo clássico encontra a maior sequência de linhas que aparecem em ambos os textos na mesma ordem, sem precisar ser contíguas. Tudo que está no A mas não no LCS foi removido; tudo que está no B mas não no LCS foi adicionado. Complexidade: O(n×m) onde n e m são o número de linhas.

AlgoritmoUsado emComplexidadeCaracterística
Hunt-McIlroy (LCS) diff Unix original O(n·d) onde d=diferenças Clássico, ótimo para textos com poucas mudanças
Myers diff Git, GNU diff moderno O(n + d²) Mais rápido que LCS, produz diffs mais legíveis
Patience diff Git (opção), Bazaar O(n log n) Produz diffs mais intuitivos em refatorações pesadas
Histogram diff Git (padrão atual) O(n log n) Evolução do Patience, melhor para código com blocos repetidos
Levenshtein Diff de palavras/chars O(n·m) Opera caractere a caractere, não linha a linha

🛠️ Casos de Uso do Diff no Dia a Dia

💻
Code Review
Revisar pull requests no GitHub/GitLab. O diff mostra exatamente o que o colega mudou antes de aprovar o merge.
📄
Documentos Legais
Comparar versões de contratos, termos de uso e políticas. Identificar cláusulas alteradas sem reler o documento inteiro.
⚙️
Configurações
Comparar arquivos .env, nginx.conf, docker-compose antes e depois de uma mudança. Identificar a causa de um bug de configuração.
🗄️
SQL e Migrações
Comparar schemas de banco de dados entre ambientes (dev vs prod). Ver quais colunas ou índices existem em um mas não no outro.
📦
package.json / deps
Comparar package.json, requirements.txt ou Gemfile entre branches para identificar dependências adicionadas ou removidas.
✍️
Revisão de Textos
Comparar rascunho e versão final de um artigo, post ou relatório. Ver exatamente o que o editor alterou.

🐙 Git Diff na Prática: Comandos Essenciais

Bash — Git Diff
# Ver mudanças não staged (working tree vs index)
git diff

# Ver mudanças staged (index vs último commit)
git diff --staged

# Comparar dois commits específicos
git diff abc1234 def5678

# Comparar duas branches
git diff main..feature/minha-feature

# Diff de um arquivo específico
git diff HEAD~1 -- src/arquivo.js

# Diff com estatísticas (quantas linhas mudaram por arquivo)
git diff --stat

# Diff ignorando espaços em branco
git diff -w

# Diff usando algoritmo Patience (mais legível em refatorações)
git diff --diff-algorithm=patience

# Gerar arquivo .patch para enviar por email
git diff > minhas-mudancas.patch

# Aplicar um arquivo .patch
git apply minhas-mudancas.patch
Bash — diff Unix
# Diff básico entre dois arquivos
diff arquivo_a.txt arquivo_b.txt

# Formato unified (mais legível, padrão moderno)
diff -u arquivo_a.txt arquivo_b.txt

# Ignorar maiúsculas/minúsculas
diff -i arquivo_a.txt arquivo_b.txt

# Ignorar linhas em branco
diff -B arquivo_a.txt arquivo_b.txt

# Ignorar espaços extras
diff -b arquivo_a.txt arquivo_b.txt

# Diff de diretórios (recursivo)
diff -r pasta_antiga/ pasta_nova/

# Diff side-by-side (lado a lado)
diff -y arquivo_a.txt arquivo_b.txt

# Salvar o diff como patch
diff -u original.txt modificado.txt > mudancas.patch

💻 Diff em Linguagens de Programação

JavaScript / Node.js
// Usando a biblioteca 'diff' (npm install diff)
import * as Diff from 'diff';

const textoA = `linha 1\nlinha 2\nlinha 3`;
const textoB = `linha 1\nlinha dois modificada\nlinha 3\nlinha 4 nova`;

// Diff linha a linha
const resultado = Diff.diffLines(textoA, textoB);

resultado.forEach(parte => {
  const cor = parte.added ? '\x1b[32m'    // verde
            : parte.removed ? '\x1b[31m'  // vermelho
            : '\x1b[37m';                  // branco
  process.stdout.write(cor + parte.value + '\x1b[0m');
});

// Diff de palavras (word-level)
const diffPalavras = Diff.diffWords('hello world', 'hello novo mundo');

// Diff de caracteres
const diffChars = Diff.diffChars('abcdef', 'abXYef');
Python
# difflib — biblioteca nativa do Python
import difflib

textoA = """linha 1
linha 2
linha 3""".splitlines(keepends=True)

textoB = """linha 1
linha dois modificada
linha 3
linha 4 nova""".splitlines(keepends=True)

# Unified diff (formato git/patch)
diff = difflib.unified_diff(textoA, textoB,
                              fromfile='original.txt',
                              tofile='modificado.txt')
print(''.join(diff))

# HTML diff visual (abre no navegador)
differ = difflib.HtmlDiff()
html = differ.make_file(textoA, textoB)
with open('diff.html', 'w') as f:
    f.write(html)

# Similarity ratio entre dois textos (0.0 a 1.0)
ratio = difflib.SequenceMatcher(None, 'texto a', 'texto b').ratio()
print(f"Similaridade: {ratio:.1%}")

Perguntas Frequentes sobre Diff

A granularidade do diff determina a menor unidade de comparação:

  • Diff de linha: a unidade é a linha inteira. Se qualquer coisa muda numa linha, ela aparece como removida e adicionada. É o padrão do git diff.
  • Diff de palavra: compara palavra por palavra. Mostra exatamente qual palavra mudou dentro de uma linha. Mais útil para textos em prosa.
  • Diff de caractere: a unidade mais fina — mostra qual caractere específico mudou. Útil para encontrar erros de digitação, espaços invisíveis ou caracteres Unicode estranhos.

Para código, diff de linha é o padrão. Para revisar textos em linguagem natural, diff de palavra é mais informativo.

O cabeçalho @@ é chamado de hunk header e indica em que parte do arquivo está o bloco de mudanças:

  • -1,5 → no arquivo original, o bloco começa na linha 1 e tem 5 linhas de contexto
  • +1,6 → no arquivo modificado, o bloco começa na linha 1 e tem 6 linhas (uma a mais, porque uma linha foi adicionada)

O formato completo é @@ -L,S +L,S @@ onde L=linha inicial e S=quantidade de linhas no hunk.

JSON não está formatado de forma consistente entre fontes diferentes. Antes de comparar, normalize os dois JSONs:

  • Formate ambos com a mesma indentação: jq . arquivo.json no terminal
  • Ordene as chaves: jq --sort-keys . arquivo.json
  • Então compare os JSONs formatados com o diff

Para diff de JSONs diretamente: diff <(jq --sort-keys . a.json) <(jq --sort-keys . b.json). Isso elimina falsos positivos causados por ordenação diferente de chaves ou formatação inconsistente.

O diff padrão não funciona bem com binários (PDFs, imagens, executáveis). Alternativas:

  • Para verificar se são iguais: diff arquivo1.bin arquivo2.bin retorna exit code 0 se iguais, 1 se diferentes — útil em scripts
  • Para PDFs: extraia o texto com pdftotext e compare os textos resultantes
  • Para imagens: use ImageMagick: convert imagem1.png imagem2.png -metric AE -compare diff.png
  • Para Word/Excel: use ferramentas específicas como python-docx ou converta para formato de texto antes de comparar

São operações complementares no controle de versão:

  • Diff compara dois arquivos e mostra as diferenças — é uma operação de leitura/análise. Não altera nenhum arquivo.
  • Merge combina duas versões divergentes de um arquivo num único resultado — é uma operação de escrita. Quando as mesmas linhas foram modificadas nas duas versões, ocorre um merge conflict que precisa ser resolvido manualmente.

No Git, o fluxo típico é: git diff para ver o que mudou → git merge para incorporar as mudanças → resolver conflitos manualmente se houver → git diff --staged para verificar o resultado antes de commitar.

📌 Resumo para Referência Rápida

+

Linha com + → adicionada na versão nova (B). Cor verde.

Linha com − → removida da versão original (A). Cor vermelha.

⚙️

Algoritmo padrão: Myers diff (Git). Para refatorações grandes, use --diff-algorithm=patience para resultado mais legível.

🔍

Para JSON/configs: normalize o formato antes de comparar. jq --sort-keys . elimina falsos positivos por ordenação de chaves diferente.

⚠️

Espaços e maiúsculas: use as opções da ferramenta acima para ignorar diferenças de espaçamento e capitalização que não são mudanças semânticas relevantes.

Veja também