Ключевые концепции
Тема дорожной карты · Изучи Git
Git представляет проект как последовательность неизменяемых снапшотов, а не как серию изменений. В повседневной работе Git важно понимать три ключевых компонента: рабочую директорию (файлы, которые вы редактируете), индекс (область подготовки изменений перед коммитом) и репозиторий (закреплённая история в директории .git/). Файлы перемещаются между этими областями с помощью команд git add (перемещение файлов из рабочей директории в индекс) и git commit (перемещение изменений из индекса в репозиторий). Каждый коммит ссылается на дерево файловых блобов и на одного или нескольких родителей, что и формирует направленное ациклическое дерево (DAG) — всю историю проекта. Понимание этих концепций поможет вам разобраться в большинстве неожиданных поведений Git.
Как это работает
Ключевые концепции Git основываются на объектной модели, где содержимое файла хранится как blob, структура директории — как tree, а снапшоты — как commit. Объект commit ссылается на объект tree, родительские коммиты, а также содержит информацию об авторе, коммиттере и сообщении. Refs — такие как refs/heads/main, refs/tags/v1.0 и HEAD — это просто файлы, указывающие на коммиты по их SHA-1 хэшам. Любые операции Git не изменяют историю напрямую, а создают новые коммиты, что позволяет сохранить целостность истории. Процесс сборки мусора (garbage collection, GC) в конце концов удаляет неиспользуемые объекты, которые больше не имеют ссылок.
Когда применять
Понимание объектной модели особенно полезно, когда вы сталкиваетесь с вопросом "что только что случилось с моей историей?". Для анализа содержимого объекта можно использовать команду git cat-file -p <sha>. Команда git reflog позволяет найти "потерянные" коммиты; на практике, коммиты редко исчезают в течение 30 дней. Также важно различать типы коммитов: fast-forward, merge-коммиты и rebase — различие между ними заключается в структуре графа истории.
Типичные ошибки
При работе с ключевыми концепциями Git часто встречаются типичные ошибки. Например, ошибочное представление коммитов как "diff" вместо снапшота; паническое удаление директории .git при возникновении проблем, что приводит к утрате локальных коммитов, которые можно было бы восстановить; и ошибочное предположение о вероятности коллизий SHA-1, что теоретически возможно, но на практике практически невозможно из-за сложности алгоритма.