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
Задание к работе
После выполнения каждого пункта задания нужно выполнить команду для проверки состояния репозитория и проанализировать полученные результаты.
- Создайте папку для репозитория СКВ, инициализируйте в ней репозиторий git.
- Создайте файл
ФИО_СТУДЕНТА.md
, в названии файла подставьте свое ФИО латинскими буквами, в тексте файла наберите свою группу и фамилию. - Проиндексируйте этот файл.
- Добавьте в файл заголовок: «Отчет».
- Проиндексируйте этот файл.
- Зафиксируйте этот файл.
- Добавьте в файл произвольный текст после заголовка. Восстановите предыдущую версию файла из индекса.
- Добавьте в файл другой произвольный текст после заголовка. Проиндексируйте его. Отмените индексирование. Восстановите предыдущую версию файла из индекса.
- Добавьте в файл после заголовка название текущей лабораторной работы. Проиндексируйте его. Добавьте изменение в предыдущий коммит.
- Добавьте в файл еще один заголовок и текст к нему. Проиндексируйте и зафиксируйте файл. Просмотрите историю коммитов с различными опциями.