1. База Git: коммиты, история, индексация и откат изменений
База Git: коммиты, история, индексация и откат изменений
Git на собеседованиях DevOps / SRE проверяют не как инструмент разработчика, а как инструмент безопасного изменения инфраструктурного кода: уметь объяснить, что именно попадёт в релиз, как быстро найти источник регрессии, и как откатиться без потери данных.
В этой статье разберём фундаментальные вещи, которые чаще всего спрашивают:
!Схема трёх зон Git и команд, которые перемещают изменения между ними
Модель Git в одном абзаце
Git хранит историю как цепочку (точнее, граф) коммитов. Каждый коммит:
Важная привычка для собеседования: говорить не «Git хранит дельты», а «коммит — это снимок, а Git оптимизирует хранение под капотом». Это соответствует формулировке из книги Pro Git.
Источник: Pro Git (Scott Chacon, Ben Straub) — Git Basics
Коммит как единица изменения
Что считается хорошим коммитом
В DevOps/SRE контексте коммит должен быть удобен для:
Практика:
Что такое HEAD
HEAD — это указатель на текущую позицию в истории, обычно на последний коммит текущей ветки. Когда вы делаете новый коммит, он становится новым HEAD.
Полезно проговаривать на собеседовании:
HEAD, создать обратный коммит, вернуть файлы в рабочей директорииИндекс (staging area): зачем он нужен
Индекс (staging area) — промежуточный слой между рабочей директорией и коммитом. Он позволяет:
git bisect и откатовТипичный поток:
git add добавляете в индекс то, что хотите включить в следующий коммит.git commit фиксируете индекс как новый коммит.Ключевая формулировка: git add добавляет изменения в индекс, а не «в Git».
Осмотр изменений: что именно будет закоммичено
Команды, которые помогают не ошибиться перед коммитом:
git status — показывает состояние рабочей директории и индексаgit diff — показывает изменения в рабочей директории относительно индексаgit diff --staged — показывает изменения в индексе относительно HEADПример типичного сценария:
Собеседования любят вопрос: «Как закоммитить только часть файла?» Короткий ответ: git add -p.
Справка: Документация git-add
История: как читать и объяснять
git log и полезные варианты
git log — подробная историяgit log --oneline --decorate --graph --all — компактный вид, удобен для объяснения графа коммитовgit show <commit> — что именно в конкретном коммите (патч + метаданные)Справка: Документация git-log
Хеш коммита: почему он важен
Коммиты идентифицируются хешем. В практике DevOps/SRE хеш полезен, когда:
Важно: в большинстве команд можно использовать короткий префикс хеша, если он однозначен.
Откат и отмена: разные задачи — разные команды
Ниже — самый частый источник путаницы на собеседованиях: слова «откатить» и «отменить» могут означать разные операции.
Классификация действий
| Задача | Что меняется | Типичный инструмент |
|---|---|---|
| Убрать локальные правки в файле (не staged) | рабочая директория | git restore <file> |
| Убрать из индекса (unstage), но оставить правки в файлах | индекс | git restore --staged <file> |
| Вернуть проект к состоянию старого коммита, сохранив историю | история + новый коммит | git revert <commit> |
| Переместить HEAD на другой коммит (переписать локальную историю) | HEAD и, опционально, индекс/рабочая директория | git reset |
Справка: Документация git-restore
git restore: вернуть файлы в нужное состояние
Типовые случаи:
git restore file.txt — выбросить незакоммиченные изменения в file.txt (опасно, изменения пропадут)git restore --staged file.txt — убрать файл из индекса (unstage), но оставить изменения в рабочей директорииНа собеседовании важно проговаривать, что именно вы теряете. git restore может быть разрушительным для незакоммиченных правок.
git reset: переместить HEAD и управлять индексом
git reset часто проверяют как индикатор понимания staging area.
Три режима reset
git reset --soft <commit>HEAD на указанный коммит
- индекс и рабочая директория остаются как были
- удобно, если хотите «переупаковать» последние коммиты, не теряя подготовленных измененийgit reset --mixed <commit> (обычно это режим по умолчанию)HEAD
- сбрасывает индекс до состояния указанного коммита
- рабочая директория сохраняет изменения (они становятся unstaged)git reset --hard <commit>HEAD
- сбрасывает индекс
- сбрасывает рабочую директорию
- разрушительно: локальные незакоммиченные изменения пропадутСправка: Документация git-reset
Важное собеседовательное уточнение
git reset переписывает историю для текущей ветки (локально).reset может создать проблемы другим (потребуются force push и согласование процесса).git revert: «откат» без переписывания истории
git revert <commit> создаёт новый коммит, который логически отменяет изменения указанного коммита.
Почему это любят в production-процессах:
Справка: Документация git-revert
Восстановление после ошибок: git reflog
git reflog показывает, куда указывал HEAD в прошлом. Это ваш «чёрный ящик», который часто спасает после:
git reset --hardПрактический смысл:
Справка: Документация git-reflog
Мини-набор для собеседования: что уметь сказать вслух
HEAD — указатель на текущий коммит.git diff и git diff --staged отвечают на разные вопросы.git reset — про перемещение HEAD и управление индексом/рабочей директорией, часто с переписыванием истории.git revert — безопасный откат через новый коммит.git reflog — способ восстановиться после «необратимых» действий.