linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/lessons/git-lab-06-1-branches-workflow

lesson ── git-labs ── ~22 мин ── 8 шагов

Ветки: создать, переключиться, слить, удалить

Цель - провести feature-ветку через полный цикл. Создашь её от main, сделаешь пару коммитов, увидишь fast-forward merge и three-way merge, попробуешь удалить недоtested ветку и получишь честный отказ Git'а.

▶ интерактивный sandbox

Поднимется контейнер gitlab/git-base с git, bash, pre-commit. В браузере откроется терминал, можно сразу git init. Каждый шаг проверяется автоматически. Сеть air-gapped, github.com недоступен.

запустить sandbox →

stack ── git · bash · 256 MB RAM · air-gapped · самоуничтожается через 30 мин простоя

Шаги

  1. 01

    Создай репо с одним коммитом

    bash
    cd /home/student/work
    mkdir -p branches-lab && cd branches-lab
    git init -b main
    echo "base" > readme.txt
    git add . && git commit -m "init"
    git branch

    Сейчас ветка одна - main. Дальше создашь свою.

    ✓ Репо с одним коммитом на main. Готов к ветвлению.

  2. 02

    Создай ветку feat/quick и переключись на неё

    bash
    cd /home/student/work/branches-lab
    git switch -c feat/quick      # -c = create, аналог `checkout -b`
    git branch                    # звёздочка у активной ветки
    git log --oneline --graph --all   # --graph = ASCII-граф, --all = все refs

    switch -c (== checkout -b) создаёт ветку от HEAD и переключается. git branch теперь показывает обе - звёздочка у активной.

    подсказка

    Если ошибка `unknown switch 'switch'` - старый git. Используй `checkout -b feat/quick`.

    ✓ Ветка создана, ты на ней.

  3. 03

    Сделай коммит на ветке

    bash
    cd /home/student/work/branches-lab
    echo "quick feature" > quick.txt
    git add . && git commit -m "feat: add quick"
    git log --oneline --graph --all

    На feat/quick теперь 2 коммита, на main - 1. Граф показывает расхождение визуально не покажет (ещё нет ветвления в main).

    ✓ Ветка ушла вперёд на один коммит.

  4. 04

    Сделай fast-forward merge в main

    bash
    cd /home/student/work/branches-lab
    git switch main
    git merge feat/quick          # ff = просто двигаем ref вперёд, без merge-коммита
    git log --oneline --graph --all

    Сообщение Fast-forward. main и feat/quick теперь указывают на один коммит. Никакого merge-коммита - main просто переставился вперёд, потому что между main и feat/quick не было расхождения.

    ✓ Fast-forward прошёл. Граф остался линейным.

  5. 05

    Подготовь ситуацию для three-way merge

    Чтобы получить three-way, обе ветки должны разойтись от общего предка.

    bash
    cd /home/student/work/branches-lab
    git switch -c feat/slow
    echo "slow line" > slow.txt
    git add . && git commit -m "feat: add slow"
    git switch main
    echo "main update" >> readme.txt     # >> = append, не перезатирает
    git commit -am "main: update readme"  # -a = staged уже отслеживаемых, -m = сообщение
    git log --oneline --graph --all

    Теперь main и feat/slow разошлись. Граф покажет V-форму.

    ✓ Ветки разошлись. Готов к three-way.

  6. 06

    Сделай three-way merge

    bash
    cd /home/student/work/branches-lab
    # --no-edit = взять дефолтное сообщение merge-коммита, не открывать редактор
    git merge --no-edit feat/slow
    git log --oneline --graph --all

    Сообщение Merge made by the 'ort' strategy. В логе появился merge-коммит с двумя parent'ами. Граф больше не линейный.

    Файлы из обеих веток оказались в working tree - они трогали разные файлы, конфликта нет.

    ✓ Merge-коммит создан. Это и есть three-way.

  7. 07

    Удали смерженную ветку

    bash
    cd /home/student/work/branches-lab
    git branch -d feat/quick      # -d = "delete if merged", безопасно
    git branch -d feat/slow
    git branch

    Обе удалились без вопросов - они слиты в main. branch -d проверяет это сам, и отказывает, если нет.

    ✓ Слитые ветки удалены. Осталась только main.

  8. 08

    Создай неслитую ветку и попробуй её удалить

    bash
    cd /home/student/work/branches-lab
    git switch -c feat/draft
    echo "draft idea" > draft.txt
    git add . && git commit -m "draft"
    git switch main
    git branch -d feat/draft      # упадёт: ветка не слита в main

    Должна выйти ошибка: error: The branch 'feat/draft' is not fully merged.. Это защита Git: ты можешь потерять коммиты, удалив ветку, которой нет в main.

    Принудительное удаление - заглавный -D:

    bash
    git branch -D feat/draft      # -D (заглавная) = принудительное удаление
    git branch

    Теперь действительно удалена. Если коммит больше нигде не используется - его подметёт git gc, когда сработает (вручную или как gc --auto); reflog держит запись о ветке ~30 дней по умолчанию, после этого коммит становится кандидатом на сборку.

    ✓ Защита Git увидена, принудительное удаление сработало.

Что ты узнал

Ветка - это указатель на коммит. Создаётся через git branch или switch -c, переключение через switch. Merge может быть fast-forward или three-way - зависит от того, ушёл ли target. Удаление через branch -d (безопасно) или -D (принудительно).

команды

  • git switch -c feat/xсоздать и переключиться
  • git merge feat/xслить feat/x в текущую (ff или 3-way)
  • git merge --no-ff feat/xфорсировать merge-коммит даже при ff
  • git branch -d feat/xудалить, если ветка слита
  • git branch -D feat/xудалить принудительно

концепции

  • · fast-forward - ветка-цель не уходила, ref просто переезжает
  • · three-way - оба ушли, нужен merge-коммит с двумя parent'ами
  • · branch -d отказывает, если ветка не слита - это защита, не баг

← предыдущая

Три зоны: working tree, index, repository

следующая →

Атомарные коммиты: add -p и amend

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки