32blogby Studio Mitsu

delta: mejorar git diff con resaltado y vista lado a lado

delta es un visor de git diff escrito en Rust con resaltado de sintaxis, vista lado a lado y navegación n/N. Configúralo una vez en ~/.gitconfig.

by omitsu17 min read
Contenido

delta es un paginador escrito en Rust que reemplaza la salida de git diff añadiendo resaltado de sintaxis, vista lado a lado, números de línea y atajos n/N para saltar entre archivos. Lo instalas con tu gestor de paquetes (el paquete se llama git-delta, pero el binario es solo delta), añades cinco líneas a ~/.gitconfig y a partir de ese momento git diff, git show, git log -p y git blame se vuelven legibles. Sin alias, sin wrappers — Git mismo empieza a redirigir su salida a delta.

git diff viene de otra época. Te da verde para las líneas añadidas, rojo para las eliminadas, y nada más: ni colores de sintaxis, ni números de línea, ni vista lado a lado, ni forma de saltar entre archivos en un PR de 40 ficheros. Si alguna vez te has descubierto abriendo un diff en tu editor "para leerlo de verdad", ya conoces el problema. Los desarrolladores pasamos una parte sorprendente del día leyendo diffs, y la salida por defecto de Git sigue diseñada para terminales de 16 colores.

delta es la herramienta que cubre ese hueco y se ha convertido en estándar de facto en los repositorios de dotfiles modernos. Es un binario único en Rust que Git invoca como paginador, usa el mismo motor de resaltado que bat (la crate syntect), y una vez configurado te olvidas de que existe. Este artículo recorre el bloque mínimo de cinco líneas, la receta completa con vista lado a lado y navegación, y los lugares más allá de git diff donde delta cambia tu flujo de trabajo.

Por qué delta: lo que git diff nunca arreglará

git diff se diseñó cuando los terminales mostraban 16 colores y "visor de diffs" significaba less con paleta ANSI verde y roja. Hace su único trabajo — mostrar lo que cambió — pero se salta todo lo que haría que un diff fuera realmente agradable de leer.

delta corrige cinco cosas concretas que git diff nunca iba a resolver:

  1. Resaltado de sintaxis. git diff colorea las líneas + y - y nada más. delta procesa el contenido del archivo con la crate syntect (la misma que usa bat) y obtienes colores de palabras clave, cadenas y comentarios dentro de las líneas añadidas y eliminadas. Leer una refactorización de 200 líneas pasa de ser entrecerrar los ojos a hojear de verdad.
  2. Vista lado a lado. Las herramientas modernas de revisión de código usan side-by-side por defecto porque coincide con cómo el cerebro compara dos versiones de lo mismo. delta lleva esa misma disposición al terminal con una sola opción de configuración, incluyendo ajuste automático de líneas largas.
  3. Números de línea. git diff muestra cabeceras de hunk como @@ -42,7 +42,9 @@ y espera que cuentes a partir de ahí. delta pone los números antiguos y nuevos en dos columnas en cada línea, igual que cualquier herramienta de revisión.
  4. Navegación en diffs grandes. Pulsa n para saltar al siguiente archivo, N para volver atrás. Con git log -p también se detiene en los límites de cada commit. Esta función por sí sola es lo que hace que un PR grande sea revisable desde el terminal.
  5. Resaltado a nivel de palabra. Cuando una línea cambia por un solo carácter, git diff borra la línea entera y la vuelve a añadir. delta ejecuta una pasada de distancia de Levenshtein y resalta solo los caracteres que realmente cambiaron, así ves de un vistazo si es un cambio real o un retoque de espacios.

Instalar delta (y la trampa del paquete git-delta)

La instalación es un comando, con una peculiaridad de nombrado que confunde a todo el mundo la primera vez.

powershell
# winget (incluido en Windows 11)
winget install dandavison.delta

# Chocolatey
choco install delta

# Scoop
scoop install delta

En Windows, delta funciona en PowerShell, Windows Terminal y WSL. Las notas específicas de Windows (profundidad de color del terminal, particularidades de less.exe) están en Using Delta on Windows.

Verifica la versión tras instalar:

bash
delta --version
# delta 0.19.2 (o más reciente)

La página de instalación oficial lista todos los gestores incluidos FreeBSD, Nix y conda.

El ~/.gitconfig mínimo son cinco líneas

Solo necesitas cinco líneas. Este es el bloque exacto de la página oficial Get Started, y es lo que el 90% de los usuarios de delta usa en producción:

