stringtranslate.com

diferencia

En informática , la utilidad diff es una herramienta de comparación de datos que calcula y muestra las diferencias entre los contenidos de los archivos. A diferencia de las nociones de distancia de edición utilizadas para otros fines, diff está orientada a líneas en lugar de a caracteres, pero es como la distancia de Levenshtein en el sentido de que intenta determinar el conjunto más pequeño de eliminaciones e inserciones para crear un archivo a partir de otro. La utilidad muestra los cambios en uno de varios formatos estándar, de modo que tanto los humanos como las computadoras puedan analizar los cambios y usarlos para aplicar parches .

Por lo general, diff se utiliza para mostrar los cambios entre dos versiones del mismo archivo. Las implementaciones modernas también admiten archivos binarios . [1] La salida se denomina "diff" o " patch" , ya que la salida se puede aplicar con el programa de Unix patch . La salida de utilidades de comparación de archivos similares también se denomina "diff"; al igual que el uso de la palabra " grep " para describir el acto de búsqueda, la palabra diff se convirtió en un término genérico para calcular la diferencia de datos y los resultados de la misma. [2] El estándar POSIX especifica el comportamiento de las utilidades "diff" y "patch" y sus formatos de archivo. [3]

Historia

diff se desarrolló a principios de la década de 1970 en el sistema operativo Unix, que estaba surgiendo de los Laboratorios Bell en Murray Hill, Nueva Jersey. Fue parte de la quinta edición de Unix lanzada en 1974, [4] y fue escrita por Douglas McIlroy y James Hunt . Esta investigación se publicó en un artículo de 1976 coescrito con James W. Hunt, quien desarrolló un prototipo inicial de diff . [5] El algoritmo que se describe en este artículo se conoció como el algoritmo Hunt-Szymanski .

El trabajo de McIlroy fue precedido e influenciado por el programa de comparación de Steve Johnson en GECOS y el programa de prueba de Mike Lesk . Proof también se originó en Unix y, como diff , produjo cambios línea por línea e incluso usó corchetes angulares (">" y "<") para presentar inserciones y eliminaciones de líneas en la salida del programa. Sin embargo, las heurísticas utilizadas en estas primeras aplicaciones se consideraron poco confiables. La utilidad potencial de una herramienta diff provocó que McIlroy investigara y diseñara una herramienta más robusta que pudiera usarse en una variedad de tareas, pero que funcionara bien en las limitaciones de procesamiento y tamaño del hardware del PDP-11 . Su enfoque del problema fue el resultado de la colaboración con personas de Bell Labs, incluidos Alfred Aho , Elliot Pinson, Jeffrey Ullman y Harold S. Stone.

En el contexto de Unix, el uso del editor de línea ed proporcionó a diff la capacidad natural de crear "scripts de edición" utilizables por máquina. Estos scripts de edición, cuando se guardan en un archivo, pueden, junto con el archivo original, ser reconstituidos por ed en el archivo modificado en su totalidad. Esto redujo en gran medida el almacenamiento secundario necesario para mantener múltiples versiones de un archivo. McIlroy consideró escribir un postprocesador para diff donde se pudieran diseñar e implementar una variedad de formatos de salida, pero encontró que era más frugal y simple que diff fuera responsable de generar la sintaxis y la entrada de orden inverso aceptada por el comando ed .

En 1984, Larry Wall creó una utilidad independiente, patch , y publicó su código fuente en los grupos de noticias mod.sources y net.sources . [6] [7] [8] Este programa modifica archivos utilizando la salida de diff y tiene la capacidad de coincidir con el contexto.

La Guía de portabilidad X/Open número 2 de 1987 incluye diferencias. El modo de contexto se agregó en POSIX.1-2001 (número 6). El modo unificado se agregó en POSIX.1-2008 (número 7). [9]

