Системы контроля версий были придуманы для версионирования часто изменяемых файлов. Наибольшее применение они нашли в разработке программ. Представьте, что есть файл index.html. В течение нескольких лет его обновляют сотрудники компании. При помощи несложных манипуляций система контроля версий позволяет держать единственный экземпляр файла index.html, без всяких index1.html, index_new.html и т.д. Т.е помогает избежать бардака на рабочем месте. Можно безболезненно откатиться на раннюю версию index.html, просматривать историю изменений построчно, начать доработки с любой версии файла. Также за счет принципов, заложенных в работе системы, идет выигрыш по занимаемому месту на жестком диске. В реальных проектах под системой контроля версий находятся сотни и тысячи файлов с программными кодами, проводятся более сложные операции, к примеру: объединение наработок, откат изменений, отправка их на сервер в сети интернет (так можно вести разработку удаленным командам), либо наоборот запрос обновлений содержимого файла с сервера.
Применительно к работе вне IT-индустрии системы контроля версий имеют проблему. Один файл с кодом обычно имеет до нескольких тысяч строк кода, это максимум сотня-другая кб. При работе с любыми изображениями, аудио и видео единицы измерений сразу меняют порядок, переходя в мб. Т.е. эффективность снижается, как только мы начинаем работать с бинарными файлами, потому что они имеют большой размер, а также хуже сжимаются. Грубо говоря, положив в систему контроля версий картинку весом 10 мб и сделав пару изменений, мы никакого профита по занимаемому пространству не получим в сравнении с ведением дел а-ля «файл1.psd». Однако в середине 2010-х были придуманы определенные фишки, позволяющие преодолеть эти проблемы.
Есть несколько популярных систем контроля версий: Mercurial, SVN, CSV и Git. В этой статье я буду использовать Git с расширением LFS (Large File Storage). Для начала работы надо скачать Git for Windows с https://git-scm.com/downloads  - там выбрать 64-разрядную версию для Windows. Для Mac и Linux тоже все есть. При установке программы ничего не менять, жать везде далее. На компьютере программа займет до 250 мб. После окончания установки в меню «Пуск» появится папка «Git». В ней выбрать «Git GUI» для запуска графической версии программы (вариант «Git Bash» – консольная версия для любителей вбивать команды текстом). Откроется следующее окно

07611839fab054d1b779aba085c693b4.png

Жать «Create New Repository» для создания нового проекта, а в дальнейшем для работы с уже существующими проектами выбирать «Open Existing Repository». В следующем окне выбрать папку с файлами, которые необходимо положить в систему контроля версий

532775b65a153526e8cd2227f4af7459.png

Жать «Create». На экране появится основной интерфейс программы, а на жестком диске в проекте будет создана скрытая папка .git со служебными файлами.

31162fe8b2d75987f754b36def6ed590.png

Нужно сделать пару настроек после первого запуска программы. В «Edit – Options» найти по два поля «User Name» и «Email Address». Это глобальные и локальные имя пользователя и почтовый адрес. Можно ввести любую правдоподобную информацию, т.к. в настоящий момент для нас это лишь внутренняя настройка, формально нужная для обозначения инициатора при внесении изменений в системе. Жать «Save».

b341fa84c7d4c8db728c98eaa1ea615f.png

Для учебных целей Git LFS ставить не обязательно, можно проводить абсолютно все действия без расширения, только работа с изображениями получится неэффективной. Те, кто решили его поставить, делают это всего один раз после установки программы. В меню выбрать «Repository – Git Bash». В появившемся окне консоли ввести git lfs install и жать Enter

776bb313572810df5eb4e0f046427558.png

В консоли еще нужно указать расширение файлов, которые вы хотите контролировать. Делать это придется каждый раз при старте нового проекта или при желании отслеживать файлы иного формата, чем был задан ранее. В статье работа идет только с jpg. Поэтому вводим git lfs track "*.jpg", жать Enter

cabca7d6b7113168f4eac48711e09189.png

Добавим в папку картинку формата jpg. Как только файл будет перенесен, то в интерфейсе программы его имя появится в списке «Unstaged Changes» (обновление интерфейса программы как в браузере по F5). Чтобы зафиксировать текущее состояние файла в системе контроля версий, надо сделать два шага:

