lesson ── git-labs ── ~18 мин ── 8 шагов
Цель - увидеть руками три зоны Git и переходы между ними. Файл проходит
путь: working tree -> staging (index) -> repository. На каждом шаге
проверишь git status и git diff с правильными опциями, чтобы
понять, что где лежит сейчас.
интерактивный sandbox
Поднимется контейнер gitlab/git-base с git, bash, pre-commit. В браузере откроется терминал, можно сразу git init. Каждый шаг проверяется автоматически. Сеть air-gapped, github.com недоступен.
stack ── git · bash · 256 MB RAM · air-gapped · самоуничтожается через 30 мин простоя
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 - все три зоны совпадают.
✓ Базовая позиция: все три зоны одинаковы.
cd /home/student/work/three-areas
echo "version 2" > note.txt
git status
Видишь Changes not staged for commit. Файл изменился в working
tree, но index ещё содержит version 1. Проверь:
git diff # без флагов = working tree vs index
git diff --cached # --cached = index vs HEAD (пусто, index = HEAD)
Если `git diff` пусто - ты не сохранил изменение в note.txt.
✓ Working отличается от index. Index = HEAD.
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 совпадают.
cd /home/student/work/three-areas
echo "version 3" > note.txt
git status
git diff
git diff --cached
Теперь все три зоны разные:
version 1version 2 (поднял раньше)version 3 (только что записал)Это нормальная ситуация при долгой работе. git diff (без флагов)
покажет v2 -> v3, а git diff --cached покажет v1 -> v2.
✓ Три разных версии в трёх зонах. status показывает обе.
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 ушёл вперёд. Зоны снова разделились.
--soft двигает только указатель ветки. Index и working не трогает.
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 сохранил твою работу.
--mixed (дефолт) откатывает ветку И сбрасывает index. Working
не трогает.
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 не тронут.
--hard - максимальный откат: ветка + index + working. Работа в
working tree теряется без подтверждения.
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 indexgit diff --cachedindex vs HEADgit reset --soft HEAD~1откат только указателя веткиgit reset --mixed HEAD~1плюс сброс indexgit reset --hard HEAD~1плюс сброс working treeконцепции