Skip to content

Comparar dois textos — Diff

Compare dois textos na hora no seu navegador. Vista lado a lado, destaque palavra a palavra, exportação para diff unificado, opções para ignorar maiúsculas/espaços/linhas vazias. 100 % navegador — sem upload.

Sem rastreamento Roda no navegador Grátis
Toda a comparação roda localmente no seu navegador. Seu texto nunca sai deste dispositivo.
Opções a ignorar
Revisado para paridade com a saída de `diff -u`, correção do LCS intra-linha e acessibilidade (papéis ARIA, avisos de mudança para leitores de tela, manejo RTL/LTR). — Equipe de Ferramentas de Texto da Go-Tools · May 21, 2026

O que é diff de texto?

Diff de texto é uma comparação estruturada de dois documentos textuais que encontra o menor conjunto de inserções e remoções capaz de transformar um no outro. A saída torna a mudança visível: verde para linhas adicionadas, vermelho para removidas, em lado a lado ou no formato de patch unificado (o formato `---/+++/@@` usado por `git`, GitHub e pelo comando Unix `patch`).

Por dentro, todo diff moderno é um algoritmo de subsequência comum mais longa (LCS). O artigo de Eugene Myers de 1986 em O((N+M)D) é a implementação eficiente canônica; programação dinâmica clássica (usada aqui, com poda de prefixo/sufixo comum) é mais simples e funciona perfeitamente para entradas web típicas. Depois que as linhas alinham, pares vizinhos de remoção + adição passam por um segundo LCS no nível de token para que o renderizador destaque apenas as palavras que realmente mudaram dentro de uma linha — o que revisores chamam de diff intra-linha ou palavra a palavra.

Por que não comparar strings caractere por caractere? Porque edições raramente são planas: inserir uma linha no meio de um arquivo de 200 linhas desloca todas as linhas abaixo. Um `===` ingênuo classificaria as 199 linhas como diferentes. O LCS conta a verdade: uma linha adicionada, 199 inalteradas.

Esta ferramenta executa toda a comparação no seu navegador. Sem upload, sem arquivo temporário, sem log. Segura para código proprietário, contratos anotados, logs privados e qualquer coisa que você não se sentiria à vontade colando em um servidor de terceiros. Precisa comparar JSON? Use o JSON Diff estrutural para que ordem de chaves e espaços parem de ser ruído. Comparando duas configs em YAML ou CSV? Converta primeiro com YAML para JSON ou JSON para CSV e depois compare com a ferramenta certa para o formato.

// Two strings that look 'mostly the same' but a naïve check disagrees
const a = 'hello world';
const b = 'hello, world!';

// Character equality
a === b; // false — but only 3 characters actually changed.

// LCS-style diff (this tool, at line + word granularity)
// → 1 line modified, inline highlight: 'hello[, ]world[!]'
// → unified patch:
//   --- original
//   +++ modified
//   @@ -1 +1 @@
//   -hello world
//   +hello, world!

Funcionalidades principais

Lado a lado + Unificado

Alterne entre a visão visual de duas colunas (para revisão humana) e o formato canônico de patch unificado (para `git apply`, ferramentas de code review, relatórios de bug).

Destaque inline palavra a palavra

Quando duas linhas são pareadas como modificadas, só os tokens alterados ganham fundo colorido. Seu olho acha a edição na hora em vez de varrer 80 caracteres.

Ignorar maiúsculas / espaços / linhas vazias

Quatro chaves independentes: maiúsculas, todos os espaços, só espaços finais, linhas vazias. Replica `git diff -i -w -b` em dois cliques.

Exportação em diff unificado

Copie um patch `---/+++/@@` limpo com três linhas de contexto. Cai direto num comentário de PR, num relatório de bug ou em `patch -p1`.

100 % no navegador

As entradas nunca saem do seu dispositivo. Sem upload, sem analytics sobre o texto. Funciona offline assim que a página carrega. Segura para código proprietário e prosa confidencial.

