Собеседование

Вопросы по Git на собеседовании: 25 вопросов с ответами

Обновлено: · Skillaria.Top

На собеседовании по Git обычно проверяют понимание модели данных (коммит, индекс, ветка, HEAD), разницу между merge и rebase, fetch и pull, reset и revert, умение разрешать конфликты и восстанавливать потерянные коммиты, а также знание командных workflow вроде GitHub Flow и Git Flow.

Git проверяют почти на любом собеседовании разработчика, тестировщика или DevOps-инженера: иногда отдельным блоком, иногда между делом («как бы вы откатили неудачный релиз?»). Интервьюеру важно не столько знание флагов, сколько понимание модели: что такое коммит, куда указывает ветка, что переписывает история. Ниже — 25 вопросов, которые встречаются чаще всего, с ответами того уровня, который производит хорошее впечатление.

Вопросы идут от базовых к продвинутым. Отвечая на собеседовании, по возможности приводите короткий пример из практики — это ценится выше, чем пересказ документации.

Базовые вопросы

1. Что такое Git и чем распределённая система контроля версий отличается от централизованной?

Git — распределённая система контроля версий: она хранит историю изменений проекта и позволяет нескольким людям работать над ним параллельно. В централизованных системах (например, SVN) полная история лежит на одном сервере, а у разработчика — только рабочая копия. В Git каждый клон содержит всю историю, поэтому коммиты, ветки, просмотр истории и слияния работают локально и без сети.

Отсюда практические плюсы: высокая скорость, работа офлайн, отсутствие единой точки отказа. Сервер вроде GitHub или GitLab в Git — просто договорённость команды о «главной» копии, а не техническая необходимость.

2. Из каких трёх областей состоит работа с Git?

Рабочая директория (файлы на диске), индекс или staging area (подготовленный снимок следующего коммита) и локальный репозиторий (папка .git с историей). git add переносит изменения из рабочей директории в индекс, git commit — из индекса в репозиторий.

Хороший дополнительный штрих — упомянуть четвёртую зону, удалённый репозиторий, и команды git push и git fetch, которые с ним работают.

3. Зачем нужен индекс, если можно коммитить сразу?

Индекс позволяет собрать коммит осознанно: из десяти изменённых файлов закоммитить три, относящиеся к одной задаче, а остальное оставить. С git add -p можно выбрать даже отдельные фрагменты внутри файла.

Это основа атомарных коммитов: один коммит — одно логическое изменение. Такую историю легко читать, ревьюить, откатывать через revert и переносить через cherry-pick.

4. Что такое коммит с точки зрения внутреннего устройства Git?

Коммит — объект, который хранит ссылку на дерево (tree) — снимок всех файлов проекта, ссылки на родительские коммиты, автора, коммиттера, даты и сообщение. Идентифицируется хешем SHA-1 (в новых версиях есть экспериментальная поддержка SHA-256) от всего содержимого.

Ключевая мысль: Git хранит снимки, а не диффы. Неизменённые файлы не дублируются — дерево просто ссылается на тот же blob. Поскольку хеш зависит от родителя, изменить старый коммит, не изменив хеши всех последующих, невозможно.

5. Что такое ветка и что такое HEAD?

Ветка — это всего лишь подвижный указатель на коммит, файл в .git/refs/heads/ с хешем внутри. Поэтому создание ветки в Git мгновенно и ничего не копирует. При новом коммите указатель текущей ветки сдвигается на него.

HEAD — указатель на то, где вы сейчас находитесь; обычно он указывает на ветку (ref: refs/heads/main). Если переключиться на конкретный коммит или тег, HEAD будет указывать прямо на коммит — это состояние detached HEAD.

6. Что такое detached HEAD и чем оно опасно?

Это состояние, когда HEAD указывает на коммит, а не на ветку, например после git switch --detach v1.0 или git checkout a1b2c3d. Смотреть код и даже коммитить можно, но новые коммиты не принадлежат ни одной ветке.

