Ветки, merge и rebase
Параллельная работа, merge или rebase, fast-forward и конфликты.
Обновлено
Что такое ветка
Ветка (branch) — параллельная линия разработки. Вы начинаете от main (стабильный код), работаете над фичей в своей ветке, а main остаётся нетронутым, пока вы не решите влить изменения.
Технически ветка — это просто указатель на коммит, поэтому она создаётся мгновенно.
mainABCfeat/loginDEКоманды
| Команда | Что делает |
|---|---|
git switch -c feat/login |
создаёт ветку и переключается на неё |
git switch main |
переключиться на другую ветку |
git branch |
список локальных веток |
git merge feat/login |
вливает ветку в текущую |
git rebase main |
переносит ваши коммиты поверх последнего main |
git branch -d feat/login |
удаляет ветку (после merge) |
Как вливать: merge или rebase
| Merge | Rebase | |
|---|---|---|
| Что делает | создаёт merge-коммит, который объединяет две истории | переписывает ваши коммиты так, будто вы начали от последнего main |
| История | показывает, что именно происходило, с ветвлениями | линейная, читается легче |
| Переписывает историю | нет | да (новые коммиты, новые хеши) |
| Безопасно на общих ветках | да | нет — только в своей ветке, пока ею не поделились |
| Когда | вливание в main (обычно через PR) |
обновить свою ветку последними изменениями из main |
Fast-forward
Если main не сдвинулся с момента создания ветки, объединять нечего: Git просто переносит указатель main вперёд. Это называется fast-forward.
До merge:
mainABfeatCDПосле merge — main просто передвинули вперёд, на D:
mainABCDSquash merge
Все коммиты ветки становятся одним коммитом в main. Популярно на GitHub: история main остаётся чистой (один коммит на PR).
Конфликты
Возникают, когда две ветки меняют одни и те же строки. Git отмечает место:
<<<<<<< HEAD
const limit = 10
=======
const limit = 20
>>>>>>> feat/pagination
Выбираете правильный вариант (или объединяете), удаляете маркеры, затем git add + git commit (или git rebase --continue). В редакторе (VS Code) для этого есть кнопки.
Как избегать: короткие ветки (дни, а не недели), которые часто обновляются из main.
Именование веток
feat/login-google
fix/cart-total-rounding
chore/upgrade-next-16
Префикс говорит о типе изменения, остальное — о сути, в kebab-case.
Коротко
- Ветка = указатель на коммит; работаете изолированно от
main. - Merge сохраняет историю; rebase делает её линейной, но переписывает — только в своей ветке.
- Короткие ветки = мало конфликтов.