Совместная работа над файлом с помощью различий и исправлений Linux.
Если вы когда-либо пытались совместно работать над файлами по электронной почте или в чате и пытались описать, где вам нужно внести изменения, то вам понравятся diff и patch.
Я редактирую много текстовых файлов. Иногда это код. В других случаях это письменные обозначения ролевых игр (РПГ), книг по программированию или обычной переписки. Иногда приятно внести изменения, но чтобы мой соавтор сравнил мои изменения с тем, что они изначально написали. Многие люди по умолчанию используют офисные пакеты, такие как LibreOffice, используя комментарии или функции отслеживания изменений. Однако иногда более простой инструмент имеет больше смысла, и для этого вы можете просмотреть историю программирования таких инструментов, как diff
и patch
, которые обеспечивают стандартизированное форматирование для отслеживания и применения изменений. к общим файлам.
Даже при использовании простого файла существует сложность синхронизации двух документов. Некоторые элементы изменяются, другие остаются в покое, добавляется новое содержимое, а некоторые остаются прежними, но перемещаются в разные места документа. Трудно воспроизвести изменения без блаженного признания того, что все изменения одинаково действительны, и без замены старого файла новым. Он также монолитно непрозрачен. Изменений так много, что сложно выделить именно то, что изменилось.
С помощью команды diff
вы можете создать запись об изменении файла, а с помощью patch
вы можете "воспроизвести" эти изменения поверх старой версии, чтобы привести ее в соответствие с дата с новой версией.
Настраивать
Предположим, мы с вами работаем над файлом, описывающим, как заварить чашку чая.
На данный момент файл tea.md
содержит сырую копию:
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.
Это кажется разумным, но всегда можно провести оптимизацию, поэтому отправьте файл мне на доработку. Чтобы прояснить процесс приготовления чая, я копирую файл как tea-revision.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.
Как и ожидалось, некоторые элементы (Вскипятить воду
и Налить чай в чашку
) остались без изменений, а в другие строки (Подогреть чайник
) были внесены дополнения. Некоторые строки совершенно новые, а некоторые такие же, но в другом порядке.
Создать разницу
Инструмент diff
выводит разницу между двумя файлами. Есть несколько разных способов просмотра результатов, но я думаю, что самый понятный из них – представление --unified
(для краткости -u
), которое показывает, какие строки были добавлены. или вычитается. Строка, которая каким-либо образом изменилась, рассматривается как строка, которая была вычтена, а затем добавлена. По умолчанию diff
выводит результаты на терминал.
Укажите diff
старый файл, а затем новый файл:
$ 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.
Знак плюса (+
) в начале строки указывает на то, что что-то было добавлено в старый файл. Знак минус (-
) в начале строки указывает на то, что строка была удалена или изменена.
Создать патч с diff
Файл исправления — это результат выполнения команды diff --unified
, помещенной в файл. Вы можете сделать это, используя стандартное перенаправление Bash:
$ diff -u tea.md tea-revised.md > tea.patch
Содержимое файла точно такое же, как и то, что было выведено на терминал. Мне нравится просматривать файлы исправлений в Emacs, где каждая строка имеет цветовую маркировку в зависимости от того, была ли она добавлена или удалена.
Сет Кенлон, CC BY-SA 4.0)
Применение изменений с помощью патча
Как только у меня будет файл исправления, я смогу отправить его вам на рассмотрение и, при необходимости, применить к вашему старому файлу. Вы применяете патч с помощью команды patch
:
$ patch tea.md tea.patch
Строки добавлялись, строки вычитались, и в итоге у вас получился файл, идентичный моей версии:
$ 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.
Нет ограничений на то, сколько раз вы можете исправлять файл. Вы можете повторить мои изменения, создать новый патч и отправить его мне на проверку. Отправка изменений, а не результатов, позволяет каждому участнику просмотреть, что изменилось, решить, что он хочет сохранить, а что удалить, и точно документировать процесс.
Установить
В Linux и macOS уже есть команды diff
и patch
. В Windows вы можете получить diff
и patch
через Cygwin или использовать Chocolatey для поиска diffutils и патча.
Если вы когда-либо пытались совместно работать над файлами по электронной почте или в чате и пытались описать где вам нужно внести изменения, то вам понравится diff
и патч
. Тщательно структурированный файл, такой как код или Markdown с разделителями строк, легко различать, исправлять и поддерживать.