Edito muchos archivos de texto. A veces es código. Otras veces es la palabra escrita para juegos de rol (RPG), libros de programación o correspondencia general. A veces es bueno hacer un cambio, pero que mi colaborador compare mi cambio con lo que había escrito originalmente. Muchas personas utilizan de forma predeterminada las suites ofimáticas, como LibreOffice, utilizando comentarios o funciones de seguimiento de cambios. Sin embargo, a veces una herramienta más simple tiene más sentido, y para eso, puede consultar el historial de programación para herramientas como diff
y patch
, que proporcionan un formato estandarizado para realizar un seguimiento y aplicar cambios a los archivos compartidos.
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Incluso con un archivo simple, hay complejidad en la sincronización de dos documentos. Algunos elementos se modifican, otros se dejan solos, se agrega contenido nuevo y algunos permanecen igual pero se mueven a diferentes lugares en el documento. Es difícil replicar cambios sin aceptar felizmente que todos los cambios son igualmente válidos y reemplazar el archivo antiguo por el nuevo. También es monolíticamente opaco. Hay tantos cambios que es difícil identificar exactamente qué ha cambiado.
Con la diff
comando, puede crear un registro de cómo ha cambiado el archivo, y con patch
puede "reproducir" esos cambios sobre la versión anterior para actualizarla con la nueva versión.
Configuración
Suponga que usted y yo estamos colaborando en un archivo que describe cómo hacer una taza de té.
Hasta ahora, el archivo tea.md
contiene copiar y pegar sin formato:
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.
Parece razonable, pero siempre hay optimizaciones que puedes hacer, así que me envías el archivo para mejorarlo. En un esfuerzo por aclarar el proceso de elaboración del té, copio el archivo como tea-revision.md
y edítelo, terminando con esto:
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.
Como era de esperar, algunos artículos (Boil water
y Pour tea into cup
) no cambian, mientras que otras líneas (Warm the teapot
) han tenido adiciones. Algunas líneas son completamente nuevas y otras son iguales pero en un orden diferente.
Crear una diferencia
La diff
La herramienta muestra la diferencia entre dos archivos. Hay algunas formas diferentes de ver los resultados, pero creo que la más clara es --unified
(-u
para abreviar), que muestra qué líneas se agregaron o restaron. Una línea que cambia de alguna manera se trata como una línea que se restó y luego se agregó. Por defecto, diff
imprime su salida en el terminal.
Proporcione diff
con el archivo antiguo y luego con el nuevo archivo:
$ 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 signo más (+
) al comienzo de una línea indica algo que se agregó al archivo anterior. Un signo menos (-
) al comienzo de una línea indica una línea que se eliminó o cambió.
Crear un parche con diff
Un archivo de parche es solo la salida de diff --unified
comando colocado en un archivo. Puede hacer esto usando la redirección estándar de Bash:
$ diff -u tea.md tea-revised.md > tea.patch
El contenido del archivo es exactamente el mismo que el que se envió al terminal. Me gusta ver los archivos de parches en Emacs, que codifica con colores cada línea dependiendo de si se agrega o resta.
Aplicando cambios con parche
Una vez que tenga un archivo de parche, podría enviárselo para que lo revise y, opcionalmente, lo aplique a su archivo anterior. Aplicas un parche con el patch
comando:
$ patch tea.md tea.patch
Se agregaron líneas, se restaron líneas y, al final, terminas con un archivo idéntico a mi versión:
$ 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.
No hay límite en la cantidad de veces que puede parchear un archivo. Podría repetir mis cambios, generar un nuevo parche y enviármelo para que lo revise. El envío de cambios en lugar de resultados permite a cada colaborador revisar qué cambió, decidir qué desea mantener o eliminar y documentar con precisión el proceso.
Instalar
En Linux y macOS, ya tiene ambos diff
y patch
comandos En Windows, puede obtener diff
y patch
a través de Cygwin, o use Chocolatey para buscar difutils y parches.
Si alguna vez ha intentado colaborar en archivos por correo electrónico o chat, y se ha encontrado tratando de describir donde necesites hacer un cambio, entonces te encantará diff
y patch
. Un archivo cuidadosamente estructurado, como un código o Markdown delimitado por líneas, es fácil de diferenciar, parchear y mantener.