git clone https://github.com/PraktikumJava/git-hints.git
Хеширование (от англ. hash, «рубить», «крошить», «мешанина») — это способ преобразовать набор данных и получить их «отпечаток» (англ. fingerprint). Информация о коммите — это набор данных: когда был сделан коммит, содержимое файлов в репозитории на момент коммита и ссылка на предыдущий, или родительский (англ. parent), коммит. Git хеширует (преобразует) эту информацию с помощью алгоритма SHA-1 (от англ. Secure Hash Algorithm — «безопасный алгоритм хеширования») и получает для каждого коммита свой уникальный хеш — результат хеширования. В то время, как результат работы метода hashCode() — это целое число, результат хеширования в Git — символьная строка. Она относительно коротка (40 символов в случае SHA-1) и состоит из цифр 0—9 и латинских букв A—F(неважно, заглавных или строчных). Хеш обладает следующими важными свойствами:
- если хеш получить дважды для одного и того же набора входных данных, то результат будет гарантированно одинаковый;
- если хоть что-то в исходных данных поменяется (хотя бы один символ), то хеш тоже изменится (причём сильно).
После вызова git log
появляется список коммитов с их описанием.
- Строка из цифр и латинских букв после слова commit — это уже знакомый вам хеш коммита.
- Author — имя автора и его электронная почта.
- Date — дата и время создания коммита.
- Сообщение к коммиту.
Сокращённый лог вызывают командой git log
с флагом --oneline
(англ. «одной строкой»). При этом в терминале появятся только первые несколько символов хеша каждого коммита и комментарии к ним.
При вызове команды git log
вы также могли заметить надпись (HEAD -> master) после хеша одного из коммитов.
Файл HEAD
(англ. «голова», «головной») — один из служебных файлов папки .git
. Он указывает на коммит, который сделан последним (то есть на самый новый).
Убедитесь в этом с помощью терминала. Перейдите в папку .git
командой cd
. Посмотрите содержимое файла HEAD
командой cat
.
Внутри HEAD
— ссылка на служебный файл: refs/heads/master
(или refs/heads/main
в зависимости от названия ветки). Если заглянуть в этот файл, можно увидеть хеш последнего коммита.
Когда вы делаете коммит, Git обновляет refs/heads/master
— записывает в него хеш последнего коммита. Получается, что HEAD
тоже обновляется, так как ссылается на refs/heads/master
.
При работе с Git указатель HEAD
используется довольно часто. Мы уже упоминали, что многие команды Git принимают в качестве параметра хеш коммита. Если нужно передать последний коммит, то вместо его хеша можно просто написать слово HEAD
— Git поймёт, что вы имели в виду последний коммит.
Одна из ключевых задач Git — отслеживать изменения файлов в репозитории. Для этого каждый файл помечается каким-либо статусом. Рассмотрим основные.
untracked
(англ. «неотслеживаемый») Новые файлы в Git-репозитории помечаются какuntracked
, то есть неотслеживаемые. Git «видит», что такой файл существует, но не следит за изменениями в нём. У untracked-файла нет предыдущих версий, зафиксированных в коммитах или через командуgit add
.staged
(англ. «подготовленный») После выполнения командыgit add
файл попадает вstaging area
(от англ. stage — «сцена», «этап [процесса]» и area — «область»), то есть в список файлов, которые войдут в коммит. В этот момент файл находится в состоянииstaged
.tracked
(англ. «отслеживаемый») Состояниеtracked
— это противоположностьuntracked
. Оно довольно широкое по смыслу: в него попадают файлы, которые уже были зафиксированы с помощьюgit commit
, а также файлы, которые были добавлены в staging area командойgit add
. То есть все файлы, в которых Git так или иначе отслеживает изменения.modified
(англ. «изменённый») Состояниеmodified
значит, что Git сравнил содержимое файла с последней сохранённой версией и нашёл отличия. Например, файл был закоммичен и после этого изменён.
graph LR;
untracked -- "git add" --> staged
staged -- "git commit" --> tracked/committed
tracked/committed -- "изменения в файле" --> modified
modified -- "git add" --> staged
То, как написаны сообщения к коммитам, тоже может подчиняться определённым правилам. Иногда эти правила продиктованы культурой команды, а иногда техническими ограничениями. Например, в выводе команды git log --oneline умещается максимум 72 первых символа сообщения, поэтому многие правила включают пункт: «Сообщение не должно быть длиннее 72 символов». В этом уроке рассмотрим несколько популярных подходов к оформлению сообщений коммитов.
Во многих компаниях применяется Jira — система для организации проектов и задач. У каждой задачи в Jira есть идентификатор из нескольких заглавных латинских букв и номера. Например, LGS-239 значит, что это 239-я задача в проекте LGS (сокращение от англ. logistics — «логистика»). В корпоративном стиле в начале сообщения обычно указывают Jira-ID, а после — текст сообщения.
Стандарт Conventional Commits (англ. «соглашение о коммитах») отличается качественной документацией и подробной проработкой. Он подходит для репозиториев с исходным кодом программ. А вот использовать его для других типов проектов было бы неудобно. Conventional Commits предлагает такой формат коммита: : <сообщение>. Первая часть type — это тип изменений. Таких типов достаточно много. Вот два примера: feat (сокращение от англ. feature) — для новой функциональности; fix (от англ. «исправить», «устранить») — для исправленных ошибок.
GitHub можно использовать не только для хранения файлов проекта, но и для ведения списка задач (англ. issue) этого проекта. Если коммит «закрывает» или «решает» какую-то задачу, то в его сообщении удобно указывать ссылку на неё. Для этого в любом месте сообщения нужно указать #<номер задачи>. Например, вот так.
$ git commit -m "Исправить #334, добавить график температуры"