Ferramentas · No ar

Diff

Veja o que mudou, lado a lado.

Compare dois textos ou dois JSONs lado a lado, com realce por linha e por palavra, lista de campos alterados e patch no formato do git. Tudo no navegador.

Sobre o projeto

O que é o Diff

O Diff responde à pergunta mais antiga de quem mexe com texto: o que mudou entre estes dois? Você cola um texto de cada lado (ou arrasta um arquivo) e a comparação aparece sozinha, sem botão e sem espera: o que entrou fica em verde, o que saiu fica em vermelho, e dentro de cada linha a palavra que mudou ganha um realce mais forte.

Há dois modos. No modo Texto, dá para ver lado a lado ou em uma coluna só, ignorar espaços, maiúsculas e linhas em branco, e pular de diferença em diferença com as teclas N e P. No modo JSON, a ferramenta lê os dois lados de verdade: a ordem das chaves e a formatação deixam de contar, cada erro aparece com a linha e a coluna e uma dica do que costuma estar errado, e uma lista mostra exatamente quais campos mudaram, com o caminho de cada um (por exemplo, endereco.cep). Tocar num item leva até a linha.

O resultado vira um patch no formato do git diff, que dá para copiar ou baixar e aplicar com git apply. Tudo acontece no seu navegador: o que você cola não é enviado a nenhum servidor e não fica guardado, só as suas opções.

A tela inicial mostra números abertos: quantas comparações, linhas e diferenças a ferramenta já viu. São só contagens anônimas de ações (colar, abrir um arquivo, copiar o patch), nunca teclas digitadas e nunca o conteúdo, e nada é contado se o seu navegador pede "Não rastrear".

Recursos

O que o Diff faz

Lado a lado ou unificada

Duas colunas alinhadas, com números de linha e os sinais + e −, ou uma coluna só como no git. No celular a visão unificada entra sozinha.

Realce por palavra

Linhas que se parecem são emparelhadas e a palavra (ou só as letras) que mudou fica em destaque. O que não tem par vira inclusão ou remoção pura.

JSON de verdade

A ordem das chaves e a formatação não contam, 1.0 é igual a 1 e uma lista mostra cada campo adicionado, removido, alterado ou com o tipo trocado, com o caminho dele.

Erros com linha e coluna

JSON inválido não trava nada: o erro aparece marcado no quadro, em português, com a linha, a coluna e a dica do erro mais comum (vírgula sobrando, aspas simples, chave sem aspas).

Ignore o que não importa

Espaços no fim ou todos, maiúsculas, linhas em branco (que ficam fora da conta) e a diferença entre CRLF e LF. Tudo opcional e à vista, em uma linha de opções.

Pule de diferença em diferença

Os botões (ou as teclas N e P) levam ao próximo trecho que mudou, e os trechos iguais compridos ficam recolhidos, com o contexto que você escolher.

Arraste arquivos

Solte um arquivo de texto em cada quadro (até 2 MB por lado). O nome dele vai para o cabeçalho do patch.

Patch do git

Copie ou baixe o resultado em formato git diff. O formato é conferido com o git de verdade, e o patch aplicado ao original reproduz exatamente o outro texto.

O conteúdo não sai do navegador

Os textos não são enviados nem guardados: só as suas opções ficam salvas. A única coisa que vai ao servidor é um contador anônimo, e nada vai se o seu navegador pede "Não rastrear".

Números abertos

A tela inicial mostra quantas comparações, linhas e diferenças já passaram por aqui, em uma tabela que só aumenta. Conta ações (colar, abrir arquivo, copiar o patch), nunca teclas e nunca o conteúdo.

Tecnologias

Por dentro do Diff

Algoritmo de Myers em espaço linear

A comparação por linhas é o algoritmo clássico do diff, na versão que gasta memória proporcional ao tamanho do texto e não ao tamanho da mudança. O resultado é mínimo: o teste compara com uma programação dinâmica ingênua em milhares de casos aleatórios e exige a mesma quantidade de linhas em comum.

Atalhos que não mudam o resultado

O começo e o fim iguais saem antes, e as linhas que só existem de um lado são descartadas (não podem ser comuns a nada). Se uma comparação for cara demais, o pedaço que estourou o orçamento de passos vira "tudo trocado" e a tela avisa, em vez de travar a aba.

Realce por palavra e por letra

Dentro de uma linha trocada, o texto vira palavras, espaços e pontuação e ganha a sua própria comparação. Uma palavra trocada por outra parecida marca só as letras que mudaram; linhas sem quase nada em comum não recebem realce, porque a linha toda já é a mudança.

Linhas emparelhadas por semelhança

Dentro de um trecho trocado, uma programação dinâmica emparelha as linhas que compartilham pelo menos metade das palavras, para uma edição aparecer como "esta linha virou aquela" e não como uma remoção solta e uma inclusão solta.