Unicode + RTL

Tokeniza nos limites de palavra do Unicode. Árabe, hebraico e CJK comparam limpos; variantes de fim de linha (CRLF, LF, CR) são todas normalizadas.

Exemplos

Code review — renomeação de uma variável

function getUser(id) {
  const u = db.users.find(x => x.id === id);
  return u;
}
function getUser(userId) {
  const u = db.users.find(x => x.id === userId);
  return u;
}

A visualização lado a lado destaca cada linha que contém a renomeação, enquanto o diff palavra a palavra esmaece os tokens inalterados para que o revisor veja exatamente qual identificador mudou.

Edição de contrato — uma cláusula adicionada

1. The service is provided as-is.
2. Either party may terminate with 30 days notice.
3. Disputes are resolved in California courts.
1. The service is provided as-is.
2. Either party may terminate with 30 days notice.
2a. Termination notice must be in writing.
3. Disputes are resolved in California courts.

Uma única cláusula inserida (linha 2a) é a única diferença. As linhas de contexto ao redor permanecem limpas — útil para revisar contratos ou documentos de política em modo controle de alterações.

Investigação de logs — tempos de requisição alterados

GET /api/users 200 14ms
POST /api/orders 201 88ms
GET /api/orders/42 200 21ms
GET /api/users 200 14ms
POST /api/orders 201 4200ms
GET /api/orders/42 500 21ms

Duas linhas mudam. O destaque inline mostra o desvio de latência 88ms → 4200ms e o código de status 200 → 500. Linha do tempo de incidente pronta para usar.

Espaços no fim da linha — opção 'Ignorar espaços finais'

  margin: 0;  
  padding: 0;
  border: none;
  margin: 0;
  padding: 0;
  border: none;

Sem a opção, a linha 1 reporta uma diferença (espaços finais). Ative 'Ignorar espaços / tabs finais' e o diff cai para zero — o mesmo truque que `git diff -b` faz.

Como usar

  1. 1

    Cole as duas versões

    Texto original à esquerda, modificado à direita. O diff ao vivo renderiza enquanto você digita; entradas grandes (>200 KB combinados) trocam para um botão Diff manual.

  2. 2

    Ligue as opções de ignorar que precisar

    Ignorar maiúsculas, ignorar todos os espaços, ignorar espaços finais ou ignorar linhas vazias — cada uma independente e persistida entre visitas.

  3. 3

    Leia o diff ou pegue o patch

    Lado a lado para revisão humana, Unificado para o formato `---/+++/@@`. 'Copiar diff unificado' manda um patch limpo para o clipboard para code review ou `patch -p1`.

Armadilhas comuns do diff

Arquivo inteiro 'mudou' depois de uma cópia entre Windows e Unix

Se você colar do Notepad do Windows num original editado no Unix, cada linha vai mostrar diferenças por causa do \r. Ligue 'Ignorar espaços / tabs finais' para silenciar os caracteres CR.

✗ Incorreto
Diff: 200 modifications (all because of trailing \r)
✓ Correto
Ignore trailing spaces / tabs → 2 real changes

Diff de indentação gritando

Reformatar tabs ↔ espaços explode os diffs linha por linha. 'Ignorar todos os espaços' colapsa o diff para as mudanças semânticas reais.

✗ Incorreto
Diff: 87 modifications (all are indent changes)
✓ Correto
Ignore all whitespace → 4 actual changes

Parágrafos idênticos marcados por causa de uma linha em branco

Adicionar ou remover uma única linha vazia em prosa pode desalinhar uma região inteira. 'Ignorar linhas vazias' resolve sem mexer no conteúdo.

✗ Incorreto
Diff: paragraph 2 'completely changed' (one blank line moved)
✓ Correto
Ignore blank lines → no changes in paragraph 2

Diff diz 'idêntico' mas os arquivos são diferentes

Quase sempre é uma opção de Ignorar (maiúsculas ou espaço) que ficou ligada de uma sessão anterior. Abra o painel 'Opções a ignorar' — todas as chaves ficam lá. Desligue todas se quiser comparação byte-strict.

