Git: ветки, откат и история
В главе про первый проект мы уже делали git init и git commit. Этого хватает для старта, но чаще всего именно git становится источником стресса — особенно когда ИИ что-то сломал или нужно вернуться к старой версии. Разберём практику без лишней теории.
Зачем вообще коммитить
Каждый коммит — это точка, к которой можно вернуться. Пока ты не закоммитил — у тебя нет машины времени. Коммиты можно воспринимать как ручные сохранения в игре: прошёл сложный уровень — сохранись.
Правило: коммить каждый раз, когда что-то заработало. Добавил форму — сохранился. Подключил API — сохранился.
Базовые команды (без них никуда)
git status # что изменилось с последнего коммита
git diff # посмотреть конкретные изменения
git add . # добавить все изменённые файлы
git add bot.py # добавить только конкретный файл
git commit -m "описание что сделал"
git log --oneline # история коммитов (одна строка на коммит)Проще говоря
git status — это инвентаризация: что лежит в корзине (staged) и что изменилось, но ещё не в корзине. git add — кладёшь в корзину. git commit — несёшь корзину на склад (создаёшь снимок).
Как откатиться к последнему коммиту
Если ИИ сломал что-то в файлах — и ты ещё не закоммитил эти изменения:
git checkout . # откатить ВСЕ несохранённые измененияИли конкретный файл:
git checkout bot.py # откатить только bot.pyОсторожно
git checkout . уничтожает все несохранённые изменения без возможности восстановления. Если не уверен — сначала сделай git diff и посмотри что будет потеряно.
Как вернуться к конкретному коммиту
Сначала посмотри историю:
git log --onelineУвидишь что-то вроде:
a8d8f95 Add telegram bot chapter
2f9eb62 Change fonts
ce4a7ca Add Telegram footer
7836397 Add Solutions sectionХочешь вернуться к состоянию «Add Telegram footer»? Возьми его хэш (ce4a7ca):
git checkout ce4a7ca -- .Файлы вернутся к тому состоянию. Чтобы зафиксировать это:
git add .
git commit -m "revert: вернулся к версии до fonts"Ветки — работай спокойно
Ветка — это отдельная линия разработки. Ты создаёшь ветку, экспериментируешь в ней. Если получилось — сливаешь в основную (main). Если нет — просто удаляешь ветку.
Проще говоря
Основная ветка — это твоя рабочая тетрадь. Новая ветка — черновик. Ты пробуешь что-то в черновике. Понравилось — переписываешь в тетрадь. Не понравилось — выбрасываешь черновик, тетрадь чистая.
Создать и переключиться на ветку
git checkout -b feature/dark-mode # создать ветку и перейти в неёТеперь все коммиты идут в эту ветку, main остаётся нетронутой.
Посмотреть список веток
git branchАктивная ветка отмечена *.
Слить ветку в main
git checkout main # вернуться в основную
git merge feature/dark-mode # влить изменения из веткиУдалить ветку после слияния
git branch -d feature/dark-modeПрактический сценарий с ИИ
Хочешь попросить ИИ переделать дизайн, но боишься что сломает — создай ветку:
git checkout -b experiment/new-design
# отдаёшь ИИ задачу
# ИИ вносит изменения
# проверяешь результатЕсли понравилось:
git add .
git commit -m "new design: gradient background + cards"
git checkout main
git merge experiment/new-designЕсли не понравилось:
git checkout main # вернуться в основную
git branch -D experiment/new-design # удалить ветку (с -D — без вопросов)Основная ветка нетронута.
Загрузить проект на GitHub (если ещё нет)
# один раз:
git remote add origin https://github.com/ТВОЙ_ЛОГИН/РЕПО.git
git push -u origin main
# потом просто:
git pushСкачать изменения с GitHub (если работаешь с нескольких компьютеров)
git pullШпаргалка
| Задача | Команда |
|---|---|
| Что изменилось | git status |
| Посмотреть изменения | git diff |
| Добавить всё | git add . |
| Сохранить | git commit -m "описание" |
| История | git log --oneline |
| Откатить всё незакоммиченное | git checkout . |
| Создать ветку | git checkout -b имя-ветки |
| Переключиться на ветку | git checkout имя-ветки |
| Слить ветку | git merge имя-ветки |
| Отправить на GitHub | git push |
| Забрать с GitHub | git pull |
Что дальше?
Git освоен — теперь работа с кодом безопасна. В следующей главе — несколько проектов на одном сервере: как запустить второй сайт не покупая новый VPS.