Comparateur de Textes

Comparez deux textes côte à côte et mettez en évidence les différences ligne par ligne

Essayer un exemple

Texte A

Texte B

Fonctionne localement · Sûr pour coller des secrets
Fonctionne localement · Sûr pour coller des secrets

Qu'est-ce que le diff de texte ?

Un diff de texte (abréviation de « difference », différence) est le résultat de la comparaison de deux blocs de texte permettant d'identifier les lignes ajoutées, supprimées ou inchangées. Le concept est issu de l'utilitaire Unix diff, publié pour la première fois en 1974 dans Unix Version 5. Aujourd'hui, le diff de texte est au cœur des systèmes de contrôle de version comme Git, où chaque commit stocke un diff plutôt qu'une copie complète de chaque fichier.

Un algorithme de diff recherche la Plus Longue Sous-Séquence Commune (LCS) entre deux séquences de lignes. Les lignes présentes dans la LCS sont marquées comme inchangées. Les lignes du texte original absentes de la LCS sont marquées comme supprimées. Les lignes du texte modifié absentes de la LCS sont marquées comme ajoutées. Le résultat est un ensemble minimal de changements nécessaires pour transformer un texte en l'autre.

La sortie d'un diff existe sous plusieurs formats. Le format unified diff (format par défaut de git diff) préfixe les lignes supprimées par un signe moins et les lignes ajoutées par un signe plus. Le diff côte à côte dispose les deux textes en colonnes parallèles. Cet outil utilise une comparaison ligne par ligne avec un rendu coloré : vert pour les ajouts, rouge pour les suppressions, et neutre pour les lignes inchangées. Les lignes inchangées sont affichées sans préfixe par défaut, mais peuvent être masquées pour se concentrer uniquement sur les modifications.

Pourquoi utiliser un outil de diff en ligne ?

Comparer des textes dans un terminal nécessite d'installer des utilitaires diff et de gérer des options de ligne de commande. Un outil de diff dans le navigateur supprime complètement cette friction.

Comparaison instantanée
Collez deux blocs de texte et voyez les différences mises en évidence immédiatement. Aucun fichier à créer, aucune commande à mémoriser, aucune sortie à analyser.
🔒
Traitement axé sur la confidentialité
Toute la comparaison se fait dans votre navigateur via JavaScript. Votre texte ne quitte jamais votre appareil, ce qui importe lorsque vous comparez des fichiers de configuration, des identifiants ou du code propriétaire.
📋
Sortie prête à copier
La sortie du diff utilise les préfixes standard + / - conformes au format unified diff. Vous pouvez copier le résultat directement dans des messages de commit, des commentaires de revue de code ou des rapports de bug.
🌐
Sans compte ni installation
Fonctionne sur n'importe quel appareil avec un navigateur. Aucun compte à créer, aucune extension, aucune application de bureau. Ouvrez la page et commencez à comparer.

Cas d'utilisation du diff de texte

Développement frontend
Comparez la sortie CSS ou HTML minifiée avant et après une étape de build pour détecter les modifications involontaires dans le balisage ou les styles générés.
Développement backend
Comparez les réponses d'API entre environnements (staging vs production) pour vérifier qu'un déploiement n'a pas introduit de changements de données inattendus.
DevOps et infrastructure
Comparez des manifestes Kubernetes, des plans Terraform ou des configurations Nginx avant d'appliquer des modifications à un cluster ou un serveur en production.
QA et tests
Vérifiez que la sortie d'un test correspond aux résultats attendus en comparant le résultat réel à un fichier snapshot de référence.
Ingénierie des données
Comparez des en-têtes CSV ou des définitions de schémas SQL entre migrations de base de données pour confirmer que des colonnes ont bien été ajoutées ou renommées.
Apprentissage et cours
Comparez votre solution à une implémentation de référence ligne par ligne pour trouver l'endroit où votre logique diverge de l'approche attendue.

Comparaison des formats de sortie diff

Les outils de diff produisent leur sortie dans plusieurs formats. Le tableau ci-dessous résume les plus courants, ce qui les génère et dans quel cas chacun est utile.

FormatOutil / SourceDescription
Unified diffdiff -u / git diffPrefixes lines with + / - / space; includes @@ hunk headers
Side-by-sidediff -y / sdiffTwo columns, changed lines aligned horizontally
Context diffdiff -cShows changed lines with surrounding context, marked with ! / + / -
HTML diffPython difflibColor-coded HTML table with inline change highlights
JSON PatchRFC 6902Array of add/remove/replace operations on a JSON document

