guide/read-unified-diff.md

Cómo leer un diff unificado (patch) — guía para la revisión de código

Leemos paso a paso, con ejemplos, las cabeceras --- +++ de git diff y de los archivos patch, los números de la cabecera de hunk @@, las líneas de contexto, la marca No newline at end of file y las cabeceras extendidas diff --git.

Última actualización: 2026-09-23

Los parches que circulan en revisiones de código, informes de incidencias o por correo suelen estar en formato diff unificado. git diff, diff -u y el «raw diff» de GitHub usan este formato. Al principio parece lleno de símbolos, pero las reglas son sencillas.

Aspecto general

diff --git a/greet.py b/greet.pyindex 3b18e51..a6f4c2d 100644--- a/greet.py+++ b/greet.py@@ -1,5 +1,6 @@ def greet(name):-    print("Hello " + name)+    message = f"Hello, {name}!"+    print(message)  def main():     greet("world")

De arriba abajo aparecen la cabecera extendida de git, la cabecera de archivo (---, +++) y los hunks (bloques que empiezan por @@). Un archivo puede tener varios hunks, y un parche puede incluir varios archivos.

Cabecera de archivo: --- y +++

Cabecera de hunk @@ -a,b +c,d @@

@@ -1,5 +1,6 @@ significa que se muestran «5 líneas del archivo anterior a partir de la línea 1 y 6 líneas del archivo nuevo a partir de la línea 1».

Si lo contamos, en el ejemplo anterior hay 4 líneas de contexto (las que empiezan por un espacio): def greet(name):, una línea en blanco, def main(): y greet("world"). Antes del cambio hay 4 de contexto más 1 línea -, es decir 5; después, 4 de contexto más 2 líneas +, es decir 6. Por eso la cabecera es -1,5 +1,6.

Los tres tipos de línea del cuerpo

Primer carácterSignificado
EspacioLínea de contexto, idéntica en ambos lados
-Línea que solo está antes del cambio (eliminada)
+Línea que solo está después del cambio (añadida)

Por defecto se muestran 3 líneas de contexto antes y después de cada cambio (se puede cambiar, por ejemplo con git diff -U5). Las líneas de contexto sirven para encontrar la posición correcta al aplicar el parche. Aunque los números de línea no coincidan del todo, si el contexto encaja patch desplaza la posición (offset) y lo aplica.

Una línea corregida aparece como una pareja: una línea - seguida de una línea +. El formato unificado no tiene un símbolo propio para «modificado», así que el truco es leer emparejando de arriba abajo el grupo de líneas - con el grupo de líneas +.

\ No newline at end of file

@@ -1,2 +1,2 @@ host=example.com-port=8080\ No newline at end of file+port=8080

Indica que la línea inmediatamente anterior es la última del archivo y no termina en un carácter de salto de línea. En el ejemplo, el contenido es el mismo y solo el archivo nuevo tiene el salto de línea final. Encontrarás más detalles en Caracteres de fin de línea y diferencias invisibles.

Cabeceras extendidas de git

Las líneas que siguen a diff --git a/ruta b/ruta son información adicional propia de git.

Trucos útiles para revisar

  1. Mirar primero la diferencia de líneas en la cabecera del hunk da una idea del tamaño del cambio. -10,7 +10,30 significa que se añadieron 23 líneas.
  2. Para filtrar los hunks en los que solo cambian espacios, usa git diff -w. Es especialmente útil en commits que mezclan cambios reales con arreglos de sangría (Opciones para ignorar espacios).
  3. Para ver qué cambió dentro de una línea, usa git diff --word-diff o pega el texto en una herramienta que resalte dentro de la línea, como este sitio.
  4. Antes de aplicar un parche, comprueba con git apply --check archivo.patch que se aplica limpiamente. Fuera de un repositorio git, usa patch -p1 --dry-run < archivo.patch.

Pruébalo en esta herramienta

La vista unificada del comparador de textos muestra, en el mismo orden que este formato, el grupo - seguido del grupo +, y resalta además las palabras cambiadas dentro de la línea. El botón patch de la barra de resultados copia el texto diff unificado estándar, y el botón de guardar que tiene al lado lo descarga como archivo diff.patch. Un patch generado con todas las opciones de ignorar desactivadas se puede aplicar al original con patch -p1 o git apply.

Ir al comparador de textos