Un client de WP Adminify m'a envoyé une fois deux exportations de ses paramètres de plugin - " ; avant la mise à jour, tout a fonctionné ; après, le menu d'administration est cassé Rien d'autre n'a changé." ; Deux blobs JSON, chacun d'environ 340 lignes Je les ai lus côte à côte, deux fois, et j'ai convenu avec confiance avec lui : identique Rien n'a changé 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 traînant Un personnage invisible J'avais personnellement lu passé devant lui deux fois, parce que les yeux humains don' ; t comparer les cordes ; ils pattern-match 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 correspondant à des 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 de plus de quelques lignes : les yeux manquent 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 mots, ou caractères) qui apparaît dans les deux, dans le même ordre Tout dans le LCS est " ; inchangé." ; Whatever' ; s left dans la version A est une suppression ; whatever' ; s left dans la version B est un ajout. Un " ; modifié" ; line n'est qu'une suppression et un ajout qui se trouvent assis l'un à côté de l'autre.
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, quelle que soit leur durée, car l'algorithme et le n° 39 ; le travail évolue avec leur différence, et pas seulement avec leur taille. That' ; c'est pourquoi differing deux configurations de 300 lignes qui diffèrent d'une ligne semble instantané - 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 des variantes qui produisent parfois des regroupements 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.
Diff de ligne, de mot ou de personnage - 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 signale toute la phrase comme modifiée - précise, 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 intro - deux paramètres exporte d'un client. Ils' ; ne sont dans aucun 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 don' ; ne créez pas de faux positifs. Exécutez les deux charges utiles à travers le Formateur JSON Tout d'abord, si vous voulez plutôt un diff de texte lisible.)
Documents et contrats. Un fournisseur renvoie & quot ; 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 de Net 30 à Net 15 dans un document de 40 pages. Les éditeurs et les avocats le savent depuis toujours - ils l'appellent 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 le renvoyer aux traducteurs - un véritable flux de travail WP Adminify qui permet de gagner en payant pour retraduire 400 chaînes inchangées.
Le fil conducteur : dès que les deux versions existent sous forme de texte que vous pouvez sélectionner, un outil de comparaison répond à " ; qu'est-ce qui a changé ?" ; mécaniquement. Et parce que l'outil Toolz.dev est côté client, colle un client' ; sa configuration 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 Les échanger et chaque ajout se lit comme une suppression - I' ; j'ai regardé les 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. Comparaison du code reformaté ? les changements d'espace sont du bruit - normalisez-les ou ignorez-les Comparaison des config YAML ? l'espace est éloquent- l'indentation est une structure en 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. Le client' ; s l'espace de fin était le changement #1 de 1. Mais quand une diff montre quatre changements et que le premier explique votre symptôme, la tentation d'arrêter la lecture est forte - et le changement #3 est parfois celui qui vous mord la semaine prochaine La diff a déjà fait la partie difficile ; don' ; t ré-introduire 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 comme octets, exécutables - text diff a besoin de texte Extrayez d'abord le texte, 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 indépendant du format - tout ce qui & #39 ; s texte lisible (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 à un énoncé par ligne, donc la sortie au niveau ligne correspond clairement à la façon dont vous pensez au changement. Passez en mode mot ou caractère uniquement lorsqu'une ligne est signalée comme modifiée et que vous pouvez le faire et le n° 39 ; vous repérez la différence à l'intérieur - ce n° 39 ; généralement des espaces, des guillemets ou un seul caractère.
Quel mode est le meilleur pour les contrats et la prose ?
Mode mot. Les modifications de la prose sont généralement des substitutions de mots et des clauses insérées dans les paragraphes longs ; le mode ligne signalerait les paragraphes entiers et vous laisserait chasser. La 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 terminaisons de ligne, espaces non-cassants, ou sosies Unicode (curly vs guillemets droits).C'est précisément la classe de changement que les yeux humains ne peuvent pas voir et les algorithmes de diff attrapent toujours - mon ticket de support de l'espace traînant était l'un de ceux-ci.
Peut-il détecter le texte déplacé ?
Pas comme un mouvement La diffusion standard basée sur LCS signale un bloc déplacé tel que supprimé de l'ancien emplacement et ajouté au nouveau Si vous soupçonnez un mouvement, recherchez le " ; ajouté" ; texte dans l'original - un hit 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 est du bruit ou du signal : dans le code reformaté, c'est du bruit, mais dans l'indentation YAML ou Python, c'est de la structure Quand c'est du bruit, normalisez les deux côtés avant de differ - effondrez les espaces répétés, supprimez l'espace de fin de ligne et rendez les fins de ligne cohérentes - donc il ne reste que de vrais changements Pour ignorer la casse, minuscules les deux textes avant de comparer, puisque le 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 de Myers, la même approche de plus longue commune-succès d'Eugene Myers' ; article de 1986 que partagent la plupart des outils de diff. Git offre é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 - seul la présentation change Cet outil utilise la même famille d'algorithmes de Myers.



