Информационные технологии (часть 2)

5. Основы GIT

Теоретические сведения

Терминология

Система контроля версий (СКВ, англ. Version Control System, VCS, переводится также как система управления версий) – система, позволяющая хранить все версии документов и переключаться между этими версиями. Современные СКВ позволяют также организовать совместную работу над документами, анализировать изменения в них, использовать части документов в различных проектах и другие полезные действия.

Репозиторий (Repository) – группа файлов и каталогов, относящихся к одному проекту, в рамках которого создается какой-либо документ или программа. Применительно к СКВ, репозиторием можно также назвать каталог, находящийся под контролем СКВ.

Рабочий каталог (Working directory) – это каталог, в котором находится текущая версия документов. С этой версией работает пользователь в текстовом редакторе и она обновляется при сохранении документа.

Индекс (Stage) – проиндексированная версия документов. Иногда используется дословный перевод английского термина – сцена. Эта версия проиндексирована в СКВ, но не зафиксирована в долговременном хранилище. Данную версию можно выгрузить в рабочий каталог (после того, как в нем произошли изменения), однако при повторном индексировании предыдущая индексированная версия пропадет.

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

В зависимости от этапа работы с документом, каждый файл в каталоге репозитория может находится в одном из следующих состояний:

  • Не отслеживаемый (Untracked) – файл, находящийся в каталоге репозитория, но не контролируемый системой контроля версий.
  • Проиндексированный (Staged) - файл, добавленный в систему контроля версий но не зафиксированный в коммите.
  • Не модифицированный (Unmodified) - файл, зафиксированный в коммите и не измененный после этого. Версии такого файла в рабочем каталоге, индексе и коммите совпадают.
  • Модифицированный (Modified) - файл, зафиксированный в коммите и измененный после этого. Версии такого файла в индексе и коммите совпадают, а версия в рабочем каталоге отличается от них.

Команды

Репозиторий создается в папке на компьютере. Для его создания нужно в этой папке дать команду

git init

В папке репозитория будет создана папка .git, в которой будут храниться все служебные файлы репозитория, индекс и коммиты. Хранение коммитов оптимизировано (хранятся только изменения между различными версиями).

Для просмотра основной информации о состоянии репозитория (прежде всего, о состоянии находящихся в каталоге репозитория файлов) можно использовать следующую команду:

git status

Команды для индексации, фиксации и обратных к ним действий схематично показаны на рисунке 1.

Рисунок 1 – Состояния документа

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

git add files

Вместо files может стоять имя файла или файлов. При указании нескольких файлов можно использовать маски файлов (file glob). Например, «*» добавить все файлы в каталоге, «src/*.c» добавить все файлы с расширением «c» из каталога «src».

Эту же команду следует использовать для переиндексации файлов после их изменений.

Если в команде на переиндексацию произошла ошибка (типичный пример – в нее попали лишние файлы), то ее можно отменить с помощью команды

git reset HEAD files

Строго говоря, эта команда восстанавливает предыдущий вариант проиндексированной версии документов из последнего коммита. По сути, это приводит к отмене последней индексации.

В случае неудачных изменений в рабочем каталоге можно вернуться к проиндексированной версии документов. Для этого используется команда

git checkout -- files

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

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

Зафиксировать проиндексированную версию можно с помощью команды

git commit

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

При создании коммита нужно явным образом указать для него сообщение от автора. Оно необходимо для отслеживания истории изменения документов и быстрого поиска коммитов. Если ввести команду без дополнительных параметров, то система git попросит ввести в терминале это сообщение. Более удобным вариантом является задание сообщения с помощью параметра m (message). Например:

git commit -m "First commit"

Для операции создания коммита не предусмотрена возможность ее отмены. Отмена коммита противоречит сути СКВ – фиксации всех изменений в документах.

Вместе с тем, существует возможность внести изменения (дополнения) в последний коммит. Для этого используется следующая команда:

git commit --amend

Она вносит изменения, которые произошли в индексе, в последний коммит, при этом оставляя в коммите автора, сообщение от автора и другую метаинформацию.

Для просмотра всех коммитов в репозитории используется команда

git log

По умолчанию эта команда выводит метаинформацию о каждом коммите.

Команда git log имеет много опций для настройки содержания и внешнего вида выводимой информации. Например ключ -p выводит информацию о файлах, в которых произошли изменения в коммите, ключи в виде дефиса и цифры задает количество выводимых коммитов. Ключ --pretty позволяет задать формат вывода информации и, в свою очередь, имеет большое количество опций. Например [4]:

git log --pretty=format:"%h %ad | %s%d [%an]" --date=short

Для просмотра полного списка опций нужно выполнить команду

git log --help

Задание к работе

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

  1. Создайте папку для репозитория СКВ, инициализируйте в ней репозиторий git.
  2. Создайте файл ФИО_СТУДЕНТА.md, в названии файла подставьте свое ФИО латинскими буквами, в тексте файла наберите свою группу и фамилию.
  3. Проиндексируйте этот файл.
  4. Добавьте в файл заголовок: «Отчет».
  5. Проиндексируйте этот файл.
  6. Зафиксируйте этот файл.
  7. Добавьте в файл произвольный текст после заголовка. Восстановите предыдущую версию файла из индекса.
  8. Добавьте в файл другой произвольный текст после заголовка. Проиндексируйте его. Отмените индексирование. Восстановите предыдущую версию файла из индекса.
  9. Добавьте в файл после заголовка название текущей лабораторной работы. Проиндексируйте его. Добавьте изменение в предыдущий коммит.
  10. Добавьте в файл еще один заголовок и текст к нему. Проиндексируйте и зафиксируйте файл. Просмотрите историю коммитов с различными опциями.