gitconfig
[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    navigate = true  # usa n y N para moverte entre secciones
    dark = true      # o `light = true`, o omítelo para autodetección

[merge]
    conflictStyle = zdiff3

Eso es todo. Tras guardar ~/.gitconfig, cada comando de Git que produzca diff empieza a pasar por delta automáticamente. El manual oficial confirma que afecta a:

  • git diff
  • git show
  • git log -p
  • git stash show -p
  • git reflog -p
  • git add -p

Qué hace cada línea:

  • core.pager = delta es la línea que hace que Git redirija la salida de diff a delta. Sin ella, nada más se activa.
  • interactive.diffFilter = delta --color-only colorea también los hunks de git add -p. El flag --color-only es importante: git add -p parsea el diff para saber qué stagear, así que delta solo puede colorear, no reescribir el formato.
  • delta.navigate = true activa las teclas n y N dentro de less. Es la función más útil en diffs grandes y no hay razón para dejarla desactivada.
  • delta.dark = true le dice a delta que elija colores para terminal oscuro. Si usas terminal claro, pon light = true. La autodetección (omitir ambos) funciona en la mayoría de terminales, pero si ejecutas delta dentro de lazygit, zellij o tmux, fíjalo explícitamente — el manual de elección de colores lo advierte.
  • merge.conflictStyle = zdiff3 no es estrictamente una opción de delta, pero delta sabe mostrar conflictos zdiff3 como dos diffs legibles desde la base de la fusión. Si alguna vez te has quedado mirando un bloque <<<<<<< HEAD intentando recordar qué lado es el tuyo, esta es la opción que hace los merges legibles.

Ejecuta git diff ahora en cualquier repositorio con cambios sin commitear. Verás cabeceras con resaltado de sintaxis, números de línea en dos columnas, y una salida coloreada limpia. Pulsa n para saltar al siguiente archivo. Esa es toda la experiencia base.

La receta completa: side-by-side, line-numbers y named features

El mínimo de cinco líneas cubre el 90% de los casos, pero si vas a pasar varias horas al día leyendo diffs, los próximos diez minutos de configuración se rentabilizan para siempre. Esta es la receta completa que uso en mi ~/.gitconfig:

gitconfig
[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    features = side-by-side line-numbers decorations
    navigate = true
    dark = true
    syntax-theme = OneHalfDark
    side-by-side = true
    line-numbers = true
    hyperlinks = true
    hyperlinks-file-link-format = "vscode://file/{path}:{line}"

[delta "decorations"]
    commit-decoration-style = bold yellow box ul
    file-style = bold yellow ul
    file-decoration-style = none
    hunk-header-decoration-style = yellow box

[delta "line-numbers"]
    line-numbers-left-format = "{nm:>4}┊"
    line-numbers-right-format = "{np:>4}│"
    line-numbers-left-style = blue
    line-numbers-right-style = blue

[merge]
    conflictStyle = zdiff3

Algunas cosas a destacar:

  • features = ... es una lista de grupos con nombre. Cada grupo es su propia sección [delta "name"]. Es la forma de delta de mantener una configuración larga legible: en vez de meter cada opción en [delta], las etiquetas con un nombre y las activas con features. Las reglas de herencia están en el manual de features.
  • syntax-theme = OneHalfDark elige un tema compatible con bat. delta empaqueta los mismos temas que bat (porque depende de la crate bat). Ejecuta delta --show-syntax-themes para verlos todos en tu propio terminal — cada tema se renderiza sobre un fragmento de código, así eliges visualmente.
  • side-by-side = true activa la vista de dos paneles. Las líneas largas se ajustan automáticamente, con marcadores de flecha indicando dónde se cortó. El manual de side-by-side cubre --wrap-max-lines y los demás flags si los valores por defecto te molestan.
  • hyperlinks = true convierte los hashes de commit y las rutas de archivo en hipervínculos clicables del terminal. La línea hyperlinks-file-link-format abre los archivos en VS Code al hacer clic. Cámbialo por cursor://..., idea://... o subl://... para tu editor. Los formatos soportados están en el manual de hyperlinks.
  • line-numbers-left/right-format controla los glifos de la columna de números. {nm} es el número de línea "minus" (antiguo), {np} el "plus" (nuevo). Los caracteres Unicode ( y ) son puramente cosméticos pero hacen que la columna se sienta como una herramienta de revisión.

Activar y desactivar side-by-side desde la línea de comandos

Side-by-side es genial para revisión de código, menos genial para arreglar una errata de una línea. delta tiene una variable de entorno DELTA_FEATURES que permite activar y desactivar features sin tocar la configuración:

bash
# Activa side-by-side temporalmente, encima de lo que ya hay en gitconfig
export DELTA_FEATURES=+side-by-side

# Vuelve a lo que dice gitconfig
export DELTA_FEATURES=+

El prefijo + significa añadir a las features existentes, no reemplazarlas. Es un patrón útil cuando quieres side-by-side solo para una sesión de git log -p. Está documentado en la página de features-named-groups-of-settings.

Temas, estilos y combinarlos con tu terminal

delta elige un tema automáticamente, pero lo segundo que todo usuario quiere hacer es cambiarlo. Hay dos capas que conviene distinguir: los temas de sintaxis (colores del código dentro de los hunks) y los estilos de delta (colores de +, -, columnas y decoraciones).

Temas de sintaxis (colores del código)

bash
# Muestra todos los temas disponibles renderizados sobre código
delta --show-syntax-themes

# Filtrar por fondo — útil antes de elegir
delta --show-syntax-themes | less -R

Los temas de sintaxis de delta se heredan de bat — son literalmente los mismos archivos .tmTheme. Opciones populares para terminal oscuro: OneHalfDark, Monokai Extended, Dracula, gruvbox-dark. Para terminal claro: GitHub, OneHalfLight, Solarized (light). Para traer tu propio tema, copia el .tmTheme a $(bat --config-dir)/themes/ y ejecuta bat cache --build.

Estilos de delta (lo que delta dibuja por su cuenta)

Los colores de +/-/columnas se controlan con --minus-style, --plus-style, --zero-style y unas docenas más. Las cadenas de estilo usan la misma sintaxis que la configuración de color de Git:

gitconfig
[delta]
    minus-style = syntax "#3f1f1f"
    plus-style = syntax "#1f3f1f"
    minus-emph-style = syntax bold "#7f1f1f"
    plus-emph-style = syntax bold "#1f7f1f"

La palabra clave syntax significa "usa el color del resaltador para el primer plano". Ese es el truco que permite a delta mantener el código legible incluso cuando la línea tiene un fondo coloreado — el primer plano sigue siendo el color que el tema de sintaxis habría usado, mientras que el fondo marca añadido/eliminado.

La lista completa de elementos estilizables está en delta --help bajo la sección STYLES. La misma referencia con ejemplos está en el manual de elección de colores.

Más allá de git diff: blame, grep, conflictos y stash

delta está conectado como paginador de Git, así que se ocupa de cualquier comando que produzca salida diff o blame. Aquí están los cuatro lugares donde pasa de "agradable" a "esto cambia cómo trabajas".

git blame con hipervínculos

bash
git blame src/handlers.rs

Con delta como paginador de blame (y hyperlinks = true en la configuración anterior), cada hash de commit en la salida de blame se convierte en un enlace clicable a la página del commit en GitHub, GitLab, SourceHut o Codeberg. Haz clic en un hash para abrir el PR en tu navegador. La página git-blame del manual explica cómo funciona la detección del host — delta lee la URL del remote y elige el formato correcto automáticamente.

Para forzar que blame use delta como paginador (no siempre lo es por defecto), añade:

gitconfig
[pager]
    blame = delta

Conflictos de fusión (zdiff3 + delta)

Esta es la función estrella para cualquiera que se haya peleado con un merge feo en una rama de larga duración. Configura merge.conflictStyle = zdiff3 y delta renderiza el conflicto como dos diffs — uno desde la base de la fusión a "ours", otro desde la base a "theirs":

bash
git merge feature-branch
# ocurre el conflicto
git diff

En vez de tres bloques de código separados por <<<<<<< y =======, ves los cambios reales que hizo cada lado. El manual de merge-conflicts muestra cómo se ve — una vez que lo has visto una vez, los marcadores de conflicto sin formato se sienten como leer hex dumps.

rg y git grep con resaltado

delta también procesa la salida de grep. Pasa ripgrep por delta y obtienes las mismas columnas con resaltado de sintaxis alrededor de cada coincidencia:

bash
# rg --json es el formato recomendado — es inequívoco
rg --json -C 2 'fn handle_' src/ | delta

El flag --json importa: la salida normal de rg y grep tiene ambigüedades de parseo que delta a veces resuelve mal. JSON la hace determinista. El manual de grep recomienda exactamente este patrón. Para una guía completa de ripgrep, revisa la guía completa de grep/ripgrep en esta misma serie.

git stash show -p y git reflog -p

Estas son las pequeñas victorias. Cualquier cosa que produzca diff se beneficia de delta automáticamente — git stash show -p se vuelve una experiencia de revisión real, y git reflog -p te deja recorrer tu propio historial sin entrecerrar los ojos. No hay nada que configurar; la línea core.pager = delta cubre todo.

FAQ

¿delta reemplaza git diff o es un wrapper?

Ni una cosa ni la otra, exactamente. delta es un paginador — Git sigue ejecutando git diff y produce el mismo texto de diff que siempre, luego pasa ese texto por delta para mostrarlo. Nada cambia en cómo Git calcula los diffs. Los scripts que llaman a git diff > file.diff siguen funcionando porque Git solo invoca un paginador cuando stdout es un TTY. Es la misma convención que usa git log.

¿Por qué delta no muestra colores cuando redirijo a un archivo?

La misma convención que bat, ls y grep — delta detecta automáticamente si stdout es un terminal real. Pásalo a tee, redirígelo a un fichero o captúralo en una variable, y delta cae a salida plana. Para forzar colores, pasa --color-only o ajusta los flags del paginador de Git. Para una captura permanente con colores (capturas de pantalla, PDFs), el tip de exportar a HTML/PDF del manual usa aha y ansifilter.

¿Cómo desactivo side-by-side temporalmente?

bash
git -c delta.side-by-side=false log -p

El flag -c sobrescribe cualquier opción de configuración para un único comando. Es la forma más limpia de hacer cambios puntuales sin editar el config. El manual de configuración muestra el mismo truco para delta.line-numbers=false.

delta vs diff-so-fancy vs diff-highlight — ¿cuál uso?

delta es el ganador moderno. diff-highlight es un script Perl incluido con Git que solo hace resaltado a nivel de palabra. diff-so-fancy es un wrapper bash sobre diff-highlight de 2016. delta es más nuevo (Rust, 2018+), más rápido y tiene todas las funciones de los dos anteriores más vista lado a lado, navegación, resaltado de sintaxis y renderizado de conflictos de fusión. delta incluso incluye modos de emulación — los flags --diff-highlight y --diff-so-fancy — si prefieres el aspecto antiguo.

¿Puedo usar delta fuera de Git, con Mercurial o Jujutsu?

Sí. delta acepta el formato unified diff estándar como entrada, así que cualquier cosa que produzca un unified diff puede pasarse por él. Para Jujutsu la configuración recomendada va en ~/.config/jj/config.toml:

toml
[ui]
pager = "delta"
diff-formatter = ":git"

Está documentado en el manual de configuración de delta bajo la sección de Jujutsu. Para Mercurial, pon pager = delta en hgrc y listo.

¿delta ralentiza git log -p en un repo enorme?

En la práctica, no. delta procesa la salida diff línea a línea y la pasa a less en streaming, así que la latencia que percibes es la misma que git log -p solo — Git es la parte lenta. En un historial de 10.000 commits con -p, delta añade unos pocos cientos de milisegundos en total, dominados por el resaltado de sintaxis en los primeros archivos visibles (less solo bufferiza lo que tú scrolleas). Si quieres saltarte el resaltado por velocidad pura, pon syntax-theme = none — eso desactiva el paso más caro.

¿Por qué delta peta tras actualizar bat?

La causa más común: ejecutaste bat cache --build con una versión de bat distinta a la que delta enlaza. delta empaqueta bat como crate de Rust, así que si tu caché local de bat tiene un formato diferente, delta peta con un error de memoria. La solución es instalar la misma versión de bat listada en el Cargo.toml de delta y reconstruir la caché. delta 0.19+ requiere bat 0.26 o superior.

Conclusión

Cinco líneas de ~/.gitconfig es todo lo que delta necesita para empezar a mejorar tu día. Añádelo a un entorno de desarrollo nuevo, ejecuta git diff una vez, y verás inmediatamente por qué esta herramienta moderna en Rust acaba en cada repositorio de dotfiles. La receta completa — side-by-side, navegación, hipervínculos, decoraciones personalizadas — es una mejora de diez minutos que se rentabiliza cada vez que abres un pull request desde el terminal.

El patrón más amplio al que pertenece delta es el stack moderno de shell: bat para archivos, ripgrep para búsquedas, delta para diffs, todos compartiendo temas y convenciones. Configúralos una vez, copia los configs en tu repositorio de dotfiles, y la experiencia te sigue a cada máquina nueva. Para la razón técnica de por qué estas herramientas Rust superan a las originales de GNU, lee Por qué las CLI de Rust son tan rápidas. Para el mapa más amplio de qué herramienta clásica cubre cada reemplazo Rust, consulta el mapa de herramientas CLI.