Recherche de site Web

Comment utiliser la commande diff3 sous Linux


Points clés à retenir

  • diff3 détecte les différences entre trois fichiers texte pour aider à identifier les modifications, les versions de fichiers et les modifications de fusion.
  • Les différences sont affichées par morceaux avec des numéros de ligne et des indicateurs de fichier pour identifier facilement les différences.
  • diff3 peut fusionner le contenu de trois fichiers avec des conflits mis en évidence pour une résolution manuelle.

La commande Linux diff3 détecte les différences entre trois fichiers texte. Cela vous aide à identifier les versions, à comprendre leurs différences et à fusionner les modifications. diff3 est idéal pour le code source, les scripts ou tout fichier texte brut.

Qu'est-ce qu'un différentiel ?

Une différence est le résultat de l’exécution d’un outil de différenciation sur un ensemble de fichiers. La sortie résultante contient une liste des différences à l’intérieur de chacun des fichiers. Les différences sont identifiées par le numéro de ligne et le fichier dans lequel se trouve la différence. Comme vous vous en doutez probablement, diff3 crée des différences à partir de trois fichiers.

Les packages de contrôle de version de logiciel (SVC) tels que Git font des différences dans le cadre de ce qu'ils sont, et ils le font exceptionnellement bien. Si vous utilisez Git ou un autre SVC pour comparer des fichiers, vous devez continuer à le faire.

Les développeurs ne sont pas les seuls à pouvoir utiliser les différences. Si vous disposez de documents textuels avec différents brouillons stockés dans différents fichiers, les différences vous seront probablement utiles.

La commande diff3 rend gérable le problème difficile de la comparaison de trois fichiers.

En quoi diff3 est différent

diff3 prend trois noms de fichiers comme paramètres. Par convention, ils sont appelés les miens, plus anciens et les vôtres, mais ils peuvent porter n'importe quel nom. Le modèle mien, plus ancien et le vôtre suppose un fichier ancêtre plus ancien et deux dérivés modifiés.

Voici un exemple simple.

Il s'agit de mon-fichier.txt.

first line
second line
edited third line

Il s'agit du fichier ancien-fichier.txt.

first line
second line
third line

Il s'agit de votre fichier.txt.

first line
second line
changed third line

Nous pouvons effectuer une comparaison à trois en répertoriant les fichiers dans l'ordre sur la ligne de commande.

diff3 my-file.txt old-file.txt your-file.txt

diff3 signale que chaque fichier a une troisième ligne différente.

Le format de sortie diff3

Les différences sont affichées en mecs. Un morceau commence par « ==== » et un numéro facultatif, indiquant de quel fichier proviennent les différences. Le numéro est la position du fichier sur la ligne de commande. Aucun numéro signifie que les trois fichiers diffèrent.

Voici un exemple. Les fichiers old.txt et yours.txt contiennent ces lignes.

Line 1
Line 2
Line 3

Le fichier mine.txt contient une première ligne modifiée.

My file Line 1
Line 2
Line 3

Voici la commande diff3.

diff3 mine.txt older.txt yours.txt

Le délimiteur '====1' signifie le fichier 1, ou mine.txt.

Le « 1 : » signifie le fichier un. Le « 1c » signifie que la première ligne doit être modifiée si elle doit correspondre à la même ligne dans l'ancien fichier. La ligne s'affiche.

Les lignes correspondantes des fichiers deux et trois sont affichées. Parce qu'ils contiennent le même texte, celui-ci est répertorié une fois, mais identifié deux fois. Les « 2:1c » et « 3:1c » empilés indiquent que la ligne apparaît dans les deux fichiers, avec la ligne affichée en dessous d'eux.

Faisons en sorte que mine.txt et yours.txt soient identiques, avec ce texte.

Line 1
Line 2
Line 3

Le fichier old.txt a une deuxième ligne modifiée.

Line 1
Older file Line 2
Line 3

Nous n'avons pas modifié les noms de fichiers, nous pouvons donc exécuter à nouveau la même commande.

diff3 mine.txt older.txt yours.txt

Le « 2 » à la fin du délimiteur « ====2 » indique que la différence entre ce morceau se trouve dans le fichier deux. La ligne correspondante des fichiers un et trois s'affiche, ainsi que la ligne contenant les différences par rapport au fichier deux.

Modifions à nouveau le fichier deux et ajoutons une ligne qui ne figure pas dans les autres fichiers.

Line 1
Older file Line 2
Line 3
Line 4

Nous pouvons utiliser notre même commande.

diff3 mine.txt older.txt yours.txt

Cette fois, nous avons deux beaux mecs. Les deux délimiteurs font référence aux différences dans le fichier deux.

