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-05-1-three-areas

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

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

Цель - увидеть руками три зоны Git и переходы между ними. Файл проходит путь: working tree -> staging (index) -> repository. На каждом шаге проверишь git status и git diff с правильными опциями, чтобы понять, что где лежит сейчас.

▶ интерактивный 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 three-areas && cd three-areas
    git init -b main
    echo "version 1" > note.txt
    git add note.txt
    git commit -m "init"
    git status

    git status сейчас должен сказать nothing to commit, working tree clean - все три зоны совпадают.

    ✓ Базовая позиция: все три зоны одинаковы.

  2. 02

    Измени файл, посмотри статус

    bash
    cd /home/student/work/three-areas
    echo "version 2" > note.txt
    git status

    Видишь Changes not staged for commit. Файл изменился в working tree, но index ещё содержит version 1. Проверь:

    bash
    git diff           # без флагов = working tree vs index
    git diff --cached  # --cached = index vs HEAD (пусто, index = HEAD)
    подсказка

    Если `git diff` пусто - ты не сохранил изменение в note.txt.

    ✓ Working отличается от index. Index = HEAD.

  3. 03

    Сделай git add - подними изменение в index

    bash
    cd /home/student/work/three-areas
    git add note.txt
    git status
    git diff           # пусто: working = index
    git diff --cached  # видит изменение: index != HEAD

    Изменение поднялось в зону «staged». Working tree теперь совпадает с index, index отличается от HEAD.

    ✓ Изменение в index. Working и index совпадают.

  4. 04

    Создай ситуацию, где staged и unstaged разные версии

    bash
    cd /home/student/work/three-areas
    echo "version 3" > note.txt
    git status
    git diff
    git diff --cached

    Теперь все три зоны разные:

    • HEAD: version 1
    • index: version 2 (поднял раньше)
    • working: version 3 (только что записал)

    Это нормальная ситуация при долгой работе. git diff (без флагов) покажет v2 -> v3, а git diff --cached покажет v1 -> v2.

    ✓ Три разных версии в трёх зонах. status показывает обе.

  5. 05

    Закоммить только то, что в index

    bash
    cd /home/student/work/three-areas
    git commit -m "bump to v2"     # коммитит снапшот из index, working tree игнорируется
    git status
    git log --oneline

    Коммит создан из index, не из working tree. version 3 остался в working - его пока никто не зафиксировал. git status покажет Changes not staged for commit.

    ✓ Index закоммичен, working ушёл вперёд. Зоны снова разделились.

  6. 06

    Откати коммит через reset --soft

    --soft двигает только указатель ветки. Index и working не трогает.

    bash
    cd /home/student/work/three-areas
    git add note.txt              # подними v3 в index, чтобы было что показать
    git commit -m "bump to v3"
    git log --oneline
    # --soft = только сдвиг ветки на HEAD~1 (parent), index и working не трогает
    git reset --soft HEAD~1
    git log --oneline             # последний коммит исчез из лога
    git status                    # но index всё ещё содержит изменение

    Коммит исчез из лога, но version 3 всё ещё в index. Полезно, когда коммитнул и сразу понял, что хочешь что-то ещё добавить.

    ✓ Коммит снят, index сохранил твою работу.

  7. 07

    Сделай reset --mixed - сбросить и index

    --mixed (дефолт) откатывает ветку И сбрасывает index. Working не трогает.

    bash
    cd /home/student/work/three-areas
    git reset --mixed HEAD        # --mixed (дефолт) = сброс index до HEAD, working не трогает
    git status                    # видишь "Changes not staged"
    cat note.txt                  # файл всё ещё содержит version 3

    Index пустой, файл в working остался изменённым. Это эквивалент «всё разstaged, но текст никуда не делся».

    ✓ Index сброшен. Working не тронут.

  8. 08

    Сделай reset --hard - стереть всё

    --hard - максимальный откат: ветка + index + working. Работа в working tree теряется без подтверждения.

    bash
    cd /home/student/work/three-areas
    git reset --hard HEAD         # --hard = ветка + index + working tree, всё к HEAD
    cat note.txt                  # содержимое version 2 (из последнего коммита)
    git status                    # working tree clean

    note.txt снова содержит version 2 (из последнего коммита). Working tree clean.

    Правило: --hard опасен. Прежде чем его жать - подумай, не нужно ли сначала закоммитить или stash.

    ✓ Всё сброшено до состояния последнего коммита. Три зоны снова совпадают.

Что ты узнал

Три зоны Git: working tree (диск), index (staged), repository (commits). add поднимает из working в index. commit фиксирует index в repo. reset --soft/--mixed/--hard - три уровня отката, отличаются тем, какие зоны затрагивают.

команды

  • git statusсравнение всех трёх зон одним взглядом
  • git diffworking tree vs index
  • git diff --cachedindex vs HEAD
  • git reset --soft HEAD~1откат только указателя ветки
  • git reset --mixed HEAD~1плюс сброс index
  • git reset --hard HEAD~1плюс сброс working tree

концепции

  • · три зоны живут независимо, status показывает разницы между ними
  • · diff без флагов - между working и index
  • · diff --cached - между index и HEAD

← предыдущая

Реконструируй log руками через cat-file

следующая →

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

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