✗ Incorreto
0 differences shown, but `cmp` says the files differ
✓ Correto
Disable all Ignore options → real diff appears

JSON colado parecendo 'tudo mudou'

O diff de texto trata a ordem das chaves como significativa; JSON não. Para payloads JSON, use a ferramenta dedicada JSON Diff — ela ignora a ordem das chaves e respeita a estrictidão de tipos.

✗ Incorreto
Text diff on JSON: 100% of lines changed (just a key reorder)
✓ Correto
<a href="/pt/tools/json-diff">JSON Diff</a>: 0 differences

Aviso de diff truncado ignorado

Acima de 5.000 linhas por lado a entrada é cortada. Se o aviso aparecer, troque para a linha de comando `diff -u file1 file2` ou `git diff --no-index` — ambos fazem streaming e lidam com gigabytes.

✗ Incorreto
Pasted a 20,000-line log — only first 5,000 lines diffed
✓ Correto
`diff -u a.log b.log` in terminal handles full file

Casos de uso comuns

Trecho de code review
Solte duas versões de uma função nos quadros para ver de relance uma renomeação, um ramo removido ou uma nova cláusula de guarda. O destaque palavra a palavra é mais rápido do que varrer o diff do GitHub atrás de uma mudança de uma linha.
Redline de contrato / política
Cole o contrato de ontem contra a revisão de hoje. Cláusulas inseridas saltam aos olhos; parágrafos inalterados colapsam para cinza. Exporte o patch unificado para a trilha de revisão jurídica.
Investigação de timeline de logs
Compare a fatia de logs pré-incidente do SRE contra a fatia durante o incidente. Latência, código de status e desvio de frequência afloram imediatamente sem `awk`.
Revisão de prosa / rascunho
Cole um rascunho e a versão do seu editor. O diff palavra a palavra mostra exatamente quais frases foram reescritas — valioso para aceitar ou recusar mudanças uma a uma.
Revisão de tradução
Comparar uma tradução antiga contra uma re-tradução para confirmar que a nova cópia preserva sentido, estrutura e placeholders. Ative 'Ignorar espaços finais' para silenciar o ruído que tradutores costumam introduzir.
Auditoria de .env / config
Comparar dois `.env`, `docker-compose.yaml` ou rc files de shell. Com 'Ignorar linhas vazias' ligada, o diff foca nas diferenças funcionais em vez do ruído de formatação.

Detalhes técnicos

LCS com poda de prefixo/sufixo
Linhas comuns no início e no fim são removidas antes de rodar a LCS por programação dinâmica. Um diff de 'duas configs de 2.000 linhas com uma linha alterada' colapsa para uma tabela DP de 1×1 e renderiza em menos de um milissegundo.
Diff intra-linha no nível de token
Hunks vizinhos de remoção + adição são pareados e tokenizados via sequências Unicode de palavra/não-palavra/espaço. Uma segunda passagem de LCS gera os trechos verdes/vermelhos que tornam as linhas modificadas legíveis.
Diff unificado compatível com git/patch
A saída segue o formato `---/+++/@@ -L,C +L,C @@` definido para o GNU patch e usado por Git, GitHub e por toda ferramenta de code review. Aplique com `pbpaste | patch -p0`.
Limite de entrada de 5.000 linhas por lado
Acima do limite, o diff trunca e avisa. Para entradas de múltiplos MB use `diff -u` na linha de comando ou `git diff --no-index` — fazem streaming e lidam com gigabytes.

Boas práticas

