Материал предоставлен http://it.rfet.ru

Хранение объектов

Прежде чем перейти к операциям внесения изменений, Вы должны понять, как Git хранит объекты. Эти знания позволят Вам извлечь максимальную эффективность от управления версиями с помощью Git.

Схема хранения

Главное отличие Git от любых других VCS (например, Subversion и ей подобных) заключается в понятии о данных: как правило они хранят информацию как наборы изменений файлов — «changesets». Эти системы относятся к хранимым данным как к набору файлов и изменениям в каждом из них во времени.

Схема хранения «changeset storage».

Git вместо этого считает хранимые данные набором слепков небольшой файловой системы — «snapshots». Каждый раз, когда Вы создаете ревизию, Git сохраняет слепок того, как выгядят все файлы проекта на текущий момент. Ради эффективности, если файл не менялся, Git не сохраняет файл снова, а делает ссылку на ранее сохранённый файл.

Схема хранения «snapshot storage».

Целостность данных

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

Git использует хэш-алгоритм SHA-1 для вычисления контрольных сумм. Это шестнадцатиричное число длиной в 40 знаков, оно вычисляется на основе содержимого файла или структуры папки, хранимой Git.

089a26f2402c94b00c819f0ebae69f1547317a88

Пример хэша SHA-1.

Работая с Git, Вы будете постоянно встречать эти хэши, поскольку они широко используются. Фактически, в своей базе данных Git сохраняет всё не по именам файлов, а по хэшам их содержимого.

Большинство команд Git также может принимать эти хэши в качестве указателей на ревизии. Как Вы узнаете в дальнейшем, Git поддерживает гораздо более «гуманные» способы указания ревизий: тэги, ветви, относительные указатели и т.д.

О состояниях

Концепция о состояниях объектов очень важна для изучения Git. Все файлы Git-репозитория находятся в одном из следующих состояний:

  • зафиксированные (committed) — файлы, сохраненные в локальной базе данных Git в результате создания ревизии (как Вы помните из главы «Подготовка к работе», в Git принято называть эти файлы объектами);
  • измененные (changed) — файлы, измененные с момента последнего создания ревизии;
  • актуальные (unchanged) — соответственно, файлы, не измененные с момента последнего создания ревизии;
  • подготовленные (staged) — измененные файлы, отмеченные для включения в следующую ревизию;
  • неотслеживаемые (untracked) — файлы, о которых Git еще «не знает» (т.е. файлы, не добавленные под контроль версий Git).

Таким образом, Git-репозиторий состоит из следующих логических частей:

  • служебная папка .git — это хранилище метаинформации и объектов, здесь хранятся зафиксированные объекты, ревизии, ветви и прочая служебная информация;
  • область подготовленных файлов (staging area или index в более ранних версиях Git) — это файл, также расположенный внутри .git, содержащий информацию об изменениях, которые необходимо включить в ревизию при следующем её создании;
  • рабочее дерево (working tree) или рабочая папка (working directory) — это актуальные, измененные и неотслеживаемые файлы и папки репозитория; именно с ними Вы производите основную работу: создание, редактирование и удаление.

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

Клонирование репозиторияВнесение изменений