Comment fonctionne le diff ligne par ligne : l'algorithme LCS

La plupart des outils de diff ligne par ligne, dont celui-ci, utilisent l'algorithme de la Plus Longue Sous-Séquence Commune (LCS). La LCS recherche le plus grand ensemble de lignes présentes dans les deux textes dans le même ordre relatif, sans qu'elles soient nécessairement contiguës. Les lignes absentes de la LCS constituent les différences effectives.

L'algorithme LCS standard utilise la programmation dynamique et s'exécute en O(m x n), où m et n sont le nombre de lignes des deux textes. Pour les fichiers volumineux, des variantes optimisées comme l'algorithme de Myers (utilisé par Git) ramènent la complexité à O(n + d²), où d est le nombre de différences, ce qui le rend rapide lorsque la majorité des lignes sont communes.

1. Construire la table DP
Créer une matrice (m+1) x (n+1). Pour chaque paire de lignes, stocker la longueur de la plus longue sous-séquence commune trouvée jusqu'ici. Des lignes égales étendent la valeur diagonale de 1.
2. Remonter la table
Parcourir la matrice depuis le coin inférieur droit jusqu'à (0,0). Les déplacements diagonaux sur des lignes égales produisent des entrées « inchangées ». Les déplacements horizontaux ou verticaux produisent des entrées « ajoutées » ou « supprimées ».
3. Rendre la sortie
Associer chaque entrée à une ligne d'affichage : les lignes inchangées n'ont pas de préfixe, les lignes ajoutées reçoivent +, les lignes supprimées reçoivent -. Appliquer un code couleur pour la lisibilité visuelle.

Exemples de code

Implémentations de la comparaison de texte ligne par ligne en JavaScript, Python, Go et en ligne de commande. Chaque exemple produit une sortie au format unified diff.

JavaScript
// Line-by-line diff using the LCS algorithm
function diffLines(a, b) {
  const linesA = a.split('\n')
  const linesB = b.split('\n')

  // Build LCS table
  const m = linesA.length, n = linesB.length
  const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0))
  for (let i = 1; i <= m; i++)
    for (let j = 1; j <= n; j++)
      dp[i][j] = linesA[i-1] === linesB[j-1]
        ? dp[i-1][j-1] + 1
        : Math.max(dp[i-1][j], dp[i][j-1])

  // Backtrack to produce diff
  const result = []
  let i = m, j = n
  while (i > 0 || j > 0) {
    if (i > 0 && j > 0 && linesA[i-1] === linesB[j-1]) {
      result.unshift({ type: 'equal', text: linesA[i-1] }); i--; j--
    } else if (j > 0 && (i === 0 || dp[i][j-1] >= dp[i-1][j])) {
      result.unshift({ type: 'add', text: linesB[j-1] }); j--
    } else {
      result.unshift({ type: 'remove', text: linesA[i-1] }); i--
    }
  }
  return result
}

const diff = diffLines("alpha\nbeta\ngamma", "alpha\nbeta changed\ngamma\ndelta")
// → [
//   { type: 'equal',  text: 'alpha' },
//   { type: 'remove', text: 'beta' },
//   { type: 'add',    text: 'beta changed' },
//   { type: 'equal',  text: 'gamma' },
//   { type: 'add',    text: 'delta' }
// ]
Python
import difflib

text_a = """alpha
beta
gamma""".splitlines()

text_b = """alpha
beta changed
gamma
delta""".splitlines()

# Unified diff (same format as git diff)
for line in difflib.unified_diff(text_a, text_b, fromfile='a.txt', tofile='b.txt', lineterm=''):
    print(line)
# --- a.txt
# +++ b.txt
# @@ -1,3 +1,4 @@
#  alpha
# -beta
# +beta changed
#  gamma
# +delta

# HTML side-by-side diff
d = difflib.HtmlDiff()
html = d.make_file(text_a, text_b, fromdesc='Original', todesc='Modified')
Go
package main

import (
	"fmt"
	"strings"
)