Если после этого переключиться на другую ветку, такие коммиты станут недостижимыми и со временем будут удалены сборщиком мусора. Чтобы сохранить работу, создайте ветку: git switch -c fix-from-detached. Если уже ушли — хеш найдётся в git reflog.

7. Чем git fetch отличается от git pull?

git fetch скачивает новые коммиты и обновляет remote-tracking ветки вроде origin/main, но не трогает ваши локальные ветки и файлы. git pull — это fetch плюс интеграция: по умолчанию merge, с флагом --rebase или настройкой pull.rebase=true — rebase.

Опытные разработчики часто делают fetch отдельно, смотрят git log HEAD..origin/main и только потом решают, как интегрировать изменения.

8. Как работает .gitignore и почему файл всё ещё отслеживается, хотя добавлен в него?

.gitignore задаёт шаблоны файлов, которые Git не должен предлагать к добавлению: зависимости, сборку, логи, локальные конфиги с секретами. Правила действуют только для неотслеживаемых файлов.

Если файл уже был закоммичен, игнор на него не влияет. Нужно убрать его из индекса, оставив на диске: git rm --cached config.local.php, и закоммитить это удаление. Проверить, какое правило срабатывает, помогает git check-ignore -v путь.

Ветки, слияние и конфликты

9. Что такое fast-forward merge?

Если целевая ветка не ушла вперёд с момента ответвления, Git при слиянии просто сдвигает её указатель на последний коммит вливаемой ветки — без нового коммита. История остаётся линейной.

Флаг --no-ff заставляет создать merge-коммит даже в этом случае: так в истории видно, что группа коммитов была отдельной фичей. Флаг --ff-only, наоборот, разрешает только fast-forward и отказывается, если нужен настоящий merge.

10. Как возникает конфликт слияния и как его разрешить?

Конфликт возникает, когда в обеих ветках изменены одни и те же строки файла (или файл удалён в одной ветке и изменён в другой), и Git не может решить автоматически. Он останавливает слияние и помечает места маркерами <<<<<<<, =======, >>>>>>>.

git status                 # список файлов с конфликтами
# правим файлы, оставляя правильный вариант
git add app.js
git commit                 # для merge; для rebase — git rebase --continue

Хороший ответ включает и профилактику: маленькие ветки, частый pull из основной ветки, договорённости о форматировании. А также git merge --abort, если нужно отступить.

11. Чем отличаются merge и rebase?

merge объединяет две ветки, создавая merge-коммит с двумя родителями; существующие коммиты не меняются, история честно отражает параллельную работу. rebase переносит коммиты вашей ветки поверх другой ветки, создавая их копии с новыми хешами; история получается линейной.

Обычное правило: rebase — для приведения в порядок своей локальной ветки перед публикацией, merge — для интеграции в общие ветки. Rebase опубликованных коммитов, на которых работают другие, приводит к дублям и путанице.

12. Что такое интерактивный rebase и для чего он нужен?

git rebase -i HEAD~5 открывает список последних пяти коммитов, где для каждого можно выбрать действие: pick — оставить, reword — изменить сообщение, edit — остановиться и поправить, squash и fixup — слить с предыдущим, drop — удалить. Строки можно переставлять.

Типичный сценарий — перед pull request превратить «wip», «fix typo», «ещё фикс» в два-три осмысленных коммита. Удобная связка: git commit --fixup=<hash> и затем git rebase -i --autosquash.

13. Что делает squash merge и когда его выбирают?

При squash merge все коммиты ветки сжимаются в один коммит в целевой ветке (git merge --squash или кнопка на GitHub/GitLab). Основная ветка получает по одному коммиту на фичу.

Плюс — чистая история main. Минус — теряется детальная история внутри фичи, и Git не считает исходную ветку слитой, поэтому git branch -d откажется её удалять без -D.

14. Что такое cherry-pick и когда он уместен?