Escolha as opções de ignorar antes de ler
Ruído de espaços finais, CRLF e maiúsculas afoga o sinal. Ative as opções certas primeiro; o diff fica bem mais fácil de ler e você para de se treinar a pular mudanças 'falsas'.
Unificado para compartilhar, Lado a lado para revisar
Colunas visuais são para os seus olhos. Patches unificados são para os terminais dos outros. Um diff unificado copiado se encaixa numa mensagem do Slack, num comentário do Jira ou em `patch -p1` sem tradução.
Cheque com o % de similaridade
Se dois arquivos são 'quase iguais' mas a similaridade marca 30 %, você tem problema de fim de linha ou de espaço. Ative 'Ignorar todos os espaços' e reveja antes de ler o diff.

Perguntas frequentes

O texto que eu colo é enviado para o seu servidor?
Não. Cada comparação roda em JavaScript dentro do seu navegador. Seu texto não é carregado, registrado, salvo em disco nem enviado a terceiros. Apenas suas preferências de interface (modo de visualização e opções 'Ignorar') ficam salvas no localStorage para a página lembrar na próxima visita — nunca o texto. Você pode confirmar abrindo o DevTools → Rede: zero requisições disparam quando você clica em Diff.
Qual a diferença entre diff de texto e diff de JSON?
O diff de texto compara linha por linha — ideal para prosa, código, logs, contratos e arquivos de configuração. O JSON Diff entende o modelo de dados do JSON: a ordem das chaves é irrelevante, tipos são estritos e arrays podem ser pareados por chave. Se você colar JSON num diff de texto, reordenações de chaves e diferenças de espaços serão marcadas como mudanças; o JSON Diff ignora isso. Use o diff de texto para conteúdo não estruturado e o JSON Diff para respostas de API e payloads de configuração.
Como ignoro espaços, maiúsculas ou linhas vazias?
Clique no painel 'Opções a ignorar' acima do diff. 'Ignorar maiúsculas' deixa A e a equivalentes. 'Ignorar todos os espaços' colapsa cada espaço, tab e quebra de linha antes de comparar. 'Ignorar espaços / tabs finais' só remove o espaço no final da linha — comportamento padrão do `git diff -b`. 'Ignorar linhas vazias' descarta linhas vazias ou só com espaços antes do diff. Cada opção é independente e persiste entre visitas.
O que é um diff unificado (e quando copiá-lo)?
Um diff unificado é o formato de texto `---/+++/@@` usado por `patch`, `git apply`, PRs no GitHub e pela maioria das ferramentas de revisão de código. Clique em 'Copiar diff unificado' para obter um patch com três linhas de contexto ao redor de cada mudança — cole em um relatório de bug, num comentário de revisão ou num comando `patch -p1` e ele aplica limpo. Lado a lado é para humanos; diff unificado é para máquinas (e para revisores que pensam como máquinas).
Por que o diff mostra linhas inteiras alteradas se eu só editei uma palavra?
Não mostra — olhe de perto. A linha inteira é destacada porque algo nela mudou, mas dentro do destaque só os tokens alterados carregam o fundo vivo (verde para adicionado, vermelho riscado para removido). Esse é o diff intra-linha palavra a palavra: o contexto da linha continua legível enquanto seu olho pousa na edição exata. Se duas linhas consecutivas foram modificadas, ambas mostram destaque inline.
Como são tratados os finais de linha CRLF vs LF?
Ambos são reconhecidos. O diff divide em \r\n, \n e \r isolado, então CRLF do Windows, LF do Unix e CR do Mac antigo alinham corretamente. Se quiser sinalizar especificamente alterações de fim de linha, deixe 'Ignorar espaços / tabs finais' desligada — o \r vai aparecer como caractere final. Para apagar de vez o ruído de fim de linha, ligue 'Ignorar todos os espaços'.
Qual o tamanho máximo das duas entradas?
O diff roda na thread principal, então o limite prático é cerca de 5.000 linhas ou 1 MB por lado; acima disso truncamos e mostramos um aviso. O diff ao vivo desliga acima de 200 KB combinados e troca para um botão Diff manual. Para arquivos de múltiplos MB, use `diff -u` na linha de comando ou `git diff --no-index` — eles fazem streaming e lidam com gigabytes.
E para comparar código? A ferramenta conhece minha linguagem?
O diff é agnóstico de linguagem: ele enxerga linhas e tokens, não sintaxe. Isso é uma vantagem para trechos de revisão, edições de configuração e patches colados. Se você quer diff semântico de código (função renomeada entre arquivos, nível AST), use git, a visualização de PR do GitHub ou uma ferramenta dedicada de diff estrutural. Para 90 % das situações de revisão de código — olhar uma função, comparar dois trechos — diff linha + palavra é o que você precisa.
Por que uma edição única às vezes aparece como linha removida mais linha adicionada?
Quando uma linha mudou demais para o destaque palavra a palavra ser útil, o diff a reporta como linhas separadas de remoção + adição para manter a estrutura limpa. A mesma heurística entrega saída legível para reescritas de prosa e blocos de código reescritos em vez de editados. Mude para a visão Unificada para ver o clássico par `-`/`+` usado em patches.
Como é calculada a porcentagem de similaridade?
É o número de linhas inalteradas (depois das opções 'Ignorar') dividido pelo maior dos dois totais de linhas, limitado a 100 %. Duas entradas idênticas dão 100 %. Adicionar uma nova linha num arquivo de 100 linhas dá 99 %. Trocar todas as linhas dá 0 %. Útil para julgar rapidamente 'é uma edição pequena ou uma reescrita total' antes mesmo de ler o diff.
Posso compartilhar um diff com um colega?
Sim, de duas formas. (1) Clique em 'Copiar diff unificado' e cole o patch no chat, no Slack ou num comentário de PR — qualquer pessoa com um terminal pode fazer `patch < clip`. (2) Tire um screenshot do painel lado a lado para revisão visual. Não oferecemos um botão 'compartilhar por URL' de propósito: isso exigiria fazer upload do seu texto, e nós não fazemos isso.
O diff funciona com idiomas da direita para a esquerda como árabe ou hebraico?
Sim para o conteúdo textual — linhas e tokens reconhecem Unicode. A interface usa direções CSS lógicas, então em locales RTL a calha e as colunas de linhas invertem naturalmente. Dentro de uma célula do diff a direção do texto acompanha o conteúdo, então strings em árabe e hebraico renderizam corretamente enquanto os marcadores +/- continuam alinhados com a calha.