// Minimal LCS-based line diff
func diffLines(a, b string) {
	la := strings.Split(a, "\n")
	lb := strings.Split(b, "\n")
	m, n := len(la), len(lb)

	dp := make([][]int, m+1)
	for i := range dp {
		dp[i] = make([]int, n+1)
	}
	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			if la[i-1] == lb[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			} else if dp[i-1][j] >= dp[i][j-1] {
				dp[i][j] = dp[i-1][j]
			} else {
				dp[i][j] = dp[i][j-1]
			}
		}
	}

	var result []string
	i, j := m, n
	for i > 0 || j > 0 {
		if i > 0 && j > 0 && la[i-1] == lb[j-1] {
			result = append([]string{" " + la[i-1]}, result...)
			i--; j--
		} else if j > 0 && (i == 0 || dp[i][j-1] >= dp[i-1][j]) {
			result = append([]string{"+" + lb[j-1]}, result...)
			j--
		} else {
			result = append([]string{"-" + la[i-1]}, result...)
			i--
		}
	}

	for _, line := range result {
		fmt.Println(line)
	}
}

// Output:
//  alpha
// -beta
// +beta changed
//  gamma
// +delta
CLI (diff / git)
# Compare two files with unified diff (3 lines of context)
diff -u original.txt modified.txt

# Git diff between working tree and last commit
git diff HEAD -- file.txt

# Git diff between two branches
git diff main..feature -- src/

# Side-by-side diff in the terminal
diff -y --width=120 original.txt modified.txt

# Color-coded diff (requires colordiff)
diff -u original.txt modified.txt | colordiff

Questions fréquentes

Quelle est la différence entre un diff de lignes et un diff de caractères ?
Un diff de lignes compare le texte ligne par ligne : si un seul caractère d'une ligne change, la ligne entière est marquée comme supprimée et la nouvelle version est marquée comme ajoutée. Un diff de caractères (ou diff de mots) opère à une granularité plus fine, marquant les caractères ou les mots spécifiques qui ont changé au sein d'une ligne. Le diff de lignes est standard pour la revue de code ; le diff de caractères est plus utile pour l'édition de prose.
Comment git diff fonctionne-t-il en interne ?
Git utilise l'algorithme de Myers par défaut, qui trouve le script d'édition le plus court (le nombre minimal d'insertions et de suppressions) entre deux fichiers. Git stocke le résultat au format unified diff avec des en-têtes de bloc @@ indiquant les numéros de ligne. Lorsque vous exécutez git diff, Git compare l'arbre de travail avec l'index (zone de staging), et non avec le dernier commit, sauf si vous passez HEAD explicitement.
Puis-je comparer des fichiers binaires avec un outil de diff de texte ?
Non. Les outils de diff de texte découpent l'entrée sur les caractères de saut de ligne et comparent des chaînes. Les fichiers binaires contiennent des séquences d'octets arbitraires qui produisent des découpages de lignes sans signification. Pour la comparaison binaire, utilisez un outil de diff hexadécimal ou une comparaison de somme de contrôle au niveau fichier (sha256sum sur les deux fichiers).
Mes données sont-elles envoyées à un serveur lors de l'utilisation de cet outil ?
Non. Cet outil s'exécute entièrement dans votre navigateur. Le calcul du diff utilise une implémentation JavaScript LCS qui s'exécute côté client. Aucune requête réseau n'est effectuée avec le contenu de votre texte. Vous pouvez le vérifier en ouvrant l'onglet Réseau de votre navigateur pendant l'utilisation de l'outil.
Qu'est-ce que le format unified diff ?
Le format unified diff est le format de sortie utilisé par diff -u et git diff. Il affiche les lignes modifiées avec les préfixes - (supprimée) et + (ajoutée), précédés d'en-têtes @@ qui spécifient les plages de numéros de ligne dans les deux fichiers. Les lignes de contexte (inchangées) ont un préfixe espace. Le format unified diff est le format le plus courant pour les patches, les pull requests et les outils de revue de code.
Comment comparer des fichiers volumineux avec de nombreuses différences ?
Pour des fichiers de plusieurs milliers de lignes, un outil dans le navigateur fonctionne mais peut ralentir car l'algorithme LCS évolue quadratiquement. Pour les très grands diffs, les outils en ligne de commande comme diff ou git diff sont plus rapides car ils utilisent des implémentations C optimisées et peuvent diffuser la sortie. Vous pouvez aussi filtrer les lignes inchangées (désactiver « Afficher les lignes inchangées » dans cet outil) pour vous concentrer uniquement sur les modifications.
Qu'est-ce qu'un diff de fusion à trois voies ?
Une fusion à trois voies compare deux versions modifiées d'un fichier par rapport à leur ancêtre commun (la base). Git l'utilise lors de git merge et git rebase. Il identifie les modifications apportées dans chaque branche par rapport à la base et les combine. Lorsque les deux branches modifient la même ligne, Git signale un conflit de fusion. La fusion à trois voies nécessite trois entrées, tandis qu'un diff standard n'en nécessite que deux.