Le premier morceau signifie que la ligne deux des fichiers un et trois doit être modifiée pour correspondre à la même ligne dans le fichier deux. Ou bien, la ligne deux du fichier deux doit être modifiée pour correspondre aux deux autres fichiers.

Le deuxième morceau introduit une nouvelle information. Le fichier old.txt comporte une quatrième ligne. Les '1:3a' et '3:3a' nous indiquent que dans les fichiers un et trois, une nouvelle ligne doit être ajoutée après la troisième ligne, pour faire correspondre le fichier deux. La ligne est affichée en dessous d'eux.

L'autre chose que diff3 peut afficher, ce sont des séquences de lignes contenant des différences.

Faisons en sorte que mine.txt et Old.txt soient identiques, avec ce contenu.

Line 1
Line 2
Line 3

Nous allons modifier deux lignes dans votre fichier.txt

Line 1
Yours Line 2
Yours Line 3

Nous exécuterons la même commande.

diff3 mine.txt older.txt yours.txt

Cette fois, les indicateurs de ligne n’utilisent pas un seul numéro de ligne. Ils comportent deux numéros de ligne séparés par une virgule ',' pour représenter une plage de lignes. Par exemple, « 1:2,3c » nous indique que dans le fichier 1, les lignes deux à trois présentent des différences.

Fusionner avec diff3

Au lieu de demander à diff3 de lister les différences, nous pouvons demander à diff3 de fusionner le contenu et les différences des fichiers en un seul fichier. Ce qu'il fait en réalité, c'est regrouper les différences entre le fichier trois et le fichier deux, dans le fichier numéro un.

Si vous avez de la chance, vos fichiers fusionneront sans conflit. Parfois, des modifications surviennent au même endroit dans les fichiers, provoquant des conflits. Les conflits sont mis en évidence afin que vous puissiez choisir les ensembles de lignes que vous souhaitez conserver.

La sortie est écrite dans la fenêtre du terminal, mais vous pouvez facilement la rediriger vers un fichier, puis modifier le fichier pour le consulter.

Voici un cas simple. Voici le contenu de mine.txt.

We're going to
run diff3
against these files.
Yipee!

C’est ce qu’il y a dans le fichier old.txt.

We're going to
run diff3
against these files.

Le fichier yours.txt contient ceci.

We're going to
run the diff3 command
against these files.

Nous utiliserons notre commande familière pour effectuer une comparaison, puis nous l'exécuterons à nouveau avec l'option -m (fusion) pour effectuer la fusion.

diff3 mine.txt older.txt yours.txt
diff3 -m mine.txt older.txt yours.txt

Cela mélange les différences entre old.txt et yours.txt dans mine.txt, créant ainsi une nouvelle quatrième version. Pour capturer cette sortie, ajoutez une redirection à la commande.

diff3 -m mine.txt older.txt yours.txt > fourth.txt

Malheureusement, il est rare que vos fusions soient aussi fluides. Voici un exemple plus compliqué. Les mêmes lignes sont modifiées dans plusieurs fichiers.

Voici notre nouveau mine.txt

chaffinch
swallow
pigeon
sparrow
nuthatch

Ceci est notre nouveau fichier old.txt

chaffinch
swallow
pigeon
dove
nuthatch

Enfin, notre nouveau yours.txt.

chaffinch
cuckoo
rook
dove
nuthatch
woodpecker
goldfinch

Ce sont les résultats d’un diff.

diff3 mine.txt older.txt yours.txt

Il y a des modifications dans les trois fichiers et des lignes supplémentaires dans un fichier. Nous allons effectuer une fusion et rediriger la sortie vers un nouveau fichier.

diff3 -m mine.txt older.txt yours.txt > new-file.txt

À l’aide de votre éditeur préféré, ouvrez le fichier.

gedit new-file.txt

La section entre les deux délimiteurs «<<<<<<<» et «>>>>>>>» est un conflit.

Les lignes en conflit de chaque fichier sont affichées tour à tour. Les lignes du fichier un sont entre '<<<<<<<' et '|||||||', les lignes du fichier deux sont entre '|||||||' et '===== ==', et les lignes du fichier trois sont entre '=======' et '>>>>>>>.'

Sur un fichier réel, vous aurez probablement plusieurs zones de conflit à examiner et à modifier, pour qu'elles contiennent le texte de la section que vous souhaitez conserver.

Différences et conflits

Il est facile d'oublier les modifications que vous avez apportées aux différentes versions d'un fichier. La commande diff3 permet de trouver facilement ces différences. Il y a plus d'interaction humaine nécessaire pour la fusion que pour la différence, mais au moins diff3 rend difficile de rater un conflit.

Articles connexes: