Прежде чем перейти к операциям внесения изменений, Вы должны понять, как Git хранит объекты. Эти знания позволят Вам извлечь максимальную эффективность от управления версиями с помощью Git.
Главное отличие Git от любых других VCS (например, Subversion и ей подобных) заключается в понятии о данных: как правило они хранят информацию как наборы изменений файлов — «changesets». Эти системы относятся к хранимым данным как к набору файлов и изменениям в каждом из них во времени.
Git вместо этого считает хранимые данные набором слепков небольшой файловой системы — «snapshots». Каждый раз, когда Вы создаете ревизию, Git сохраняет слепок того, как выгядят все файлы проекта на текущий момент. Ради эффективности, если файл не менялся, Git не сохраняет файл снова, а делает ссылку на ранее сохранённый файл.
Перед сохранением любого файла Git вычисляет контрольную сумму, и она становится индексом этого файла. Поэтому невозможно изменить содержимое файла или папки так, чтобы Git не узнал об этом. Эта функциональность встроена в сам фундамент Git и является важной составляющей его философии. Если информация потеряется при передаче или повредится на диске, Git всегда это выявит.
Git использует хэш-алгоритм SHA-1 для вычисления контрольных сумм. Это шестнадцатиричное число длиной в 40 знаков, оно вычисляется на основе содержимого файла или структуры папки, хранимой Git.
089a26f2402c94b00c819f0ebae69f1547317a88
Работая с Git, Вы будете постоянно встречать эти хэши, поскольку они широко используются. Фактически, в своей базе данных Git сохраняет всё не по именам файлов, а по хэшам их содержимого.
Большинство команд Git также может принимать эти хэши в качестве указателей на ревизии. Как Вы узнаете в дальнейшем, Git поддерживает гораздо более «гуманные» способы указания ревизий: тэги, ветви, относительные указатели и т.д.
Концепция о состояниях объектов очень важна для изучения Git. Все файлы Git-репозитория находятся в одном из следующих состояний:
Таким образом, Git-репозиторий состоит из следующих логических частей:
.git
— это хранилище метаинформации и объектов, здесь хранятся зафиксированные объекты, ревизии, ветви и прочая служебная информация;
.git
, содержащий информацию об изменениях, которые необходимо включить в ревизию при следующем её создании;
Следует отметить, что, технически, термин «репозиторий» относится именно к папке .git
, однако в менее строгих контекстах принято называть репозиторием папку, содержащую .git
и рабочее дерево.
Клонирование репозитория | Внесение изменений |