Ответ
Все три понятия являются ключевыми для управления историей изменений в Git, но служат разным целям.
Commit (Коммит) Это атомарная операция, которая фиксирует снимок (snapshot) состояния всех отслеживаемых файлов в репозитории на конкретный момент времени. Каждый коммит имеет:
- Уникальный идентификатор (хэш SHA-1, например,
a1b2c3d). - Ссылку на родительский коммит (или несколько, в случае слияния).
- Информацию об авторе и времени создания.
- Сообщение, описывающее сделанные изменения.
Branch (Ветка) Это подвижный указатель на один из коммитов. Ветка используется для ведения параллельной разработки, изоляции новых функций или исправлений.
- Когда вы создаете новый коммит, находясь в ветке, указатель этой ветки автоматически сдвигается на новый коммит.
- Основная ветка по умолчанию называется
mainилиmaster.
# Создать новую ветку и переключиться на нее
git checkout -b feature-x
Tag (Тег)
Это статичный (неподвижный) указатель на конкретный коммит. Теги чаще всего используются для маркировки релизов и важных точек в истории проекта (например, v1.0.0, v2.1.5).
- Легковесный тег: Просто именованная ссылка на коммит.
- Аннотированный тег: Полноценный объект в базе данных Git, содержащий имя автора, дату, сообщение и опционально GPG-подпись. Является рекомендуемым для релизов.
# Создать аннотированный тег
git tag -a v1.0.0 -m "Release version 1.0.0"
Ключевое отличие в виде аналогии:
- Коммиты — это страницы в книге вашей истории.
- Ветка — это закладка, которую вы перемещаете на новую страницу по мере чтения (разработки).
- Тег — это перманентная наклейка на особо важной странице (релизе), которая остается на месте.
Ответ 18+ 🔞
Давай разберём эту троицу, а то народ путается, как мартышки с гранатой. Всё просто, но пока не объяснишь — пиздец.
Коммит (Commit) — это, блядь, фотка. Моментальный снимок всего твоего проекта в конкретный момент. Сделал что-то, зафиксировал — бац, коммит. У него свой уникальный номер-хэш (типа a1b2c3d), родитель, автор и сообщение, где ты обычно пишешь хуйню вроде "фикс" или "всё работает, не трогать". Это атомарная единица истории, кирпичик. Без них — нихуя.
Ветка (Branch) — а вот это уже хитрая жопа. Это не набор файлов, нет! Это подвижный указатель, ярлык, который ты таскаешь по коммитам. Пока ты в ветке feature-bomba и делаешь коммиты, этот ярлык едет вперёд вместе с тобой. Создал для новой фичи — отъехал от основной линии, не мешая другим. Главная ветка — main или master, как кому нравится.
# Создаём ветку и сразу на неё перепрыгиваем
git checkout -b feature-x
Тег (Tag) — а это, сука, указатель статичный, намертво приклеенный. Это как гвоздь в стене, на который повесили табличку "Вася был здесь, версия 1.0". Тегом помечают релизы, чтобы потом не искать по всему дереву, где же тот стабильный кусок кода. Он не двигается, в отличие от ветки.
- Легковесный тег — просто имя для коммита, хуй с горы.
- Аннотированный тег — серьёзная хуйня, с датой, автором, описанием и даже подписью. Для релизов — именно он.
# Вот так делают тег для релиза, как взрослые
git tag -a v1.0.0 -m "Release version 1.0.0"
Простая аналогия, чтобы въехать:
- Коммиты — это кадры на киноплёнке, отдельные фотки.
- Ветка — это курсор в видеоредакторе, который ты двигаешь туда-сюда, пока монтируешь.
- Тег — это закладка "КУЛЬМИНАЦИЯ" или "КОНЕЦ ФИЛЬМА", которую ты вставил и больше не трогаешь.
Вот и вся магия. Не путай, а то закоммитишь не в ту ветку, натегаешь какой-то хуйни — и потом сидишь, разгребаешь, как говно за слоном.