En los primeros años de diff , los usos comunes incluían comparar cambios en el código fuente del software y el marcado de documentos técnicos, verificar la salida de depuración del programa, comparar listados del sistema de archivos y analizar el código ensamblador de la computadora. La salida destinada a ed estaba motivada para proporcionar compresión para una secuencia de modificaciones realizadas a un archivo. [ cita requerida ] El Sistema de control de código fuente (SCCS) y su capacidad para archivar revisiones surgieron a fines de la década de 1970 como consecuencia del almacenamiento de scripts de edición de diff .

Algoritmo

La operación de diff se basa en resolver el problema de la subsecuencia común más larga . [5]

En este problema, dadas dos secuencias de elementos:

a  b  c  d  f  g h j q z
a  b  c  d e f  g yo j krxy z

y queremos encontrar la secuencia más larga de elementos que esté presente en ambas secuencias originales en el mismo orden. Es decir, queremos encontrar una nueva secuencia que se pueda obtener a partir de la primera secuencia original eliminando algunos elementos, y a partir de la segunda secuencia original eliminando otros elementos. También queremos que esta secuencia sea lo más larga posible. En este caso es

abcdfgjz

A partir de una subsecuencia común más larga, solo es necesario un pequeño paso para obtener un resultado similar a diff : si un elemento está ausente en la subsecuencia pero está presente en la primera secuencia original, debe haber sido eliminado (como se indica con las marcas '-', a continuación). Si está ausente en la subsecuencia pero está presente en la segunda secuencia original, debe haber sido insertado (como se indica con las marcas '+').

ehiqkrxy+ - + - + + + +

Uso

El diffcomando se invoca desde la línea de comandos, pasándole los nombres de dos archivos: . La salida del comando representa los cambios necesarios para transformar el archivo original en el nuevo archivo.diff original new

Si original y new son directorios, se ejecutará diff en cada archivo que exista en ambos directorios. Una opción, , descenderá recursivamente por cualquier subdirectorio coincidente para comparar archivos entre directorios.-r

Cualquiera de los ejemplos del artículo utiliza los dos archivos siguientes, original y nuevo :

En este formato de salida tradicional,asignifica añadido ,dpara eliminados ydopara cambiar . Los números de línea del archivo original aparecen antesa/d/doy las del nuevo archivo aparecen después. Los signos menor que y mayor que (al comienzo de las líneas que se agregan, eliminan o modifican) indican en qué archivo aparecen las líneas. Las líneas de adición se agregan al archivo original para que aparezcan en el nuevo archivo. Las líneas de eliminación se eliminan del archivo original para que no aparezcan en el nuevo archivo.

De manera predeterminada, no se muestran las líneas comunes a ambos archivos. Las líneas que se han movido se muestran como agregadas en su nueva ubicación y como eliminadas de su ubicación anterior. [10] Sin embargo, algunas herramientas de comparación resaltan las líneas movidas.

Variaciones de salida

Editar guión

Las versiones modernas de diff aún pueden generar un script ed-e con la opción . El script edit resultante para este ejemplo es el siguiente:

24 aEste párrafo contiene novedades importantes que se suman a este documento..17 c consulte este documento..11,15 d
0 a ¡ Este es un aviso importante! Por lo tanto, debe ubicarse al comienzo de este documento..

Para transformar el contenido del archivo original en el contenido del archivo new usando ed , debemos agregar dos líneas a este archivo diff, una línea que contenga un comando (write) y otra que contenga un comando (quit) (por ejemplo, by ). Aquí le dimos al archivo diff el nombre mydiff y la transformación se realizará cuando ejecutemos .wqprintf "w\nq\n" >> mydiffed -s original < mydiff

Formato de contexto

La distribución Berkeley de Unix se encargó de agregar el formato de contexto ( -c) y la capacidad de recursar en estructuras de directorio del sistema de archivos ( -r), agregando esas características en 2.8 BSD, lanzado en julio de 1981. El formato de contexto de diff introducido en Berkeley ayudó a distribuir parches para el código fuente que puede haber sido modificado mínimamente.