Ferramentas relacionadas

Ver todas as ferramentas →

Testador Regex Grátis — Depure e Combine Padrões Online

Processamento de Texto

Teste padrões de expressões regulares instantaneamente contra qualquer texto. Destaque ao vivo, grupos de captura, prévia de substituição, divisão e explicador. Regex JavaScript, 100% privado, sem cadastro, grátis e online.

Contador de Palavras e Caracteres Grátis

Processamento de Texto

Conte palavras, caracteres, frases, parágrafos e tempo de leitura instantaneamente. Contador em tempo real com verificação de limites do Twitter, meta description e Instagram. Grátis, privado, sem cadastro.

Conversor de Base Numérica — Binário, Hex, Decimal e Octal

Ferramentas de Conversão

Converta números entre binário, hexadecimal, decimal, octal e qualquer base personalizada (2-36) instantaneamente. Gratuito, privado, sem cadastro — todo o processamento acontece no seu navegador.

Decodificador e Codificador Base64

Codificação e Formatação

Decodifique e codifique Base64 online gratuitamente. Conversão em tempo real com suporte completo a UTF-8 e emoji. 100% privado — executa no seu navegador. Sem necessidade de cadastro.

Gerador Crontab e Construtor de Expressão Cron

Data e Hora

Crie, valide e decodifique expressões cron no navegador. Pré-visualização ao vivo da próxima execução em horário local ou UTC. Sintaxe POSIX de 5 campos, presets, descrição em linguagem clara. Grátis, privado, sem cadastro.

Conversor CSV para JSON

Codificação e Formatação

Converta CSV para JSON no navegador. RFC 4180, inferência de tipos, cabeçalho, seguro para inteiros grandes. 100% privado, sem upload.