Un client WP Adminify m'a envoyé une fois deux exportations de ses paramètres de plugin - "Avant la mise à jour, tout fonctionnait ; après, le menu d'administration est cassé. Rien d'autre n'a changé. " Deux blobs JSON, chacun environ 340 lignes. Je les lis côte à côte, deux fois, et j'ai accepté avec confiance : identique. Rien n'a changé. Ça doit être notre bug.
Ce n'était pas. Quand j'ai finalement cessé de me fier aux yeux et que j'ai diffé les deux fichiers, c'était sur la ligne 217 : une touche de rôle du menu était passée de "administrator" à "administrator " — Avec un espace de fuite. Un caractère invisible. J'avais personnellement lu deux fois passé, parce que les yeux humains ne comparent pas les cordes, ils correspondent aux formes, et administrator et administrator ont la même forme.
Ce ticket de support a définitivement changé ma règle : Si deux textes sont plus longs qu'une dizaine de lignes, je ne les compare pas en lisant. jamais. Un algorithme de diff n'a pas de raccourcis de correspondance de modèles à tromper - il compare chaque caractère et rapporte exactement ce qui diffère. le Outil de diff de texte Sur Toolz.dev, cela signifie que les configurations, les contrats et le code inédits des clients ne quittent jamais votre machine. Voici comment Diffing fonctionne réellement et comment bien l'utiliser.
tl;dr : Ne comparez jamais visuellement les textes plus longtemps que quelques lignes : les yeux ne sont pas les espaces de fin, les chiffres échangés et les modifications d'un seul mot. Collez les deux versions dans le Outil de diff de texte: vert = ajouté, rouge = supprimé, calculé par la même famille d'algorithmes Myers qui alimente
git diff. manier Mode ligne Pour le code et les configurations, Mode mot pour la prose et les contrats. Pour les données structurées, la Diff JSON Compare par sens plutôt qu'en texte. Tout fonctionne côté client.
Comment fonctionne réellement un algorithme de diff ?
L'idée de base : trouver le Sous-séquence commune la plus longue (LCS) des deux textes - la plus longue séquence de lignes (ou de mots ou de caractères) qui apparaît dans les deux, dans le même ordre. Tout dans le LCS est "inchangé. "Tout ce qui reste dans la version A est une suppression ; tout ce qui reste dans la version B est un ajout. Une ligne "modifiée" n'est qu'une suppression et un ajout qui se trouvent à côté les uns des autres.
La manière standard de calculer cela vient efficacement du papier d'Eugene Myers, de 1986, "Un algorithme de différence O(nd) et ses variations". La partie élégante est ce que dit la complexité liée : pour ne pas vous est la taille d'entrée, mais ré est le Nombre de différences. Deux textes presque identiques diffèrent presque instantanément, peu importe leur durée, car le travail de l'algorithme évolue avec leur différence, et non seulement leur taille. C'est pourquoi la différence de deux configurations de 300 lignes qui diffèrent d'une seule ligne semble instantanée : l'algorithme ne fait presque rien, ce qui est exactement la situation où vos yeux font le plus de travail et échouent.
Cette même famille d'algorithmes est le moteur par défaut dans git diff, GNU diff, et la plupart des outils de comparaison que vous avez jamais utilisés. (Git propose également patience et histogram variantes qui produisent parfois des groupes plus lisibles par l'homme des mêmes changements - le set des changements est le même, la présentation diffère.)
Une propriété non évidente importante : un différentiel n'est pas toujours unique. Si vous ajoutez une ligne vide entre deux lignes vierges existantes, "qui "la ligne vierge est nouvelle est vraiment ambiguë, et différents outils peuvent mettre en évidence différents. Les deux réponses sont correctes.
Ligne, mot ou caractère différent — quel mode quand ?
La granularité que vous comparez à change à quoi sert la sortie. Se tromper est la raison principale pour laquelle les gens trouvent une sortie diff "bruite".
| niveau ligne | niveau mot | niveau personnage | |
|---|---|---|---|
| comparaisons | Lignes entières comme atomes | Mots individuels | Personnages individuels |
| Une modification en un mot s'affiche comme | Ligne entière supprimée + ajoutée | Juste ce mot | Juste les lettres modifiées |
| le mieux pour | Code, configurations, lignes CSV | Prose, contrats, docs | Typos, hachage, chaînes codées |
| faiblesse | Modifications du paragraphe long : vous chassez toujours dans la ligne | Bruyant sur le texte refondu/réhappé | Int lisible pour les modifications importantes |
| Utilisateur classique | git diff |
Ligne noire légale / Avis éditorial | "Ces deux clés API semblent identiques" |
Exemple concret. Original : The quick brown fox jumps over the lazy dog. Modifié : The quick red fox leaps over the lazy cat.
- Mode ligne Indicateur de la phrase entière comme modifiée - exacte, inutile.
- Mode mot Les points forts exactement
brown→red,jumps→leaps,dog→cat. - Mode personnage est exagéré ici, mais c'est le seul mode qui attraperait
admlnistratorVSadministrator.
Règle d'or : le texte structuré (une déclaration significative par ligne) veut le mode ligne ; le texte fluide veut le mode mot ; le mode caractère est une loupe que vous retirez lorsque les deux autres disent "changement" et que vous ne voyez pas pourquoi. Mon bogue d'espace de suivi est le cas canonique en mode personnage.
Quand un outil de différentiel autonome est-il meilleur que git ?
Le diff de Git est excellent Pour les éléments qui vivent dans le même référentiel. Un nombre surprenant de travaux de comparaison ne :
Soutenez les tickets. Le scénario de mon introduction — Deux paramètres exportent d'un client. Ils ne sont pas dans un repo. Collez les deux dans le Outil de diff de texte Et la réponse apparaît en quelques secondes au lieu de deux lectures ratées.
Dérive de configuration. Mise en place de la configuration de NGINX vs Production Nginx Config. courant .env vs la sauvegarde d'avant que les choses ne se soient cassées. git diff Impossible de voir les fichiers sur deux serveurs différents ; le copier-coller peut.
Vérification du formateur. Vous avez exécuté plus joli (ou PHPC ou noir) sur un fichier et vous souhaitez avoir une assurance modifiée. Formatage uniquement. Diffez l'avant et l'après : si vous voyez autre chose que des espaces blancs, des citations et des points-virgules, le formateur a touché la logique et vous voulez savoir maintenant.
Deux réponses API. La mise en scène renvoie un corps JSON, la production en renvoie un autre et la front-end ne se bloque que lors de la mise en scène. Diff les réponses. (Pour JSON en particulier, préférez Diff JSON — Il compare la structure analysée, donc l'ordre des clés et l'espace blanc ne créent pas de faux positifs. Exécutez les deux charges utiles via le Formateur JSON Tout d'abord, si vous voulez plutôt un diff de texte lisible.)
Documents et contrats. Un fournisseur renvoie "le même contrat avec des mises à jour mineures." Word-Mode Diff est la façon dont vous découvrez que les conditions de paiement sont passées du net 30 à 15 net dans un document de 40 pages. Les éditeurs et les avocats le savent depuis toujours – ils appellent cela une ligne noire ou une ligne rouge.
Fichiers de traduction et de localisation. Comparaison de deux versions d'un .po Fichier pour voir quelles chaînes ont réellement changé avant de les renvoyer aux traducteurs - un véritable flux de travail WP Adminify qui permet d'économiser de payer pour retraduire 400 chaînes inchangées.
Le fil conducteur : au moment où les deux versions existent sous forme de texte que vous pouvez sélectionner, un outil de diff répond "Qu'est-ce qui a changé ?" mécaniquement. Et parce que l'outil Toolz.dev est côté client, coller une configuration client ou un contrat non signé ne le transmet nulle part - le même argument que le reste du Boîte à outils Privée.
Comment lire la sortie diff sans se tromper ?
La convention de couleurs est universelle : Le rouge est le contenu exclusif de l'ancienne version (supprimée), le vert est la nouvelle version (ajoutée), le texte inchangé rend clair pour le contexte. Une ligne modifiée apparaît sous la forme d'une ligne rouge suivie de son remplacement vert.
Trois habitudes qui rendent la révision du différentiel réellement fiable :
Mettez les versions dans les bons emplacements. Ancien/Original à gauche (ou premier champ), nouveau/modifié à droite. Échangez-les et chaque ajout se lit comme une suppression - j'ai vu des gens déboguer la mauvaise direction pendant dix minutes à cause de cela. Si la sortie regarde en arrière, c'est probablement le cas.
Décidez quel bruit est avant de commencer. Comparer le code reformaté ? Les changements d'espaces blancs sont du bruit - les normaliser ou les ignorer. Comparer les configurations YAML ? L'espace blanc est éloquent — L'indentation est une structure dans YAML, alors validez les deux côtés dans le Validateur de YAML Et traitez chaque espace comme un signal. Le même outil, les politiques opposées et le mauvais choix enterrent le vrai changement de bruit ou le masque.
Lisez chaque morceau, pas seulement le premier. L'espace de fin du client était le changement n° 1 sur 1. Mais lorsqu'un différentiel montre quatre changements et que le premier explique votre symptôme, la tentation d'arrêter de lire est forte - et le changement #3 est parfois celui qui vous mord la semaine prochaine. Le différentiel a déjà fait le plus de mal, ne réintroduisez pas l'erreur d'échantillonnage humain à la dernière étape.
Qu'est-ce qu'un diff de texte ne peut pas vous dire ?
Cela vaut la peine d'être honnête sur les limites :
- Blocs déplacés Lire comme suppression + Ajouter. Coupez une fonction du haut d'un fichier et collez-la en bas : le diff signale qu'il a été supprimé et ajouté, non déplacé. Certains outils spécialisés détectent les mouvements, les LC simples ne le font pas.
- Il compare le texte, pas le sens.
0.1 + 0.2et0.3Diff comme différents (ils le sont) mais aussi se comporter différemment en virgule flottante - et inversement,"key": 1VS"key": 1.0Peut être textuellement différent mais sémantiquement identique dans votre langue. comparaison structurée (comme le Diff JSON) comble une partie de cet écart pour les formats de données. - Le contenu binaire est hors de portée. Images, PDF sous forme d'octets, exécutables — Text Diff a besoin de texte. Extrayez le texte en premier ou utilisez des outils spécifiques au format.
- Le cas et l'encodage sont littéralement comparés.
README≠readme, et un devis UTF-8 Curly ≠ Une citation directe ASCII même si elles semblent identiques dans la plupart des polices. (Un autre piège de forme-modèle pour les yeux, une autre victoire pour l'algorithme.) Pré-normalisez avec le Convertisseur de boîtier Si le cas ne devrait pas avoir d'importance pour votre comparaison.
Questions fréquentes
Puis-je comparer des fichiers ou uniquement du texte collé ?
le Outil de diff de texte Fonctionne sur le texte collé : ouvrez chaque fichier dans n'importe quel éditeur, copiez, collez les deux côtés. Cela le rend non agnostique de format - tout ce qui est lisible de texte (code, config, csv, SQL, prose) peut être comparé, quelle que soit l'extension.
Y a-t-il une limite de taille pour la comparaison ?
La limite pratique est la mémoire de votre appareil, puisque le traitement est en navigateur. Les fichiers avec quelques milliers de lignes se comparent instantanément ; les coûts de l'algorithme Myers sont à l'échelle du nombre de différences, donc même les textes volumineux mais similaires restent rapides. Des centaines de milliers de lignes avec des différences massives peuvent prendre quelques secondes.
Quel mode de diff dois-je utiliser pour le code ?
Mode ligne. Le code est naturellement à une instruction par ligne, de sorte que la sortie au niveau de la ligne correspond proprement à la façon dont vous pensez au changement. Passez en mode Word ou caractère uniquement lorsqu'une ligne est signalée comme modifiée et que vous ne pouvez pas repérer la différence en son sein, c'est-à-dire généralement un espace blanc, des citations ou un seul caractère.
Quel mode est le meilleur pour les contrats et la prose ?
Mode mot. Les modifications de prose sont généralement des substitutions de mots et des clauses insérées dans de longs paragraphes ; le mode ligne signale des paragraphes entiers et vous laissera la chasse. La mise en surbrillance au niveau des mots montre exactement quels mots ont changé, la même approche qu'une ligne noire légale.
Le diff modifie-t-il ou stocke-t-il mon texte ?
non La mise en surbrillance n'existe que dans la sortie rendue, votre texte d'entrée est inchangé et, comme l'outil s'exécute entièrement côté client, aucune version n'est transmise ou stockée n'importe où. Fermez l'onglet et les textes ont disparu.
Pourquoi le différentiel met-il en évidence une ligne qui semble identique ?
Personnages presque toujours invisibles : espaces de fin, onglets vs espaces, fenêtres \r\n vs Unix \n Fins de ligne, espaces non cassants ou sosies Unicode (curly vs droits). C'est précisément la classe de changement que les algorithmes humains ne peuvent pas voir et les algorithmes de diff s'attrapent - mon ticket de support d'espace de suivi était l'un d'entre eux.
Peut-il détecter le texte déplacé ?
Pas comme un déménagement. Le blocage standard basé sur LCS signale un bloc déplacé comme supprimé de l'ancien emplacement et ajouté au nouveau. Si vous soupçonnez un déménagement, recherchez le texte "ajouté" dans l'original - un coup exact ailleurs dans le fichier le confirme.
En quoi JSON diff est-il différent de Text Diff ?
Texte diff compare les caractères ; Diff JSON Analyse les deux documents et compare la structure. Les clés réorganisées, les modifications d'indentation et les virgules de fin ne produisent aucune différence structurelle, de sorte que vous ne voyez que les modifications des valeurs réelles et des clés. Utilisez-le chaque fois que les deux parties sont valides, revenez à la diff de texte lorsqu'elles ne sont pas.
Comment puis-je ignorer les espaces blancs ou les cas lors de la comparaison de texte ?
Décidez d'abord si l'espace blanc est un bruit ou un signal : dans le code reformaté, il s'agit de bruit, mais dans l'indentation YAML ou Python, il s'agit d'une structure. Lorsqu'il s'agit de bruit, normalisez les deux côtés avant de différer - réduisez les espaces répétés, dépouillez les espaces blancs et homogénéisez les fins de ligne - de sorte que seuls les changements réels restent. Pour ignorer le cas, en minuscule les deux textes avant de comparer, car Diff traite Readme et Readme comme différents par défaut.
Quel algorithme utilise Git Diff ?
Par défaut, Git Diff utilise une variante de l'algorithme Myers, la même approche de la sous-séquence la plus longue de la série Eugene Myers 1986 que la plupart des outils de diff partagent. Git propose également des variantes de patience et d'histogramme qui peuvent regrouper les changements de manière plus lisible, mais elles rapportent le même ensemble de différences - uniquement les changements de présentation. Cet outil utilise la même famille d'algorithmes Myers.