En el formato de contexto, las líneas modificadas se muestran junto con las líneas que no han cambiado antes y después. La inclusión de cualquier número de líneas que no han cambiado proporciona un contexto al parche. El contexto consta de líneas que no han cambiado entre los dos archivos y sirve como referencia para localizar el lugar de las líneas en un archivo modificado y encontrar la ubicación prevista para que se aplique un cambio independientemente de si los números de línea siguen correspondiendo. El formato de contexto introduce una mayor legibilidad para los humanos y fiabilidad al aplicar el parche, y una salida que se acepta como entrada para el programa de parches . Este comportamiento inteligente no es posible con la salida diff tradicional.

El usuario puede definir la cantidad de líneas sin cambios que se muestran arriba y debajo de un fragmento de cambio , incluso cero, pero tres líneas es el valor predeterminado. Si el contexto de líneas sin cambios en un fragmento se superpone con un fragmento adyacente, diff evitará duplicar las líneas sin cambios y fusionará los fragmentos en uno solo.

Un " !" representa un cambio entre líneas que corresponden en los dos archivos, mientras que un " +" representa la adición de una línea y un " -" la eliminación de una línea. Un espacio en blanco representa una línea sin cambios. Al comienzo del parche se encuentra la información del archivo, incluida la ruta completa y una marca de tiempo delimitada por un carácter de tabulación. Al comienzo de cada fragmento se encuentran los números de línea que se aplican para el cambio correspondiente en los archivos. Un rango de números que aparece entre conjuntos de tres asteriscos se aplica al archivo original, mientras que los conjuntos de tres guiones se aplican al nuevo archivo. Los rangos de fragmentos especifican los números de línea inicial y final en el archivo respectivo.

El comando diff -c original newproduce el siguiente resultado:

*** /ruta/a/la/marca/de/tiempo original --- /ruta/a/la/nueva/marca/de/tiempo****************** 1,3 ****--- 1,9 ---- + ¡Este es un aviso + importante ! ¡Por lo tanto, debería + estar ubicado al + comienzo de este + documento! +  Esta parte del  documento se ha mantenido  igual de una versión a otra.****************** 8,20 **** comprimir el tamaño de los  cambios.- Este párrafo contiene - texto que no está actualizado. - Se eliminará en un futuro próximo. ¡Es importante la ortografía ! Revisa este documento. Por  otro lado, una  palabra mal escrita no es  el fin del mundo. --- 14,21 ----  comprime el tamaño de los  cambios. ¡Es importante saber escribir bien ! Revisa este documento. Por  otro lado, una  palabra mal escrita no es  el fin del mundo.****************** 22,24 ****--- 23,29 ----  Este párrafo necesita  ser modificado. Se pueden  agregar cosas después de él. + + Este párrafo contiene + nuevas incorporaciones importantes + a este documento.

Nota : Aquí, la salida de diff se muestra con colores para facilitar su lectura. La utilidad diff no produce una salida en color; su salida es texto sin formato . Sin embargo, muchas herramientas pueden mostrar la salida con colores mediante el resaltado de sintaxis .

Formato unificado

El formato unificado (o unidiff ) [11] [12] hereda las mejoras técnicas realizadas por el formato de contexto, pero produce una diferencia más pequeña con el texto antiguo y el nuevo presentados inmediatamente adyacentes. El formato unificado se invoca generalmente utilizando la opción de línea de comandos-u " " . Esta salida se utiliza a menudo como entrada para el programa de parches . Muchos proyectos solicitan específicamente que los "diffs" se envíen en el formato unificado, lo que hace que el formato de diferencia unificado sea el formato más común para el intercambio entre desarrolladores de software.

Los diffs de contexto unificados fueron desarrollados originalmente por Wayne Davison en agosto de 1990 (en unidiff , que apareció en el Volumen 14 de comp.sources.misc). Richard Stallman agregó soporte para diffs unificados a la utilidad diff del Proyecto GNU un mes después, y la característica debutó en GNU diff 1.15, publicada en enero de 1991. Desde entonces, GNU diff ha generalizado el formato de contexto para permitir el formato arbitrario de los diffs.