Leitor de JSON próprio

Cada navegador escreve a mensagem de erro do JSON.parse de um jeito e nenhum dá a coluna sempre. O leitor próprio dá linha e coluna iguais em qualquer um, mensagens em português, números grandes sem perder dígitos e chaves como __proto__ sem risco (os objetos são Map).

Comparação por estrutura

O JSON lido vira uma árvore e é comparado por caminho: objetos pela chave (a ordem não conta), listas pela posição. O texto formatado ao lado serve para ver, e a lista de mudanças serve para achar, com um clique até a linha.

Patch conferido pelo git

O patch unificado leva os blocos e os números do formato do git, inclusive a linha "No newline at end of file". O teste aplica dezenas de patches com o git de verdade e confere que o arquivo vira exatamente o texto B; outros milhares são conferidos pelo aplicador do próprio projeto.

Desenho em páginas

Resultados grandes são desenhados 400 linhas por vez e completados conforme se rola, e os trechos iguais ficam recolhidos. O texto de quem usa entra só por textContent: nunca por innerHTML.

Módulos ES puros

O núcleo, o JSON, o patch e as opções não tocam em tela e rodam igual no navegador e no Node, onde são testados. Uma tela fina junta tudo, com sons e animações opcionais (os mesmos do SFX Forge) e respeito a menos movimento.

Contadores sem rastrear ninguém

Os números abertos vêm de um módulo compartilhado: contadores que só aumentam, numa tabela do SQLite com triggers que recusam diminuir. O navegador avisa com uma lista fechada de nomes e números inteiros, em lote, e o servidor recusa qualquer outro nome e limita os avisos por IP. Com "Não rastrear" ou o Global Privacy Control ligados, nada é enviado, e o teste de ponta a ponta confere que nenhum trecho do texto aparece em nenhum pedido.

FAQ

Perguntas frequentes

Meus textos são enviados a algum servidor?

Não. A comparação acontece no seu navegador e o que você cola nunca é enviado nem guardado: só as suas opções (modo, visão, o que ignorar) ficam salvas. A ferramenta apenas avisa o servidor, de forma anônima, que uma comparação aconteceu (o tipo, quantas linhas e quantas diferenças) para os números abertos da tela inicial. Nenhum trecho do texto vai junto, e com "Não rastrear" ou o Global Privacy Control ligados nem isso é enviado. O teste de ponta a ponta confere tudo isso.

O que exatamente é contado nos números abertos?

Só ações: colar um texto, abrir um arquivo, usar um exemplo, trocar os lados, mudar de modo, apertar Ctrl+Enter, copiar ou baixar o patch e trocar a visão. Digitar não conta. Os números são comparações, linhas comparadas (até 100 mil por comparação), diferenças encontradas, JSONs comparados, comparações idênticas e patches gerados. Nem o texto, nem o nome de arquivo, nem o IP ficam nessa tabela.

Como comparo dois JSONs?

Escolha o modo JSON e cole um de cada lado. A ordem das chaves e a formatação não contam. Embaixo aparecem os dois JSONs formatados lado a lado e a lista de campos que mudaram, cada um com o caminho. Se um dos lados não for um JSON válido, o quadro mostra o erro com a linha e a coluna.

A ordem das chaves e das listas importa?

A ordem das chaves de um objeto não importa por padrão (dá para ligar a ordem). A ordem dos itens de uma lista importa: a comparação é por posição, então inserir um item no começo desloca os seguintes.

Qual é o tamanho máximo?

2 MB por lado. A comparação foi testada com 20 mil linhas de cada lado. Se um texto for tão diferente e repetitivo que uma comparação mínima custaria demais, a tela avisa e mostra os trechos mais difíceis como trocados por inteiro.

Por que algumas linhas aparecem lado a lado e outras não?

Dentro de um trecho que mudou, as linhas que compartilham pelo menos metade das palavras ficam emparelhadas e mostram a palavra alterada. As demais aparecem como remoção (esquerda) ou inclusão (direita) sozinhas.

O que é o patch e como uso?

É o resultado no formato do git diff. Copie ou baixe, salve num arquivo e rode git apply nome-do-arquivo.patch na pasta onde está o texto original. O patch é sempre exato: ele não leva em conta as opções de ignorar espaços, maiúsculas ou linhas em branco.

"a" e "a" com uma quebra de linha no fim são diferentes?

Na tela não: a quebra de linha final não conta como diferença (a tela avisa quando é a única). No patch sim, como no git, com a linha "No newline at end of file".

Funciona no celular?

Funciona. Em telas estreitas a visão unificada entra sozinha, os botões ficam maiores e a navegação entre as diferenças flutua no canto enquanto o resultado está na tela.

Gostou do Diff? Dá para apoiar o trabalho:

Continue explorando

Veja também

Todos os projetos