Предыдущий ролик Следующий ролик  

Видео урок: Использование хеш значений (SHA-1)

Git: обучение основам

В этом ролике мы поговорим о том, как Git ссылается на свои коммиты. Помните, в последнем ролике мы рассмотрели рабочий процесс, у нас были различные изменения, которые мы переместили из рабочей директории в буфер, а затем в репозиторий. И я дал эти изменениям очень простые маркеры A, B и C. Но Git их называет не так, и в данном ролике мы поговорим о том, как Git ссылается на каждый из этих слепков изменений. Будьте осторожны, не подумайте ошибочно, что A, B и C всегда ссылаются на единственный файл. Это в нашем примере мы использовали один файл, но это наборы изменений, и зачастую они будут ссылаться на несколько файлов.

Например, в обычном рабочем процессе Git A будет представлять изменения в пяти файлах, B будет представлять изменения, которые были сделаны в трех файлах, C может представлять два новых файла, которые были добавлены в репозиторий. Итак, A, B и C являются слепками изменений, которые были сделаны, и не имеют ничего общего с файлами или версиями файлов. Теперь давайте посмотрим, как Git ссылается на эти файлы. Когда мы отправляем изменения в репозиторий, в этот момент Git генерирует контрольную сумму для каждого набора изменений. Контрольная сумма - это число, которое генерируется путем принятия неких данных и отправке их алгоритму, таким образом алгоритм контрольной суммы конвертирует данные в число, и мы называем это число контрольной суммой.

Одни и те же данные, отправленные алгоритму, всегда равны одной и той же итоговой контрольной сумме, это важно, потому что если мы меняем принимаемые данные, на выходе у нас получится другая контрольная сумма. Таким образом, контрольная сумма наиболее часто используется для гарантии того, что данные не изменились, если же данные изменились, то контрольная сумма будет другой. И такая интеграция данных очень плотно встроена в Git, что сильно отличает его от других систем контроля версий, ведь они не используют контрольные суммы для проверки, что данные не изменились. Git же гарантирует, что вы не можете изменить того, что находится в коммите, или иначе вы поменяете контрольную сумму. Изменение данных меняет контрольную сумму.

Способ, которым Git генерирует эту контрольную сумму, заключается в использовании хеш алгоритма SHA-1. Вам совершенно не нужно ничего знать об этом алгоритме, но вам стоит знать, что он так называется, потому что вы часто будете слышать, как другие ссылаются на контрольную сумму или хеш, которые являются значениями SHA или S-H-A. Число, которое генерирует алгоритм, всегда будет шестнадцатеричной строкой в 40 символов. Шестнадцатиричная обозначает, что в ней могут быть цифры от 0 до 9 и буквы от a до f. Например, она может выглядеть вот так 5c15e8bd540 и так далее, 40 символов в длину, состоящую из данных цифр и букв.

И вот что делает Git, он берет весь набор изменений, пропускает их через алгоритм и в итоге получает этот номер из 40 символов, который мы видели ранее. Если мы наберем команду git log, то это будет ID, который используется для отслеживания всех наших коммитов, все верно, это SHA, S-H-A значение, или ID коммита, вы можете называть это и так, и так. И данный номер будет уникальным для изменений, которые находятся в этом коммите. И вот как он прикрепляет информацию: вот у нас есть три слепка наборов изменений, они отправляются в алгоритм, на выходе получается значение S-H-A, а затем Git присоединяет немного мета информации к каждому из этих слепков, вверху идет номер коммита, в нем есть родительский коммит, то есть коммит, который шел до этого, автор коммита, а затем сообщение коммита.

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