El formato comienza con el mismo encabezado de dos líneas que el formato de contexto, excepto que el archivo original está precedido por "---" y el nuevo archivo está precedido por "+++". A continuación se encuentran uno o más fragmentos de cambio que contienen las diferencias de línea en el archivo. Las líneas contextuales sin cambios están precedidas por un carácter de espacio, las líneas de adición están precedidas por un signo más y las líneas de eliminación están precedidas por un signo menos .

Un fragmento comienza con información de rango y va seguido inmediatamente de las adiciones y eliminaciones de líneas y cualquier cantidad de líneas contextuales. La información de rango está rodeada por dobles arrobas y combina en una sola línea lo que aparece en dos líneas en el formato de contexto (arriba). El formato de la línea de información de rango es el siguiente:

@@ -l,s +l,s @@ encabezado de sección opcional

La información del rango de fragmentos contiene dos rangos de fragmentos. El rango del fragmento del archivo original está precedido por un símbolo menos, y el rango del nuevo archivo está precedido por un símbolo más. Cada rango de fragmentos tiene el formato l,s , donde l es el número de línea inicial y s es el número de líneas al que se aplica el fragmento de cambio para cada archivo respectivo. En muchas versiones de GNU diff, cada rango puede omitir la coma y el valor final s , en cuyo caso s toma el valor predeterminado 1. Tenga en cuenta que el único valor realmente interesante es el número de línea l del primer rango; todos los demás valores se pueden calcular a partir de la diferencia.

El rango de fragmentos del original debe ser la suma de todas las líneas de fragmentos contextuales y eliminadas (incluidas las modificadas). El rango de fragmentos del nuevo archivo debe ser la suma de todas las líneas de fragmentos contextuales y agregadas (incluidas las modificadas). Si la información del tamaño del fragmento no se corresponde con la cantidad de líneas del fragmento, la diferencia podría considerarse inválida y rechazarse.

Opcionalmente, el rango de fragmentos puede ir seguido del encabezado de la sección o función de la que forma parte el fragmento. Esto es útil principalmente para que la diferencia sea más fácil de leer. Al crear una diferencia con GNU diff, el encabezado se identifica mediante la coincidencia de expresiones regulares . [13]

Si se modifica una línea, se representa como una eliminación y una adición. Dado que los fragmentos del archivo original y el nuevo aparecen en el mismo fragmento, dichos cambios aparecerían adyacentes entre sí. [14] Una ocurrencia de esto en el ejemplo siguiente es:

-Consulta este documento.+Consulta este documento.

El comando diff -u original newproduce el siguiente resultado:

--- /ruta/a/la/marca/de/tiempo/original +++ /ruta/a/la/nueva marca/de/tiempo @@ -1,3 +1,9 @@ +¡Este es un aviso importante! ¡Por lo tanto, debería estar ubicado al principio de este documento! +  Esta parte del  documento se ha mantenido  igual desde la versión hasta @@ -8,13 +14,8 @@  comprimir el tamaño de los  cambios.-Este párrafo contiene texto desactualizado. -Será eliminado en un futuro próximo. -Es  importante revisar la ortografía de este documento. +Revisar este documento. Por  otro lado, una  palabra mal escrita no es  el fin del mundo. @@ -22,3 +23,7 @@  Este párrafo necesita  ser cambiado. Se pueden  agregar cosas después de él. + +Este párrafo contiene +nuevas incorporaciones importantes +a este documento.

Nota : Aquí, la salida de diff se muestra con colores para facilitar su lectura. La utilidad diff no produce una salida en color; su salida es texto sin formato . Sin embargo, muchas herramientas pueden mostrar la salida con colores mediante el resaltado de sintaxis .