1) Первый шаг - перенести изменения файла из «Unstaged Changes» в «Staged Changes». Делается это с помощью пункта «Stage Changed Files To Commit» из меню «Commit».

f2ceca66963356d20037c7b2ac4ccafc.png

«Staged Changes» – это своего рода промежуточный этап, на котором записи состояния в систему пока не происходит. Он удобен, если вы планируете делать изменения в нескольких отслеживаемых файлах, а затем одним махом записать в систему контроля версий состояния всех измененных файлов. Другая ситуация – вы передумали записывать состояние одного файла и решили вернуть его в прошлый список («Unstaged Changes»). Если вы сделаете изменения в файле из списка «Staged Changes», то он автоматически переместится обратно в «Unstaged Changes».

2) Второй шаг – запись в систему контроля версий, еще этот шаг называют коммит. По правилам хорошего тона следует ввести комментарий к коммиту, чтобы в будущем было легче ориентироваться в изменениях. После завершения этого шага все, что перечислено в списке «Staged Changes», исчезнет оттуда и запишется в систему контроля версий. Если у вас были файлы в «Unstaged Changes», то для них изменений в системе не произойдет. Если же сложится ситуация, когда не будет файлов в списке «Staged Changes», а вы нажмете «Commit», то записывать в систему нечего. Вылезет такое предупреждение.

d7751963ccbc8647e5e06abbd8111651.png

Но т.к. у нас в «Staged Changes» есть новый файл, то все должно пройти как по маслу.

0c81008c7c5e2c07975a8273f819fa95.png

Надо нажать кнопку «Commit», второй шаг будет успешно завершен. Чтобы посмотреть, что сейчас произошло, можно открыть на панели меню «Repository – Visualize master’s History» (либо пукнт ниже «Visualize All Branch History»)

d2ef19255e1f8806b9ef4ad2c6708d12.png

Откроется структура проекта.

1996b2fe2c622dc3b389f6e904ad33ba.png

Пока событий мало. Желтый круг обозначает коммит в системе, на котором вы находитесь в текущий момент. Зеленым выделено название текущей ветки. По умолчанию при старте проекта всегда есть ветка master. В окнах ниже – дополнительная информация. Как бы вы сейчас ни редактировали, ни удаляли файл, всегда можно откатиться к сохраненному состоянию. Более того, вернуться сюда можно и после внесения добавления изменений в систему.

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

cd2a64d590d1a81afb8f2006a94b602e.png

Как помним, при любом редактировании файла он попадает в «Unstaged Changes». Выполняем два шага для записи изменений в систему контроля версий, смотрим структуру проекта.

8a8636dd17aabf5237b5b6bc96ea4ec9.png

На ветке master появился новый коммит, а желтый круг изменил положение. Осуществим еще пару изменений картинки, при каждом удобном случае делая коммит с пояснением.

53fb6d9e56fe40f7b1b32e89fbcd5391.png

Цепочка коммитов отображается в истории. Если их будет много, то в строке ниже целесообразно осуществлять поиск. А в папке у нас по-прежнему имеется один файл с исходным именем.

Представим, вы получили указание на смену тематики работы. Надо переделывать картинку, взяв за основу ее третью версию. Чтобы перейти на другое состояние файла, прямо в окне просмотра истории следует щелкнуть правой кнопкой мыши на коммите с описанием «third version of picture…», в появившемся меню будет пункт «Create new branch»

cf7789d557976a8ec37c0c017bf69b53.png

После выбора пункта меню появится окно, где требуется ввести имя для новой ветки коммитов: латиницей, без пробелов и спецсимволов. Жать «Create».

224f502920e24c13fba31d046c62b4b3.png

В результате будет создана отдельная ветка для коммитов в систему контроля версий. Они не будут затрагивать прошлую ветку master. Новая ветка (в примере названа royal_theme_branch) тоже подсвечена зеленым. Мы пока не переключились на эту ветку, о чем свидетельствует желтый круг, находящийся на master. Чтобы перейти на royal_theme_branch, надо нажать на этой ветке правой клавишей мыши и выбрать «Check out this branch».

efd4bf5dab837fa869f38cfa9e5d5c4b.png

Посмотрим, что произойдет со структурой проекта и самим изображением

af21d078bd8c270b5ed2af4cf623f3e6.png

Желтый круг в интерфейсе сменил расположение: это значит, что текущей веткой является royal_theme_branch. Изображение вернулось на третью версию. Делаем доработки для картинки. Вносим изменения в систему контроля версий.

