Comment fonctionne le comparateur de texte
Les deux textes sont découpés en lignes, et la page cherche la plus longue suite de lignes qu’ils ont en commun, dans l’ordre (la plus longue sous-séquence commune). Tout le reste est une modification : les lignes présentes seulement dans l’original sont supprimées, celles présentes seulement dans le texte modifié sont ajoutées. La page utilise l’algorithme d’Eugene Myers, celui de GNU diff et de git diff, et trouve donc le plus petit ensemble de modifications.
Quand un bloc de lignes supprimées est juste à côté d’un bloc de lignes ajoutées, elles sont appariées dans l’ordre et comparées de nouveau mot par mot. Les mots qui diffèrent sont signalés, si bien qu’un numéro de port ou un chemin modifié ressort dans une longue ligne. Si deux lignes appariées ont peu de points communs, la ligne entière est affichée comme modifiée.
L’option « Ignorer les espaces » traite une suite d’espaces et de tabulations comme un seul caractère d’espacement et les ignore en début et en fin de ligne, ce qui aide après une ré-indentation. « Ignorer la casse » compare les lettres sans distinguer majuscules et minuscules. Les fins de ligne (CRLF de Windows ou LF d’Unix) ne comptent jamais comme une différence. Les longues parties inchangées sont repliées, avec trois lignes de contexte conservées autour de chaque modification.
Exemple
L’exemple est un site nginx passé de HTTP simple à HTTPS. L’original compte 11 lignes et la version modifiée 12. Le diff trouve 7 lignes inchangées, 4 supprimées et 5 ajoutées. Dans la ligne listen, seul « 80 » est devenu « 443 ssl », et dans la ligne root seul « html » est devenu « example » : ces mots sont donc signalés. En diff unifié, cela donne :
--- original.conf
+++ changed.conf
@@ -1,11 +1,12 @@
server {
- listen 80;
+ listen 443 ssl;
+ http2 on;
server_name example.com www.example.com;
- root /var/www/html;
+ root /var/www/example;
+ ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
+
location / {
try_files $uri $uri/ =404;
}
-
- access_log /var/log/nginx/access.log;
}
Les lignes qui commencent par un moins sont supprimées, celles qui commencent par un plus sont ajoutées, et celles qui commencent par un caractère espace sont du contexte inchangé. L’en-tête @@ -1,11 +1,12 @@ signifie que le bloc couvre les lignes 1 à 11 de l’original et 1 à 12 du texte modifié. La commande patch peut appliquer un fichier comme celui-ci à l’original : patch original.conf changes.diff.
Questions
Comment comparer deux textes pour trouver les différences ?
Collez l’ancienne version dans le champ de gauche et la nouvelle dans celui de droite. Les différences apparaissent aussitôt : lignes supprimées en rouge, lignes ajoutées en vert, avec les mots modifiés signalés à l’intérieur. Utilisez Inverser si vous les avez collées dans le mauvais sens.
Mon texte est-il envoyé quelque part ?
Non. La comparaison s’exécute dans votre navigateur avec JavaScript, et le texte ne quitte jamais cette page. Vous pouvez donc y mettre des configurations, des journaux et du code que vous ne colleriez pas sur un site qui envoie le texte à un serveur. Fermer l’onglet l’efface.
À quoi sert « ignorer les espaces » dans un diff ?
L’option considère comme égales les lignes qui ne diffèrent que par les espaces : plusieurs espaces ou tabulations comptent pour un seul caractère d’espacement, et les espaces en début ou en fin de ligne sont ignorés. C’est utile après qu’un fichier a été ré-indenté ou que des tabulations ont été remplacées par des espaces. Les mots des lignes modifiées sont comparés de la même façon.
Comment comparer deux fichiers en ligne de commande ?
Sous Linux et macOS : diff -u old.conf new.conf, ou git diff --no-index old.conf new.conf pour les couleurs et le marquage des mots (ajoutez --word-diff). Sous Windows : fc old.conf new.conf dans cmd, ou Compare-Object (Get-Content old.conf) (Get-Content new.conf) dans PowerShell. Ajoutez -w à diff pour ignorer les espaces.
Que signifie @@ -1,11 +1,12 @@ dans un diff ?
C’est l’en-tête d’un bloc (un hunk) dans un diff unifié. -1,11 signifie que le bloc commence à la ligne 1 de l’ancien fichier et couvre 11 lignes ; +1,12 signifie qu’il commence à la ligne 1 du nouveau fichier et couvre 12 lignes. En dessous, les lignes qui commencent par - ont été supprimées, celles qui commencent par + ont été ajoutées, et un caractère espace indique du contexte inchangé.