Tenga en cuenta que para separar correctamente los nombres de los archivos de las marcas de tiempo, el delimitador entre ellos es un carácter de tabulación. Esto es invisible en la pantalla y se puede perder cuando se copian y pegan las diferencias desde las pantallas de la consola o la terminal.

Extensiones

Existen algunas modificaciones y extensiones de los formatos diff que se utilizan y comprenden en determinados programas y en determinados contextos. Por ejemplo, algunos sistemas de control de versiones (como Subversion) especifican un número de versión, una "copia de trabajo" o cualquier otro comentario en lugar de una marca de tiempo o además de esta en la sección de encabezado del diff.

Algunas herramientas permiten fusionar las diferencias de varios archivos diferentes en uno solo, utilizando un encabezado para cada archivo modificado que puede verse así:

Índice: ruta/al/archivo.cpp

El caso especial de los archivos que no terminan en una nueva línea no se maneja. Ni la utilidad unidiff ni el estándar POSIX diff definen una forma de manejar este tipo de archivos. (De hecho, dichos archivos no son archivos de "texto" según las definiciones estrictas de POSIX. [15] ) GNU diff y git producen "\ No newline at end of file" (o una versión traducida) como diagnóstico, pero este comportamiento no es portable. [16] GNU patch no parece manejar este caso, mientras que git-apply sí. [17]

El programa patch no necesariamente reconoce la salida de diff específica de la implementación. Sin embargo, se sabe que GNU patch reconoce los parches de git y actúa de manera un poco diferente. [18]

Implementaciones y programas relacionados

Los cambios desde 1975 incluyen mejoras en el algoritmo central, la adición de características útiles al comando y el diseño de nuevos formatos de salida. El algoritmo básico se describe en los artículos An O(ND) Difference Algorithm and its Variations de Eugene W. Myers [19] y en A File Comparison Program de Webb Miller y Myers. [20] El algoritmo fue descubierto y descrito de forma independiente en Algorithms for Approximate String Matching , de Esko Ukkonen . [21] Las primeras ediciones del programa diff se diseñaron para comparaciones de líneas de archivos de texto esperando que el carácter de nueva línea delimitara las líneas. En la década de 1980, el soporte para archivos binarios resultó en un cambio en el diseño e implementación de la aplicación.

GNU diff y diff3 están incluidos en el paquete diffutils junto con otras utilidades relacionadas con diff y parches . [22]

Formateadores y front-ends

Los posprocesadores sdiff y diffmk generan listas de diferencias en paralelo y marcas de cambio aplicadas a documentos impresos, respectivamente. Ambos fueron desarrollados en otros laboratorios Bell en 1981 o antes. [ cita requerida ] [ discutir ]

Diff3 compara un archivo con otros dos archivos mediante la conciliación de dos diferencias. Fue concebido originalmente por Paul Jensen para conciliar los cambios realizados por dos personas que editaban una fuente común. También lo utilizan los sistemas de control de revisión, por ejemplo RCS , para fusionar archivos . [23]

Emacs utiliza Ediff para mostrar los cambios que proporcionaría un parche en una interfaz de usuario que combina edición interactiva y capacidades de fusión de archivos de parche.

Vim proporciona vimdiff para comparar de dos a ocho archivos, con las diferencias resaltadas en color. [24] Si bien históricamente invocaba el programa diff, el vim moderno usa la bifurcación de git del código de la biblioteca xdiff (LibXDiff), lo que proporciona una velocidad y una funcionalidad mejoradas. [25]

GNU Wdiff [26] es una interfaz para diff que muestra las palabras o frases que cambiaron en un documento de texto en lenguaje escrito incluso en presencia de ajuste de palabras o diferentes anchos de columna.

colordiff es un contenedor de Perl para 'diff' y produce la misma salida pero con coloración para los bits agregados y eliminados. [27] diff-so-fancy y diff-highlight son análogos más nuevos. [28] "delta" es una reescritura de Rust que resalta los cambios y el código subyacente al mismo tiempo. [29]

