
Как работает Git внутри: что происходит при commit, push и merge
Git — это не просто система контроля версий, а сложный механизм управления снимками состояния проекта. Разберём, что происходит под капотом при commit, push и merge.
Что делает Git на самом деле?
Многие разработчики используют Git каждый день, не задумываясь, как он работает изнутри. На первый взгляд кажется, что Git просто сохраняет изменения в коде, но на самом деле он хранит целую историю снимков (snapshots) проекта. Каждое состояние файлов фиксируется в виде уникального набора данных, связанного с предыдущим. Благодаря этому Git позволяет моментально перемещаться между версиями, сливать изменения и работать над кодом параллельно в разных ветках.
Как устроен commit?
Когда вы выполняете git commit, Git создаёт новый объект в своей внутренней базе данных — так называемом репозитории. Этот объект содержит ссылки на все зафиксированные файлы и указывает на предыдущий коммит. Файлы хранятся не как полные копии, а как блобы (binary large objects), идентифицируемые по их хешу SHA-1. Таким образом, Git не хранит каждый файл заново, а лишь ссылки на уже существующие объекты, что делает хранение невероятно эффективным.
Кроме того, каждый коммит содержит метаданные — имя автора, дату, сообщение и ссылку на родительский коммит. Вместе они образуют граф версий (DAG — Directed Acyclic Graph), в котором можно легко отследить, как развивался проект.

Что происходит при push?
Команда git push синхронизирует локальный репозиторий с удалённым. Git сравнивает, какие коммиты уже есть на сервере, а каких нет, и отправляет только недостающие объекты. Каждый коммит, ветка и тег — это всего лишь указатель (reference) на определённый снимок. Когда вы делаете push, Git обновляет эти указатели на стороне сервера, чтобы отражать актуальное состояние вашей локальной ветки.
Важно понимать, что Git не отправляет «разницу» в коде в привычном смысле. Он передаёт сами объекты коммитов и блобы, из которых можно воссоздать нужное состояние репозитория. Именно поэтому push может быть быстрым и надёжным даже при работе с большими проектами.
Как работает merge?
Команда git merge объединяет две ветки, анализируя их общий предок. Git берёт три версии файлов: из базового коммита (предка), из вашей текущей ветки и из ветки, которую вы хотите влить. Затем он автоматически сравнивает различия и пытается объединить их. Если изменения не пересекаются, Git создаёт новый коммит слияния (merge commit), который объединяет обе истории. Если же изменения затронули одну и ту же часть файла, появляется конфликт, который нужно разрешить вручную.
С технической точки зрения, merge — это просто создание нового снимка проекта, который ссылается сразу на два родительских коммита. Git не теряет историю изменений, а добавляет новую ветвь развития, сохраняя полный контекст.
Визуально: как выглядит процесс
# Создаём ветку и коммитим изменения git checkout -b feature echo «New feature» > feature.txt git add feature.txt git commit -m «Add new feature» # Слияние с основной веткой git checkout main git merge feature
После слияния в истории появится новый коммит, у которого два родителя — основной и ветка feature. Git продолжает хранить все предыдущие состояния, так что можно вернуться к любому из них.
Почему Git так эффективен
Git не хранит файлы в виде версий, а использует модель снимков. Это значит, что при каждом commit сохраняется полное состояние проекта, но с переиспользованием уже существующих объектов. Такой подход делает операции вроде checkout и revert практически мгновенными. Кроме того, использование хешей SHA-1 гарантирует целостность данных: любое изменение файла приводит к новому хешу, и Git мгновенно замечает расхождения.


























