Modifico molti file di testo. A volte è codice. Altre volte è la parola scritta per giochi di ruolo (RPG), libri di programmazione o corrispondenza generale. A volte è bello apportare una modifica, ma per il mio collaboratore confrontare la mia modifica con ciò che avevano originariamente scritto. Molte persone utilizzano le suite per ufficio, come LibreOffice, utilizzando i commenti o le funzionalità di rilevamento delle modifiche. A volte uno strumento più semplice ha più senso, tuttavia, e per questo, puoi guardare la cronologia di programmazione per strumenti come diff
e patch
, che forniscono una formattazione standardizzata per tenere traccia e applicare le modifiche ai file condivisi.
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Anche con un semplice file, la sincronizzazione di due documenti è complessa. Alcuni elementi vengono modificati, altri vengono lasciati soli, vengono aggiunti nuovi contenuti e alcuni rimangono gli stessi ma vengono spostati in posizioni diverse nel documento. È difficile replicare le modifiche senza accettare beatamente che tutte le modifiche siano ugualmente valide e sostituire il vecchio file con quello nuovo. È anche monoliticamente opaco. Ci sono così tante modifiche che è difficile individuare esattamente cosa è cambiato.
Con il diff
comando, puoi creare un record di come è cambiato il file e con patch
puoi "riprodurre" queste modifiche rispetto alla vecchia versione per aggiornarla con la nuova versione.
Configurazione
Supponiamo che io e te stiamo collaborando a un file che descrive come preparare una tazza di tè.
Finora, il file tea.md
contiene copia-incolla grezza:
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.
Sembra ragionevole, ma ci sono sempre ottimizzazioni che puoi apportare, quindi inviami il file per migliorarlo. Nel tentativo di chiarire il processo di preparazione del tè, copio il file come tea-revision.md
e modificalo, finendo con questo:
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.
Come previsto, alcuni articoli (Boil water
e Pour tea into cup
) sono invariate, mentre le altre righe (Warm the teapot
) hanno avuto aggiunte. Alcune righe sono completamente nuove e alcune righe sono le stesse ma in un ordine diverso.
Crea una differenza
Il diff
lo strumento mostra la differenza tra due file. Esistono diversi modi per visualizzare i risultati, ma penso che il più chiaro sia il --unified
(-u
in breve) vista, che mostra quali linee sono state aggiunte o sottratte. Una linea che è stata modificata in qualche modo viene trattata come una linea che è stata sottratta e quindi aggiunta. Per impostazione predefinita, diff
stampa il suo output sul terminale.
Fornisci diff
con il vecchio file e poi il nuovo file:
$ 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 segno più (+
) all'inizio di una riga indica qualcosa che è stato aggiunto al vecchio file. Un segno meno (-
) all'inizio di una riga indica una riga che è stata rimossa o modificata.
Crea una patch con differenze
Un file di patch è solo l'output di diff --unified
comando inserito in un file. Puoi farlo usando il reindirizzamento Bash standard:
$ diff -u tea.md tea-revised.md > tea.patch
Il contenuto del file è esattamente lo stesso di quello che è stato inviato al terminale. Mi piace visualizzare i file di patch in Emacs, che codifica a colori ogni riga a seconda che sia stata aggiunta o sottratta.
Applicazione delle modifiche con la patch
Una volta che avrò un file di patch, potrei inviartelo affinché tu possa esaminarlo e, facoltativamente, applicarlo al tuo vecchio file. Applichi una patch con la patch
comando:
$ patch tea.md tea.patch
Le righe sono state aggiunte, le righe sono state sottratte e alla fine si ottiene un file identico alla mia versione:
$ 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.
Non c'è limite al numero di patch che puoi applicare a un file. Potresti ripetere le mie modifiche, generare una nuova patch e inviarmela per la revisione. L'invio delle modifiche anziché dei risultati consente a ciascun collaboratore di rivedere ciò che è cambiato, decidere cosa desidera mantenere o eliminare e documentare accuratamente il processo.
Installa
Su Linux e macOS, hai già entrambi i diff
e patch
comandi. Su Windows, puoi ottenere diff
e patch
tramite Cygwin oppure utilizza Chocolatey per cercare diffutils e patch.
Se hai mai provato a collaborare su file tramite email o chat e ti sei ritrovato a provare a descrivere dove hai bisogno di una modifica, allora adorerai diff
e patch
. Un file strutturato con cura, come codice o Markdown delimitato da righe, è facile da differenziare, correggere e mantenere.