Patchutils contiene herramientas que combinan, reorganizan, comparan y corrigen diferencias de contexto y diferencias unificadas. [30]

Derivadas algorítmicas

Las utilidades que comparan archivos fuente por su estructura sintáctica se han creado principalmente como herramientas de investigación para algunos lenguajes de programación; [31] [32] [33] algunas están disponibles como herramientas comerciales. [34] [35] Además, las herramientas gratuitas que realizan comparaciones teniendo en cuenta la sintaxis incluyen:

spiff es una variante de diff que ignora las diferencias en los cálculos de punto flotante con errores de redondeo y espacios en blanco , ambos generalmente irrelevantes para la comparación de código fuente. Bellcore escribió la versión original. [41] [42] Un puerto HPUX es la versión pública más actual. spiff no admite archivos binarios. spiff genera la salida estándar en formato diff estándar y acepta entradas en los lenguajes de programación C , Bourne shell , Fortran , Modula-2 y Lisp . [43] [44] [41] [45] [42]

LibXDiff es una biblioteca LGPL que proporciona una interfaz para muchos algoritmos desde 1998. Originalmente se implementó un algoritmo Myers mejorado con huella dactilar de Rabin (a partir de la versión final de 2008), [46] pero desde entonces Git y la bifurcación de libgit2 han ampliado el repositorio con muchos de los suyos. Un algoritmo llamado "histograma" se considera generalmente mucho mejor que el algoritmo Myers original, tanto en velocidad como en calidad. [47] [48] Esta es la versión moderna de LibXDiff que utiliza Vim. [25]

Véase también

Otras herramientas gratuitas de comparación de archivos

