Системы контроля версий (СКВ) часто встроены в инструменты, привычные даже далеким от программирования людям. Именно с них мы и начнем свое знакомство, а заодно погрузимся в соответствующую терминологию.

Сервисы синхронизации файлов между устройствами, такие как Dropbox, используются практически всеми. И все они отслеживают версии файлов, с которыми работают. Происходит это так: периодически программа синхронизирует локальные файлы с теми, которые находятся в хранилище сервиса. Если локальный файл отличается, и время его изменения – позже файла, находящегося на сервере, то файл на сервере становится частью истории изменений, а текущим становится последний измененный файл.

Dropbox Version History

На картинке выше текущая версия файла обозначена как current. Все остальное – это предыдущие версии текущего файла. Как видно, Dropbox позволяет восстановить любую версию файла.

Обратите внимание на эту фразу:

Dropbox keeps a snapshot every time you save a file. (Дропбокс сохраняет снепшот каждый раз, когда вы сохраняете файл)

Снепшот – очень важное понятие, которое будет встречаться нам в будущем. Хотя оно и переводится как «моментальный снимок», в русскоязычном сообществе программистов принято говорить именно «снепшот».

В данном случае, снепшот – это сам файл после изменения. И чтобы лучше понять этот термин, посмотрим на альтернативу. Альтернативой снепшоту являются дифы. Представьте, что вместо сохранения новой версии файла Dropbox бы вычислял разницу между новым и старым файлом (а это не сложно сделать для текстовых файлов) и сохранял только ее. Зачем так делать, спросите вы. Такой подход позволяет экономить место на диске, хотя и вносит дополнительную сложность при работе с файлами.

В дальнейшем мы увидим, что разные инструменты используют разные подходы: некоторые работают с дифами, некоторые со снепшотами. Кстати, термин снепшот часто применяют к дискам. Например, можно сделать снепшот диска и потом восстанавливаться с этой точки (прямо как в играх).

Другим хорошим примером использования контроля версий являются текстовые редакторы, в первую очередь, онлайновые

Google Docs

Гугл документы автоматически делают снепшоты после каждого автосохранения (примерно раз в 5 секунд). Если документ за это время не изменился, то, естественно, новая версия не появляется. Множество таких версий образуют историю изменений.

На картинке выше история версий называется "Revision history". Ревизия - базовое понятие систем контроля версий. Любое зафиксированное изменение в системе контроля версий называется ревизией.

Обратите внимание на то, что ревизия и снепшот – это не одно и тоже. Фиксация изменений порождает ревизию, но сама ревизия может содержать внутри себя либо диф изменений, либо снепшот.

Кстати процесс переключения между ревизиями также имеет свое название. Когда мы загружаем конкретную ревизию, то говорят, что мы делаем чекаут (checkout).

Microsoft Word Diff

Между ревизиями можно вычислять разницу (говорят, диф) в случае, если СКВ использует снепшоты, что демонстрирует нам Microsoft Word на картинке выше. Эту функциональность невозможно переоценить, посмотреть "а что же изменилось" требуется постоянно не только при работе с кодом. Приведу пример из собственной практики. Согласование разных юридических документов (договоров) происходит сквозь череду правок. После того, как юристы поправили договор, хочется увидеть, а что же там изменилось.

Более того, в линуксах встроена команда diff, с помощью которой можно вычислять разницу между любыми файлами даже без использования СКВ. Эту разницу можно сохранить в файл, а затем, используя программу patch, наложить на исходный файл.

$ diff index.js index2.js > index.patch

1c1
< const a = 5;
---
> const a = 8;
3a4
> console.log(a - b);

$ patch index.js -i index.patch -o index2.js

В программах, разобранных выше, создание ревизии привязано к автосохранению, но это не единственная стратегия. Всего используется три способа:

  • Сохранение
  • Автосохранение
  • По кнопке (команде)

Последнее используется уже при работе с кодом, о чем мы поговорим в будущих уроках.

Самостоятельная работа

  • Попробуйте создать Google Document и сделать несколько изменений. Откройте вкладку с историей и переключитесь на прошлые ревизии.