Compare arquivos de código: linhas adicionadas e removidas
Veja exatamente o que mudou entre duas versões de um arquivo: reescrever return a + b em duas linhas novas mostra 2 adicionadas, 1 removida e 3 inalteradas, com os números de linha antigos e novos e a visão diff clássica. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Compare duas versões de um arquivo-fonte e receba um relatório determinístico, linha por linha, de cada alteração. O resultado identifica todas as linhas adicionadas, removidas e inalteradas, inclui os números de linha antigos e novos quando aplicáveis e fornece uma visão unificada familiar para logs ou telas de revisão. Funciona com qualquer linguagem de programação baseada em texto e não interpreta a sintaxe, executa o código, acessa repositórios nem modifica as versões. Isso o torna um componente pequeno e previsível para ferramentas de desenvolvimento, sistemas educacionais, verificações de migração e fluxos automatizados de revisão.
Forneça as duas versões do código
Qualquer versão pode estar vazia, representando naturalmente um arquivo recém-criado ou totalmente excluído, mas as duas não podem estar vazias porque não haveria conteúdo relevante para comparar. As terminações de linha são normalizadas antes da comparação; assim, um texto com CRLF do Windows e outro com LF do Unix podem ser comparados sem que todas as linhas sejam apontadas como alteradas. A comparação é intencionalmente independente de linguagem: JavaScript, Python, Go, Rust, arquivos de configuração, modelos, SQL e outros textos orientados a linhas seguem as mesmas regras.
As linhas são comparadas exatamente após a normalização das quebras. Espaços, tabulações, maiúsculas, pontuação e comentários continuam significativos, pois esses detalhes podem mudar o comportamento do programa. Forneça o texto completo em vez de um patch.
O resultado nunca avalia o código nem resolve importações; portanto, trechos não confiáveis podem ser comparados como texto simples. Para garantir uso previsível de recursos, cada versão aceita no máximo 2,000 linhas; divida arquivos gerados excepcionalmente grandes antes do envio.
Interprete as alterações estruturadas e a visão unificada
A resposta contém um indicador identical, um resumo, uma lista estruturada de linhas e um texto em estilo unificado. O resumo conta linhas adicionadas, removidas e inalteradas. Cada registro estruturado apresenta um tipo e o texto exato.
Campos não aplicáveis são omitidos, o que deixa o processamento posterior mais claro do que o uso de valores null. Uma linha modificada é representada por uma remoção e uma adição, seguindo a semântica central das ferramentas tradicionais de diff por linha. A saída cobre todo o arquivo fornecido, em vez de separar regiões distantes em vários blocos de contexto.
Essa escolha simplifica a leitura e garante que a lista estruturada e a visão textual descrevam exatamente a mesma sequência.
Use uma saída determinística em fluxos de desenvolvimento
O algoritmo encontra uma subsequência comum ordenada, permitindo reconhecer inserções e exclusões mesmo quando os números das linhas mudam. Linhas duplicadas são tratadas pela posição e pela ordem, não como se o arquivo fosse um conjunto. Quando existe mais de um alinhamento válido, a implementação aplica uma regra estável de desempate; assim, entradas idênticas sempre produzem a mesma saída.
Use a lista estruturada para montar uma visão lado a lado, contar tipos de alteração, anotar números de linha ou aplicar uma política. Esta capacidade não faz correspondência baseada em sintaxe, detecção de renomeações, destaque por token, resolução de conflitos de merge nem acesso a repositórios. Essas tarefas exigem parsers de linguagem ou contexto de controle de versão.
Aqui, o modelo restrito a linhas oferece comportamento transparente, nenhuma dependência de rede e um resultado reproduzível localmente com as mesmas duas strings.
Casos de uso
Crie uma visão de revisão de código
Exiba registros estruturados de linhas adicionadas, removidas e inalteradas com os números antigos e novos corretos.
Verifique alterações em código gerado
Compare a saída gerada entre duas execuções e armazene um registro determinístico em estilo unificado nos logs de build.
Explique a revisão de um exercício
Mostre aos estudantes exatamente quais linhas-fonte foram inseridas ou excluídas sem executar o código enviado.
Perguntas frequentes
Quanto custa uma comparação?
A experiência no navegador pode executar localmente a mesma lógica determinística.
Quais linguagens de programação são aceitas?
Qualquer linguagem baseada em texto é aceita porque a comparação ocorre por linhas e não depende da sintaxe.
Alterações apenas de espaços são informadas?
Sim. Espaços e tabulações são significativos; portanto, uma linha cujo espaçamento mudou aparece como removida e adicionada.
Uma das versões pode estar vazia?
Sim. Uma versão vazia representa um arquivo novo ou excluído. Um erro só é retornado quando as duas versões estão vazias.
O resultado usa o formato de diff unificado?
Ele fornece marcadores de arquivo, cabeçalho de intervalo e prefixos de linha conhecidos, além de registros estruturados. É uma visão unificada do arquivo inteiro, e não vários blocos de contexto compactados.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/dev2/diff-two-code-files \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original_code":"function greet(name) {\n return `Hello, ${name}`;\n}\n","revised_code":"function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"}'const res = await fetch("https://api.kit.forhosting.com/dev2/diff-two-code-files", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/diff-two-code-files",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/diff-two-code-files", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original_code":"function greet(name) {\\n return `Hello, ${name}`;\\n}\\n","revised_code":"function greet(name = \\"world\\") {\\n return `Hello, ${name}!`;\\n}\\n"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original_code":"function greet(name) {\n return `Hello, ${name}`;\n}\n","revised_code":"function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/diff-two-code-files", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.diff_two_code_files",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Forneça as duas versões do código
Envie o texto-fonte anterior em original_code e o posterior em revised_code.
Interprete as alterações estruturadas e a visão unificada
Registros inalterados incluem old_line e new_line, pois a linha existe nas duas versões. Registros removidos incluem old_line, enquanto os adicionados incluem new_line. O campo unified_diff começa com marcadores dos arquivos original e revisado, seguidos por um cabeçalho de intervalo e linhas prefixadas: espaço indica conteúdo inalterado, sinal de menos indica remoção e sinal de mais indica adição.
Use uma saída determinística em fluxos de desenvolvimento
Use unified_diff para criar uma entrada legível de log, anexar um artefato compacto a uma tarefa ou alimentar uma ferramenta que reconheça os prefixos usuais.