Referencias

  1. ^ MacKenzie et al. "Archivos binarios y forzamiento de comparación de texto" en Comparación y fusión de archivos con GNU Diff y Patch . Descargado el 28 de abril de 2007. [1] Archivado el 19 de diciembre de 2017 en Wayback Machine.
  2. ^ Eric S. Raymond (ed.), "diff" Archivado el 31 de enero de 2014 en Wayback Machine , The Jargon File , versión 4.4.7
  3. ^ IEEE Computer Society ; The Open Group (26 de septiembre de 2008). Estándar para la tecnología de la información: Especificaciones básicas de la interfaz de sistema operativo portátil (POSIX), número 7. págs. 2599–2607.La norma IEEE 1003.1-2001 especifica los formatos de salida tradicionales, "ed script" y de diferencia de contexto; la norma IEEE 1003.1-2008 agregó el formato unificado (en ese entonces más común).
  4. ^ https://minnie.tuhs.org/cgi-bin/utree.pl?file=V5/usr/source/s1/diff1.c
  5. ^ ab James W. Hunt; M. Douglas McIlroy (junio de 1976). "Un algoritmo para la comparación diferencial de archivos" (PDF) . Computing Science Technical Report, Bell Laboratories . 41. Archivado (PDF) desde el original el 26 de diciembre de 2014. Consultado el 6 de mayo de 2015 .
  6. ^ Larry Wall (9 de noviembre de 1984). "Un aplicador de parches: ¡¡¡QUIERES ESTO!!!". Grupo de noticias : net.sources. Usenet:  [email protected]. Archivado desde el original el 19 de febrero de 2022. Consultado el 11 de mayo de 2015 .
  7. ^ Larry Wall (29 de noviembre de 1984). «versión de parche 1.2: LO QUIERES». Grupo de noticias : net.sources. Usenet:  [email protected]. Archivado desde el original el 21 de marzo de 2020. Consultado el 11 de mayo de 2015 .
  8. ^ Larry Wall (8 de mayo de 1985). «versión de parche 1.3». Grupo de noticias : net.sources. Usenet:  [email protected]. Archivado desde el original el 19 de febrero de 2022. Consultado el 11 de mayo de 2015 .
  9. ^ diff  – Referencia de shell y utilidades, La especificación única de UNIX , versión 4 de The Open Group
  10. ^ David MacKenzie; Paul Eggert; Richard Stallman (1997). Comparación y fusión de archivos con GNU Diff y Patch. Bristol: Teoría de redes. ISBN 978-0-9541617-5-0Archivado desde el original el 31-03-2015 . Consultado el 17-03-2015 .
  11. ^ "Descripción detallada del formato unificado". GNU Diffutils (versión 3.7, 7 de enero de 2018) . Archivado desde el original el 18 de enero de 2020. Consultado el 29 de enero de 2020 .
  12. ^ van Rossum, Guido. "Formato de diferencias unificado". All Things Pythonic . Archivado desde el original el 25 de diciembre de 2019. Consultado el 29 de enero de 2020 .
  13. ^ 2.2.3 Mostrar en qué secciones se encuentran las diferencias, manual de GNU diffutils
  14. ^ Formato de diferencias unificado por Guido van Rossum , 14 de junio de 2006
  15. ^ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403 Archivado el 29 de abril de 2013 en Wayback Machine Sección 3.206
  16. ^ "Líneas incompletas (comparación y fusión de archivos)". www.gnu.org .
  17. ^ "git: apply.c". Git. 8 de mayo de 2023.
  18. ^ "patch.c\src - patch.git - parche GNU". git.savannah.gnu.org . En las comparaciones de estilo git, el estado "antes" de cada parche se refiere al estado inicial antes de modificar cualquier archivo.
  19. ^ E. Myers (1986). "Un algoritmo de diferencia O(ND) y sus variaciones". Algorithmica . 1 (2): 251–266. CiteSeerX 10.1.1.4.6927 . doi :10.1007/BF01840446. S2CID  6996809. 
  20. ^ Webb Miller; Eugene W. Myers (1985). "Un programa de comparación de archivos". Software: práctica y experiencia . 15 (11): 1025–1040. CiteSeerX 10.1.1.189.70 . doi :10.1002/spe.4380151102. S2CID  15489614. 
  21. ^ Esko Ukkonen (1985). "Algoritmos para la correspondencia aproximada de cadenas". Información y control . 64 (1–3): 100–118. doi : 10.1016/S0019-9958(85)80046-2 .
  22. ^ Utilidades GNU Diff Archivado el 16 de marzo de 2015 en Wayback Machine . Disponible gracias a la Free Software Foundation . Documentación libre. Código fuente libre.
  23. ^ "merge (GNU RCS 5.10.0)". gnu.org . Archivado desde el original el 18 de septiembre de 2019 . Consultado el 22 de enero de 2021 .
  24. ^ Moolenaar, Bram . "Documentación de Vim: diff". vimdoc.sourceforge.net . Archivado desde el original el 16 de febrero de 2020. Consultado el 1 de mayo de 2020. La forma más sencilla de comenzar a editar en modo diff es con el comando "vimdiff". Esto inicia Vim como de costumbre y, además, configura la visualización de las diferencias entre los argumentos. Esto es equivalente a:vimdiff file1 file2 [file3] [file4] [...file8]vim -d file1 file2 [file3] [file4] [...file8]
  25. ^ ab Brabandt, Christian (1 de diciembre de 2018). «El poder de la diferencia». Vimways . Archivado desde el original el 2 de diciembre de 2018 . Consultado el 1 de mayo de 2020 .
  26. ^ "gnu.org". www.gnu.org . Archivado desde el original el 2020-08-11 . Consultado el 2020-09-12 .
  27. ^ "colordiff". www.colordiff.org . Archivado desde el original el 2018-06-14 . Consultado el 2018-06-14 .
  28. ^ "diff-so-fancy". Muy elegante. 6 de mayo de 2023.
  29. ^ Davison, Dan (8 de mayo de 2023). "dandavisón/delta". GitHub .
  30. ^ Waugh, Tim (12 de junio de 2020). «twaugh/patchutils». GitHub . Archivado desde el original el 1 de octubre de 2020 . Consultado el 28 de junio de 2020 .
  31. ^ Horwitz, Susan (junio de 1990). "Identificación de las diferencias semánticas y textuales entre dos versiones de un programa". ACM SIGPLAN Notices . 25 (6): 234–245. CiteSeerX 10.1.1.49.3377 . doi :10.1145/93548.93574. Archivado desde el original el 2010-06-12 . Consultado el 2017-11-01 . 
  32. ^ Yang, Wuu (julio de 1991). "Identificación de diferencias sintácticas entre dos programas". Software: práctica y experiencia . 21 (7): 739–755. CiteSeerX 10.1.1.13.9377 . doi :10.1002/spe.4380210706. S2CID  10853673. 
  33. ^ Grass. Cdiff: Un Diff dirigido por sintaxis para programas C++. Actas de la Conferencia USENIX C++, págs. 181-193, 1992
  34. ^ Compare++, http://www.coodesoft.com/ Archivado el 29 de noviembre de 2011 en Wayback Machine.
  35. ^ SmartDifferencer, http://www.semanticdesigns.com/Products/SmartDifferencer Archivado el 14 de octubre de 2009 en Wayback Machine.
  36. ^ "xaizek/zograscope". GitHub . 26 de mayo de 2020. Archivado desde el original el 21 de diciembre de 2020 . Consultado el 27 de junio de 2020 .
  37. ^ DaisyDiff , https://code.google.com/p/daisydiff/ Archivado el 19 de marzo de 2015 en Wayback Machine.
  38. ^ xmldiffpatch , http://msdn.microsoft.com/en-us/library/aa302294.aspx Archivado el 27 de octubre de 2009 en Wayback Machine
  39. ^ xmldiffmerge , http://www.alphaworks.ibm.com/tech/xmldiffmerge Archivado el 24 de septiembre de 2009 en Wayback Machine
  40. ^ Cheney, Austin. Pretty Diff - Documentación . http://prettydiff.com/documentation.php Archivado el 31 de julio de 2012 en Wayback Machine.
  41. ^ de dontcallmedotcom. "spiff". GitHub . Archivado desde el original el 26 de marzo de 2015 . Consultado el 16 de junio de 2013 .
  42. ^ ab Nachbar, Daniel W (1999-12-01). "HP-UX Porting and Archiving". Reino Unido. Archivado desde el original el 2012-09-05 . Consultado el 2013-06-13 .
  43. ^ "SPIFF 1". 2 de febrero de 1988. Archivado desde el original el 2 de octubre de 2016. Consultado el 16 de junio de 2013 .
  44. ^ Nachbar, Daniel W (2 de febrero de 1988). «Man page». Reino Unido. Archivado desde el original el 10 de septiembre de 2012. Consultado el 16 de junio de 2013 .
  45. ^ Davide (28 de septiembre de 2009). «stackoverflow». Archivado desde el original el 19 de febrero de 2022. Consultado el 16 de junio de 2013 .
  46. ^ Libenzi, Davide. "LibXDiff". SourceForge FreshMeat . Archivado desde el original el 1 de julio de 2020. Consultado el 28 de junio de 2020 .
  47. ^ Nugroho, Yusuf Sulistyo; Hata, Hideaki; Matsumoto, Kenichi (enero de 2020). "¿Qué tan diferentes son los distintos algoritmos diff en Git?: Use --histogram para cambios de código". Ingeniería de software empírica : 790–823. arXiv : 1902.02467 . doi : 10.1007/s10664-019-09772-z . S2CID  : 59608676.
  48. ^ "algoritmo - ¿Cuál es la diferencia entre 'git diff --patience' y 'git diff --histogram'?". Desbordamiento de pila . Archivado desde el original el 2022-02-19 . Consultado el 2020-06-28 . Esto demuestra que la diferencia de histograma supera ligeramente a Myers, mientras que la paciencia es mucho más lenta que los demás.

Lectura adicional

Enlaces externos