git cherry-pick <hash> применяет изменения одного коммита к текущей ветке, создавая новый коммит с тем же содержимым, но другим хешем. Классический случай — перенести исправление бага из develop в ветку релиза или хотфикса.

Злоупотреблять им не стоит: один и тот же фикс живёт в двух коммитах, а при последующем слиянии веток возможны конфликты. Флаг -x добавляет в сообщение ссылку на исходный коммит.

Отмена изменений и восстановление

15. Чем отличаются git reset --soft, --mixed и --hard?

РежимУказатель веткиИндексРабочая директория
--softсдвигаетсяне меняетсяне меняется
--mixed (по умолчанию)сдвигаетсясбрасываетсяне меняется
--hardсдвигаетсясбрасываетсясбрасывается, правки теряются

git reset --soft HEAD~3 удобен, чтобы переделать три последних коммита в один. --hard опасен для незакоммиченных правок: их не вернёт даже reflog.

16. Чем git revert отличается от git reset?

reset перемещает указатель ветки назад, фактически переписывая историю. revert создаёт новый коммит, который отменяет изменения указанного, и ничего не переписывает.

Поэтому для опубликованных коммитов в общей ветке правильный ответ — revert: история коллег не ломается, отмена сама видна в логе. Для merge-коммита нужно указать основного родителя: git revert -m 1 <hash>.

17. Как восстановить коммиты после случайного git reset --hard?

Через git reflog: он хранит историю перемещений HEAD и веток локально (по умолчанию записи живут около 90 дней). Находим запись до неудачной команды и возвращаемся:

git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~2
# 9f8e7d6 HEAD@{1}: commit: Добавить оплату
git reset --hard 9f8e7d6

Важная оговорка: reflog спасает только закоммиченное. Изменения, которые никогда не попадали в коммит (или хотя бы в stash), восстановить через Git нельзя.

18. Как отменить изменения в файле и убрать его из индекса?

Современные команды — git restore app.js (вернуть файл к состоянию индекса) и git restore --staged app.js (убрать из индекса, сохранив правки). Раньше для этого использовали git checkout -- app.js и git reset HEAD app.js; они по-прежнему работают.

19. Что такое git stash и какие у него подводные камни?

git stash временно сохраняет незакоммиченные изменения и очищает рабочую директорию — например, чтобы срочно переключиться на хотфикс. Вернуть их можно через git stash pop или apply.

Подводные камни: по умолчанию не сохраняются неотслеживаемые файлы (нужен -u); при pop возможен конфликт, и тогда запись не удаляется из списка; stash легко забыть. Для долгой работы лучше коммит в отдельную ветку.

Продвинутые вопросы и командная работа

20. Как найти коммит, который сломал функциональность?

С помощью git bisect — двоичного поиска по истории. Указываете заведомо плохой и хороший коммиты, а Git переключает вас на середину диапазона, пока не найдёт виновника за log2(N) шагов.

git bisect start
git bisect bad                 # текущая версия сломана
git bisect good v2.3.0         # здесь всё работало
# проверяем и отвечаем good/bad, пока Git не назовёт коммит
git bisect reset

Если есть скрипт проверки, процесс автоматизируется: git bisect run npm test.

21. Почему git push --force опасен и чем его заменить?

--force перезаписывает удалённую ветку вашей версией, и коммиты, которые коллеги успели запушить, исчезают с сервера. Безопаснее git push --force-with-lease: он перезапишет ветку, только если она на сервере в том состоянии, которое вы видели при последнем fetch.

Принудительный push нормален для собственной feature-ветки после rebase; в main и другие общие ветки его обычно запрещают защитой веток на сервере.

22. Какие Git workflow вы знаете?

