Compare archivos de código: líneas añadidas y eliminadas
Vea con exactitud qué cambió entre dos versiones de un archivo: reescribir return a + b en dos líneas nuevas muestra 2 añadidas, 1 eliminada y 3 sin cambios, con los números de línea antiguos y nuevos y la vista diff clásica. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Compare dos versiones de un archivo fuente y obtenga un informe determinista, línea por línea, de cada cambio. El resultado identifica todas las líneas añadidas, eliminadas y sin cambios, incluye los números de línea anteriores y nuevos cuando corresponden, y ofrece una vista unificada conocida para registros o pantallas de revisión. Funciona con cualquier lenguaje de programación basado en texto y no interpreta la sintaxis, ejecuta el código, consulta repositorios ni modifica las versiones. Por ello, resulta útil como componente pequeño y predecible para herramientas de desarrollo, sistemas educativos, controles de migración y flujos automatizados de revisión.
Proporcione las dos versiones del código
Cualquiera de las versiones puede estar vacía, lo que representa de forma natural un archivo recién creado o eliminado por completo, pero ambas no pueden estar vacías porque no habría nada significativo que comparar. Los finales de línea se normalizan antes de la comparación; así, un texto con CRLF de Windows y otro con LF de Unix pueden compararse sin marcar todas las líneas como modificadas.
La comparación es deliberadamente independiente del lenguaje: JavaScript, Python, Go, Rust, archivos de configuración, plantillas, SQL y otros textos orientados a líneas siguen las mismas reglas. Las líneas se comparan exactamente después de normalizar los saltos. Los espacios, tabulaciones, mayúsculas, signos y comentarios siguen siendo relevantes porque pueden alterar el comportamiento del programa.
Proporcione el texto completo, no un parche. El resultado nunca evalúa el código ni resuelve importaciones, por lo que puede comparar fragmentos no confiables como texto sin formato. Para mantener un uso predecible de recursos, cada versión admite hasta 2,000 líneas; divida los archivos generados excepcionalmente grandes antes de enviarlos.
Interprete los cambios estructurados y la vista unificada
La respuesta contiene un indicador identical, un resumen, una matriz estructurada de líneas y texto de estilo unificado. El resumen cuenta las líneas añadidas, eliminadas y sin cambios. Cada registro estructurado presenta un tipo y su texto exacto.
Los campos que no corresponden se omiten, lo que facilita el procesamiento posterior frente al uso de valores null. Una línea modificada se representa mediante una eliminación y una adición, de acuerdo con la semántica básica de las herramientas tradicionales de diferencias por línea. La salida abarca todo el archivo proporcionado, en vez de separar zonas distantes mediante varios bloques de contexto.
Así, la lectura resulta sencilla y la lista estructurada y la vista textual describen exactamente la misma secuencia.
Utilice una salida determinista en sus flujos de desarrollo
El algoritmo encuentra una subsecuencia común ordenada, lo que permite reconocer inserciones y eliminaciones aunque cambien los números de línea. Las líneas duplicadas se procesan por posición y orden, no como si el archivo fuera un conjunto. Cuando existen varias alineaciones válidas, la implementación aplica una regla de desempate estable; por tanto, las mismas entradas siempre generan la misma salida.
Use la matriz estructurada para construir una vista en paralelo, contar tipos de cambio, anotar números de línea o aplicar una política. Esta capacidad no realiza correspondencias conscientes de la sintaxis, detección de cambios de nombre, resaltado por tokens, resolución de conflictos de fusión ni acceso a repositorios. Esas tareas requieren analizadores del lenguaje o contexto del control de versiones.
Aquí, el modelo limitado a líneas ofrece un comportamiento transparente, sin dependencia de red y reproducible localmente con las mismas dos cadenas.
Qué puede hacer con ella
Cree una vista de revisión de código
Represente registros estructurados de líneas añadidas, eliminadas y sin cambios con los números anteriores y nuevos correctos.
Compruebe cambios en código generado
Compare la salida generada entre dos ejecuciones y guarde un registro determinista de estilo unificado en los logs de compilación.
Explique la revisión de un ejercicio
Muestre al alumnado qué líneas fuente se insertaron o eliminaron exactamente, sin ejecutar el código entregado.
Preguntas frecuentes
¿Cuánto cuesta una comparación?
La experiencia del navegador puede ejecutar localmente la misma lógica determinista.
¿Qué lenguajes de programación admite?
Admite cualquier lenguaje basado en texto porque la comparación se realiza por líneas y no depende de la sintaxis.
¿Se informan los cambios que solo afectan a espacios?
Sí. Los espacios y tabulaciones son significativos, por lo que una línea con cambios de espaciado se muestra como eliminada y añadida.
¿Puede estar vacía una de las versiones?
Sí. Una versión vacía representa un archivo nuevo o eliminado. Solo se devuelve un error cuando ambas versiones están vacías.
¿El resultado utiliza el formato de diff unificado?
Ofrece marcadores de archivo, una cabecera de intervalo y prefijos de línea conocidos, además de registros estructurados. Es una vista unificada del archivo completo, no varios bloques de contexto comprimidos.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"original_code": "function greet(name) {\n return `Hello, ${name}`;\n}\n",
"revised_code": "function greet(name = \"world\") {\n return `Hello, ${name}!`;\n}\n"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.diff_two_code_files",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Proporcione las dos versiones del código
Envíe el texto fuente anterior en original_code y el posterior en revised_code.
Interprete los cambios estructurados y la vista unificada
Los registros sin cambios incluyen old_line y new_line porque la línea aparece en ambas versiones. Los eliminados incluyen old_line y los añadidos incluyen new_line. El campo unified_diff comienza con los marcadores de los archivos original y revisado, seguido por una cabecera de intervalo y líneas con prefijo: un espacio indica que no hubo cambios, un signo menos señala una eliminación y un signo más indica una adición.
Utilice una salida determinista en sus flujos de desarrollo
Use unified_diff para escribir una entrada legible en un registro, adjuntar un artefacto compacto a una tarea o alimentar una herramienta que entienda los prefijos habituales.