| layout | ../../layouts/Layout.astro |
|---|---|
| title | Git |
| description | Version control, branching, pull requests, rebase, merge, revert и командный workflow |
| category | Основы и инструменты |
| kind | questions |
| order | 20 |
Зачем команде version control workflow?
|
Короткий ответ Version control workflow определяет, как создаются branches, pull requests, releases, hotfixes и rollback. Без общей договоренности изменения сложнее ревьюить, релизы сложнее собирать, а история становится шумной. Workflow должен соответствовать размеру команды, частоте релизов и риску продукта. Полный ответ Version control workflow описывает путь изменения от задачи до production: где создать ветку, как оформить коммиты и pull request, какие проверки обязательны, кто выполняет review, каким способом изменения попадают в основную ветку и как выпускаются или откатываются. Например, команда может договориться о следующем процессе:
Такой workflow делает состояние репозитория предсказуемым и переносит часть контроля качества из человеческой памяти в branch protection и CI. По связям issue → pull request → commit → release можно восстановить, зачем появилось изменение и где обсуждались ограничения. Слишком сложный процесс тоже вреден: длинные release-ветки, много ручных согласований и крупные pull requests увеличивают lead time и количество конфликтов. Небольшой продукт с частыми релизами обычно выигрывает от trunk-based development и коротких веток, а продукт с несколькими поддерживаемыми версиями или строгим release governance может использовать release branches. На интервью важно не назвать единственный "правильный" workflow, а объяснить, как выбранный процесс снижает риски именно вашей команды и какие проблемы он создает взамен. |
Чем feature branch workflow отличается от trunk-based development?
|
Короткий ответ Feature branch workflow держит изменения в отдельных ветках до merge. Trunk-based development предполагает маленькие частые изменения в основной ветке, часто с feature flags и сильными automated checks. Первый подход проще для изолированной работы, второй лучше для частых релизов и меньших merge conflicts. Полный ответ В feature branch workflow каждая задача разрабатывается в отдельной ветке и попадает в основную ветку после pull
request, review и CI. Это удобно для изоляции незавершенной работы, внешних contributors и изменений, которым требуется
отдельное обсуждение. Но чем дольше живет ветка, тем сильнее она расходится с Trunk-based development строится вокруг постоянно интегрируемой основной ветки. Разработчики делают небольшие изменения и сливают их часто, обычно через очень короткие branches или напрямую при строгой защите trunk. Незавершенную функциональность скрывают feature flags, branch by abstraction или совместимыми промежуточными изменениями. Поэтому deployment можно отделить от release: код уже находится в production, но функция еще выключена для пользователей. Например, новую форму можно добавлять по частям:
Trunk-based development требует быстрых reliable checks, небольших pull requests, дисциплины обратной совместимости и
умения дробить работу. Feature branches проще начать использовать, но они не должны превращаться в ветки, живущие
недели. Также trunk-based development не означает отсутствие review или бесконтрольный push в Выбор зависит от частоты релизов, зрелости CI/CD, размера изменений и требований к изоляции. Главный trade-off — краткосрочная изоляция против ранней интеграции. |
Кто должен отвечать за качество version-controlled code?
|
Короткий ответ Ответственность разделена: автор отвечает за изменение, reviewer — за проверку, maintainers — за правила репозитория и release process. Хорошая команда фиксирует branch protection, required checks, review rules и ownership, чтобы качество не зависело только от внимательности одного человека. Полный ответ Качество кода — общая ответственность, но у участников разные зоны контроля. Автор должен понять задачу, ограничить scope, проверить diff, добавить или обновить tests, описать риски и убедиться, что изменение можно безопасно доставить. Reviewer проверяет не только style, но и корректность решения, edge cases, поддерживаемость, безопасность и соответствие архитектуре. Maintainers задают правила: branch protection, required checks, merge strategy, permissions, CODEOWNERS, release process и порядок работы с инцидентами. Автоматизация создает повторяемый базовый уровень качества:
При этом CI не понимает продуктовый смысл, а reviewer не должен вручную выполнять работу линтера. Хороший процесс распределяет проверки по самому дешевому и надежному уровню. Опасная модель — считать reviewer последней линией защиты и перекладывать на него ответственность автора. Это приводит к огромным pull requests и формальному approval. Обратная крайность — считать, что зеленый CI гарантирует качество: тесты могут не покрывать логическую ошибку, миграцию данных или деградацию UX. После дефекта команда должна улучшать систему, а не искать одного виноватого: добавить test, checklist, ownership rule или наблюдаемость. На интервью полезно привести пример, где качество обеспечивалось сочетанием личной ответственности, review и автоматических ограничений. |
Где лучше вести issues и почему это важно?
|
Короткий ответ Issues должны жить в одном понятном месте: GitHub Issues, Jira, YouTrack, Linear или другой системе. Важно, чтобы pull requests, bugs, decisions и releases были связаны между собой. Иначе команда теряет контекст, почему изменение было сделано и какие ограничения обсуждались. Полный ответ Команде нужен один source of truth для задач и дефектов. Конкретный инструмент вторичен: это может быть GitHub Issues, Jira, YouTrack или Linear. Важнее, чтобы участники знали, где искать актуальный статус, критерии готовности, ответственного, решения и связи с кодом. Хороший issue обычно содержит:
Например, pull request может содержать Проблема возникает, когда одна и та же задача вручную дублируется в Jira и GitHub Issues. Статусы и описания расходятся, а команда не понимает, какая запись актуальна. Если несколько систем неизбежны, одна должна быть основной, а остальные — ссылаться на нее или синхронизироваться автоматически. Issue не обязан хранить весь технический контекст. Долгосрочное архитектурное решение лучше зафиксировать в ADR, а чувствительные данные, credentials и персональную информацию нельзя переносить в публичный tracker. Но issue должен оставлять достаточно контекста, чтобы через несколько месяцев понять причину изменения, а не только его название. |
Для чего нужен Husky?
|
Короткий ответ Husky настраивает Git hooks в проекте. Например, Полный ответ Husky помогает хранить настройку Git hooks рядом с кодом проекта. Git вызывает hooks в определенные моменты, например перед созданием commit, после merge или перед push. Husky подключает проектные scripts к этим событиям, чтобы все разработчики могли использовать одинаковые локальные проверки. Типичный набор:
Преимущество hooks — ранний feedback. Разработчик узнает о formatting error до push, а не после нескольких минут ожидания CI. Проверка staged files также обычно быстрее полного запуска lint по репозиторию. Но hooks нельзя считать защитной границей:
Поэтому обязательные проверки должны повторяться в CI, а локальные hooks стоит делать быстрыми, детерминированными и понятными. В hook не следует помещать тяжелый end-to-end suite или действия, изменяющие удаленные ресурсы. На интервью полезно объяснить не только "Husky запускает lint", но и границу ответственности: Husky улучшает developer experience и предотвращает простые ошибки локально, а CI остается независимым источником истины перед merge. |
Какие version control systems вы использовали?
|
Короткий ответ Ожидается не только название Git, но и понимание ежедневных операций: branch, commit, merge, rebase, revert, conflict resolution, pull request и code review. Если был опыт SVN, Mercurial или monorepo tooling, полезно объяснить, чем отличались процессы и какие ограничения это создавало. Полный ответ Это вопрос про практический опыт, а не проверка списка названий. Сильный ответ начинается с основной системы, например Git, а затем показывает, какие задачи вы решали: создавали branches, формировали понятные commits, обновляли ветку через merge или rebase, разрешали conflicts, откатывали изменения, участвовали в code review и выпускали releases. Полезно привести конкретный сценарий:
Git — distributed version control system: каждый clone содержит историю и позволяет создавать commits и branches локально. В централизованной SVN основная история находится на сервере, а типичный workflow и модель branching отличаются. Опыт с другой VCS стоит упоминать только вместе с практическими отличиями, а не как набор терминов. Monorepo tools, GitHub, GitLab и Bitbucket не являются отдельными version control systems. Это инфраструктура вокруг Git: hosting, pull requests, permissions, CI/CD и инструменты масштабирования репозитория. На интервью лучше разделять эти понятия. Если опыт ограничен Git, не нужно придумывать работу с SVN или Mercurial. Гораздо ценнее подробно рассказать, как вы
разрешили сложный conflict, восстановили потерянный commit через |
Чем git revert отличается от git reset?
|
Короткий ответ
Полный ответ
Например, ошибочный commit уже попал в Reset опубликованной ветки изменяет ее историю и обычно требует force push. Это ломает parent chain, на который могли опираться branches коллег. Поэтому его не используют для общей ветки без явной координации. Иногда удаленный reset commit можно восстановить через |
Чем merge отличается от rebase?
|
Короткий ответ
Полный ответ Git хранит commits как граф.
Практический workflow может быть таким:
Merge лучше показывает реальную структуру совместной работы и не требует переписывать опубликованные commits. Rebase упрощает линейное чтение истории и позволяет привести локальные commits в порядок, но conflicts иногда приходится решать несколько раз — для каждого переносимого commit. Обычный rebase также может распрямить merge commits, если специально не использовать режим сохранения merges. Не стоит rebase общую ветку, которой пользуются другие разработчики, без договоренности. Универсально лучшей стратегии нет: команда выбирает ее с учетом требований к audit trail, частоты интеграции и удобства диагностики. На интервью важно объяснить изменение commit identity и правило "rebase private history, merge shared history". |
Как переключиться на hotfix с незакоммиченными изменениями?
|
Короткий ответ Можно сделать временный commit, сохранить изменения через Полный ответ Самый прозрачный вариант — создать небольшой временный commit в текущей feature-ветке. Он надежно хранится в истории, его можно позже изменить через interactive rebase или squash перед merge. Такой подход особенно удобен, если работа уже логически делится на commit, даже если она еще не готова для pull request.
Перед переключением полезно проверить На интервью сильный ответ предлагает несколько безопасных вариантов и объясняет, почему |
Что происходит с коммитами при rebase на свежий develop?
|
Короткий ответ Git находит commits feature-ветки после общей базы и последовательно применяет их поверх свежего Полный ответ При Hash commit зависит не только от diff, но и от parent, author/committer metadata и сообщения. После смены parent hashes
становятся другими. Старые commits некоторое время могут оставаться доступными через Если patch конфликтует с актуальным
После rebase важно запустить tests: текстовый conflict может отсутствовать, но поведение feature способно логически
сломаться из-за изменений в На интервью ключевой механизм стоит сформулировать так: rebase replay-ит patches на новой базе, поэтому создается новая цепочка commits, а не просто меняется визуальное расположение старых. |