GitHub Flow: одна основная ветка, всегда готовая к деплою, и короткие feature-ветки, которые вливаются через pull request после ревью и CI. Git Flow: ветки main и develop, плюс feature/*, release/* и hotfix/*; подходит для продуктов с версионными релизами. Trunk-based development: все интегрируются в trunk очень часто, недоделанное прячется за feature flags.

Сильный ответ объясняет выбор: для веб-сервиса с непрерывным деплоем Git Flow обычно избыточен, а для библиотеки с поддержкой нескольких версий — оправдан.

23. Что такое pull request и что в нём проверяют?

Pull request (в GitLab — merge request) — запрос на слияние ветки, который проходит код-ревью и автоматические проверки CI перед вливанием. Это функция платформы (GitHub, GitLab, Bitbucket), а не самого Git.

Хороший PR небольшой, решает одну задачу, имеет понятное описание и связан с задачей в трекере. Ревьюер смотрит на корректность, читаемость, тесты и на то, не попали ли в PR лишние файлы или секреты.

24. Какие правила хорошего сообщения коммита вы соблюдаете?

Короткий заголовок (до 50–72 символов) в повелительном наклонении — «Добавить валидацию email», затем пустая строка и тело, объясняющее «почему», а не «что» (что изменилось, видно в диффе). Многие команды используют Conventional Commits: feat:, fix:, docs:, refactor:.

Такие сообщения позволяют генерировать changelog, быстро находить нужное через git log --grep и понимать мотивы изменений через годы.

25. Что вы сделаете, если случайно запушили пароль в репозиторий?

Первым делом — отозвать и перевыпустить секрет: он уже скомпрометирован, даже если удалить его через минуту (клоны, форки, кэш). Затем убрать файл из отслеживания, добавить в .gitignore и при необходимости вычистить историю инструментами вроде git filter-repo с последующим force push и предупреждением команды.

Интервьюер здесь проверяет приоритеты: кандидат, который начинает с переписывания истории и забывает про ротацию ключа, отвечает неправильно.

Как подготовиться к вопросам по Git

Самый надёжный способ — не заучивать ответы, а прогнать каждый сценарий руками в тестовом репозитории: создать конфликт и разрешить его, сделать reset --hard и восстановиться через reflog, сжать коммиты интерактивным rebase. На собеседовании по Git часто дают практическую задачу или просят нарисовать граф коммитов до и после команды — если вы это делали сами, ответ рисуется легко.

Полезно также пройти короткий тест по гиту для самопроверки: попробуйте без подсказок ответить, что произойдёт с историей после git rebase main или git revert HEAD. Если на вопрос «что изменится в трёх зонах» вы отвечаете уверенно, база у вас есть.

Итог

Собеседование по Git почти всегда сводится к трём темам: модель данных (коммиты, ветки, HEAD, индекс), интеграция изменений (merge, rebase, конфликты, fetch и pull) и безопасная отмена (reset, revert, reflog). Добавьте понимание командного workflow и pull request — и вы закроете подавляющее большинство вопросов. Все эти сценарии, включая командную работу и продвинутые инструменты, отрабатываются на практике в курсе по Git.

Частые вопросы

Какие вопросы по Git задают джунам, а какие — сеньорам?

Джунов спрашивают про add, commit, ветки, конфликты, fetch и pull. От опытных разработчиков ждут понимания rebase, reflog, workflow, стратегий релизов и умения разрулить испорченную историю в команде.

Дают ли на собеседовании практические задания по Git?

Часто да: попросить разрешить конфликт, нарисовать граф после rebase или выбрать команду для отмены опубликованного коммита. Иногда это часть тестового задания, где оценивают и историю коммитов.

Нужно ли знать внутреннее устройство Git?

На базовом уровне — да: что коммит хранит снимок и ссылку на родителя, а ветка — это указатель. Детали формата объектов и packfile спрашивают редко.

Смотрят ли работодатели на историю коммитов кандидата?

Нередко смотрят профиль на GitHub или историю тестового задания. Осмысленные сообщения и аккуратные атомарные коммиты производят хорошее впечатление.