Перейти к основному контенту
NGPP
Кабинет

Учебный конструктор · система контроля версий Git

Git: ветки, merge и rebase — вживую

Git «не укладывается в голове», пока его не увидишь. Делай коммиты, создавай ветки, переключайся, сливай и перебазируй — и смотри, как меняется граф коммитов. Сразу станет ясно: ветка — это просто указатель, HEAD — «где ты сейчас», merge объединяет коммитом с двумя родителями, а rebase выпрямляет историю, но переписывает хеши.

Начни со сценария (Fast-forward / merge / rebase) — или собери свою историю с нуля. Незнакомые слова → словарь внизу. Где Git в общем процессе → конструктор CI/CD.

Сценарий:
a17main ←HEAD
Ветки (клик — checkout)
Действия на ветке main

merge/rebase: влить/перенести выбранную ветку в текущую (main).

Что произошло
  1. → Чистый репозиторий: один коммит на main. HEAD на main.
merge — объединяет коммитом с двумя родителями: история показывает, что ветки сливали. Ничего не переписывает → безопасно для общих веток.
rebase — переносит коммиты на новое основание: история линейная, но это новые хеши (старые переписаны). Только для своих неопубликованных веток.

📖 Словарь: простыми словами

Встретил незнакомое слово выше — найди его здесь. Коротко — суть; разверни — подробное объяснение с аналогией.

Коммит (commit)снимок проекта + ссылка на родителя

Неизменяемый снимок состояния файлов с уникальным хешем и ссылкой на родительский коммит (или несколько). Цепочка коммитов через родителей и образует историю — направленный граф.

Ветка (branch)подвижный указатель на коммит

Не «копия кода», а лёгкий ярлык, указывающий на коммит. Делаешь коммит — ярлык текущей ветки сдвигается на новый коммит. Создать ветку = поставить ещё один указатель; это мгновенно и дёшево.

HEADгде ты сейчас находишься

Указатель на текущую ветку (а через неё — на коммит). checkout/switch перемещает HEAD. Новый коммит привязывается к тому коммиту, на который смотрит HEAD.

Fast-forwardслияние простым сдвигом без нового коммита

Если твоя ветка не расходилась с целевой (только отстала), merge просто двигает указатель вперёд на её коммит — без merge-коммита. История остаётся линейной.

Merge (слияние)объединяет ветки коммитом с двумя родителями

Когда ветки разошлись, merge создаёт новый merge-коммит, у которого ДВА родителя. Плюс: история честно показывает, что и когда сливали. Минус: граф ветвистый. Безопасно для опубликованных веток.

Rebase (перебазирование)переносит коммиты на новое основание, переписывая хеши

Берёт твои коммиты и заново «накладывает» их поверх другой ветки — получается ЛИНЕЙНАЯ история, но это НОВЫЕ коммиты с новыми хешами (старые переписаны). Красиво, но НЕЛЬЗЯ для уже запушенных/общих веток — сломаешь историю другим.

Merge vs Rebaseсохранить ветвление честно vs выпрямить историю

Merge сохраняет реальную картину ветвления (ничего не переписывает). Rebase делает историю линейной и чистой, но переписывает коммиты. Правило: rebase — только для своих локальных, ещё не опубликованных веток; в общие ветки вливай через merge.

Дальше по теме

Эти инструменты связаны с текущим — так задачи стыкуются на практике.

Все инструменты — в каталоге.