J'édite beaucoup de fichiers texte. Parfois, c'est du code. D'autres fois, c'est le mot écrit pour les jeux de rôle (RPG), les livres de programmation ou la correspondance générale. Parfois, c'est bien de faire un changement, mais pour mon collaborateur de comparer mon changement avec ce qu'il avait écrit à l'origine. De nombreuses personnes utilisent par défaut des suites bureautiques, comme LibreOffice, en utilisant des commentaires ou des fonctionnalités de suivi des modifications. Parfois, un outil plus simple a plus de sens, et pour cela, vous pouvez consulter l'historique de programmation pour des outils tels que diff
et patch
, qui fournissent une mise en forme standardisée pour le suivi et l'application des modifications aux fichiers partagés.
Plus de ressources Linux
- Aide-mémoire des commandes Linux
- Aide-mémoire des commandes Linux avancées
- Cours en ligne gratuit :Présentation technique de RHEL
- Aide-mémoire sur le réseau Linux
- Aide-mémoire SELinux
- Aide-mémoire sur les commandes courantes de Linux
- Que sont les conteneurs Linux ?
- Nos derniers articles Linux
Même avec un simple fichier, il est complexe de synchroniser deux documents. Certains éléments sont modifiés, d'autres sont laissés seuls, du nouveau contenu est ajouté et certains restent les mêmes mais sont déplacés à différents endroits du document. Il est difficile de répliquer les modifications sans accepter avec béatitude que toutes les modifications soient également valides et de remplacer l'ancien fichier par le nouveau. Il est également monolithiquement opaque. Il y a tellement de changements qu'il est difficile de déterminer exactement ce qui a changé.
Avec le diff
commande, vous pouvez créer un enregistrement de la façon dont le fichier a changé, et avec patch
vous pouvez "rejouer" ces modifications sur l'ancienne version pour la mettre à jour avec la nouvelle version.
Configuration
Supposons que vous et moi collaborions sur un fichier décrivant comment préparer une tasse de thé.
Jusqu'à présent, le fichier tea.md
contient un copier-coller brut :
Boil water.
Warm the teapot.
Add tea and water to the teapot.
Place a tea cosy over the teapot.
Steep for 6 minutes.
Pour tea into cup.
Add milk.
Cela semble raisonnable, mais il y a toujours des optimisations que vous pouvez faire, alors vous m'envoyez le fichier pour amélioration. Dans un effort pour clarifier le processus de fabrication du thé, je copie le fichier sous tea-revision.md
et éditez-le, vous obtenez ceci :
Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.
Comme prévu, certains éléments (Boil water
et Pour tea into cup
) sont inchangées, tandis que les autres lignes (Warm the teapot
) ont eu des ajouts. Certaines lignes sont complètement nouvelles, et certaines lignes sont identiques mais dans un ordre différent.
Créer une différence
Le diff
outil affiche la différence entre deux fichiers. Il existe plusieurs façons d'afficher les résultats, mais je pense que la plus claire est le --unified
(-u
pour faire court), qui montre quelles lignes ont été ajoutées ou soustraites. Une ligne modifiée de quelque manière que ce soit est traitée comme une ligne qui a été soustraite puis ajoutée. Par défaut, diff
imprime sa sortie sur le terminal.
Indiquez diff
avec l'ancien fichier puis le nouveau fichier :
$ diff --unified tea.md tea-revised.md
--- tea.md 2021-11-13 10:26:25.082110219 +1300
+++ tea-revised.md 2021-11-13 10:26:32.049110664 +1300
@@ -1,7 +1,7 @@
+Warm a teapot in the proving drawer of your oven.
Boil water.
-Warm the teapot.
-Add tea and water to the teapot.
-Place a tea cosy over the teapot.
-Steep for 6 minutes.
+Add tea leaves to a tea strainer.
+Add strainer and water to teapot.
+Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
-Add milk.
+Optionally, add warm milk.
Un signe plus (+
) au début d'une ligne indique quelque chose qui a été ajouté à l'ancien fichier. Un signe moins (-
) au début d'une ligne indique une ligne qui a été supprimée ou modifiée.
Créer un patch avec diff
Un fichier de correctif n'est que la sortie du diff --unified
commande placée dans un fichier. Vous pouvez le faire en utilisant la redirection Bash standard :
$ diff -u tea.md tea-revised.md > tea.patch
Le contenu du fichier est exactement le même que celui qui a été envoyé au terminal. J'aime voir les fichiers de correctifs dans Emacs, qui attribue un code couleur à chaque ligne selon qu'elle a été ajoutée ou soustraite.
Appliquer les modifications avec le correctif
Une fois que j'ai un fichier de correctif, je peux vous l'envoyer pour que vous le révisiez et, éventuellement, que vous l'appliquiez à votre ancien fichier. Vous appliquez un patch avec le patch
commande :
$ patch tea.md tea.patch
Des lignes se sont ajoutées, des lignes se sont soustraites, et au final, vous vous retrouvez avec un fichier identique à ma version :
$ cat tea.md
Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.
Il n'y a pas de limite au nombre de fois que vous pouvez patcher un fichier. Vous pouvez itérer sur mes modifications, générer un nouveau correctif et me l'envoyer pour examen. L'envoi de modifications plutôt que de résultats permet à chaque contributeur d'examiner ce qui a changé, de décider ce qu'il souhaite conserver ou éliminer et de documenter avec précision le processus.
Installer
Sous Linux et macOS, vous avez déjà à la fois le diff
et patch
commandes. Sous Windows, vous pouvez obtenir diff
et patch
via Cygwin, ou utilisez Chocolatey pour rechercher des diffutils et des correctifs.
Si vous avez déjà essayé de collaborer sur des fichiers par e-mail ou chat, et que vous vous êtes retrouvé à essayer de décrire où vous avez besoin d'un changement, alors vous allez adorer diff
et patch
. Un fichier soigneusement structuré, tel qu'un code ou un Markdown délimité par des lignes, est facile à différencier, à corriger et à entretenir.