9b528e0023d52a38d7f0422e52fbf096.png

На этом шаге я ошибочно указал не тот комментарий к коммиту, вместо «fourth verision…» написал «third version». Проблему легко устранить, т.к. для последнего совершенного коммита возможно изменить описание с помощью «Amend Last Commit» из пункта меню «Commit»

23901edf5e76999140b5faf9b6de08df.png

Я ввел правильное описание, теперь посмотрим на историю проекта

9af80f48bc998ff64d0501579e3f6d7d.png

Сейчас лучше видно древовидную структуру проекта, с двумя ветками. Выйдем из истории в основной интерфейс программы. Переключимся на последний коммит из master: для этого надо выбрать пункт меню «Branch – Checkout», в появившемся окне выделяем master и жмем «Checkout»

879470ea7b82f312d2cfcdf0d714a8a8.png

Мы сейчас находимся на этой версии картинки

2ed287699c848de5c089605ff647f6b3.png

Сделаем еще одну ветку от master, за точку отсчета взяв вторую версию. Вносим изменения, делаем коммит, смотрим историю.

d2f827d64d28cd188d5cdc68e19b9c10.png

Ветки уже три штуки. Можно переключаться на каждую, делать доработки и сопровождать их коммитами с описаниями. Ветку можно начать не только от master. Пусть, вы были на master, что-то натворили с файлом, нажали в редакторе картинок save и изменения никак не отменяются. Тогда надо просто откатиться обратно в системе на последнюю версию файла в master.

1cf9f53770b505eabc7c5431d2bb452c.png

В истории отмечено красным кругом, что есть те самые незакомиченные изменения, которые и хотелось бы убрать. В основном интерфейсе программы выбираем «Commit – Revert Changes»

8b6f339765f5f3a13309cfcef9074005.png

Все вернулось обратно

afd63359d0e792e9a805ca31996592a6.png

Для того, чтобы убрать версионирование файлов в проекте, просто удалите скрытую папку .git.

Про координацию работы в команде с использованием системы контроля версий. Если удаленно есть несколько человек, которые на своих компьютерах используют подобные системы, логично было бы создать место, чтобы централизованно хранить изменения, поступающие ото всех работников. Для этого созданы сервисы хостинга проектов (репозиториев) Bitbucket и GitHub. Для тренировки на GitHub можно создавать бесплатно публичные репозитории, правда они видны всем подряд в интернете (приватные репозитории платны). Для начала использования нужно пройти регистрацию, после чего настроить профиль, создать репозиторий.

e7b842c1e9415e3daf75ed157d89b0d9.png

d258e209bbc6c6dba9c4796fc44a0dbe.png

Если вы намерены это организовывать, то необходимо познакомить всех участников проекта с понятиями pull/push/fetch в системе git. Также нужно разобраться с правами, кто может комиттить в заданный репозиторий.

Ничего не мешает делать описанное выше, если команда работает не удаленно, а в одном офисе с наличием доступа в интернет. Но иногда есть смысл сделать аналог GitHub внутри организации, чтобы не зависеть от сторонних ресурсов. Тогда надо на выделенном железе развернуть git-сервер, т.е. локально будет система, схожая по функциональности с GitHub. Чаще всего решают ставить GitLab, он бесплатный; попроще варианты, но более сырые - gitea и gogs.

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

- Шпаргалка по работе с Git на русском: https://eax.me/git-commands/ 

- Памятки в графическом виде на английском (о принципе работы системы и основные команды): https://www.quora.com/What-is-the-best-Git-cheat-sheet 

- Небольшое справочное руководство по Git на русском: https://git-scm.com/book/ru/v2 

- Четыре видео на русском из цикла «Git - для новичков», каждое по 10 минут: https://www.youtube.com/playlist?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb 

- Двухминутное видео про Git LFS на английском: https://www.youtube.com/watch?v=uLR1RNqJ1Mw 

- Человек из Autodesk поясняет про «How to handle large files in Git» на английском (25 минут) https://www.youtube.com/watch?v=YQzNfb4IwEY 

- Если визуально не нравится интерфейс стандартного Git GUI, то альтернативные варианты (SourceTree, TortoiseGit и т.д.) здесь: https://git-scm.com/downloads/guis

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