> Что такое система git и насколько хорошо вы с ней знакомы (Go)
Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Kalabi
Стек: Go
> Пример ответа
Короткий ответ
Git - это распределённая система контроля версий, которая отслеживает изменения в файлах и позволяет нескольким разработчикам работать над проектом одновременно. Я знаком с Git на уровне уверенного ежедневного использования: базовые команды, ветвление, слияние, разрешение конфликтов, работа с удалёнными репозиториями. Знаю, как устроен внутренний объект commit, что такое HEAD, index и как работает механизм веток.
Подробное объяснение
Git хранит состояние проекта как набор снапшотов - commit'ов. Каждый commit содержит ссылку на родительский commit, дерево файлов, автора, сообщение и SHA-1 хеш. Ветка - это просто подвижный указатель на commit. HEAD указывает на текущую ветку или commit.
Ключевые концепции:
- working directory - файлы, которые вы редактируете
- staging area (index) - список изменений, подготовленных к commit
- local repository - база commit'ов на вашей машине
- remote repository - удалённая копия, например на GitHub
Основные команды, которыми я пользуюсь: git add, git commit, git push, git pull, git fetch, git merge, git rebase, git cherry-pick, git stash, git log, git diff, git reset, git revert.
Важно понимать разницу между merge и rebase: merge создаёт дополнительный commit слияния, rebase переписывает историю, перенося ваши commit'ы на новую базу. Для командной работы обычно предпочитают merge, чтобы не переписывать общую историю.
На практике
В повседневной работе с Go-проектами я использую Git так:
- создаю feature-ветку от актуального
mainилиdevelop - делаю маленькие логические commit'ы с понятными сообщениями
- перед push обязательно запускаю тесты и
go vet - при конфликтах разрешаю их вручную, внимательно смотря на оба варианта
- использую
git stashдля временного переключения контекста - для отмены изменений использую
git revertвместоgit reset --hard, чтобы не терять историю
Пример рабочего цикла:
BASHgit checkout maingit pull origin maingit checkout -b feature/foo# пишем код, тестируемgit add .git commit -m "feat: add foo handler"git push origin feature/foo# создаём PR, после ревью и мержаgit checkout maingit pull origin maingit branch -d feature/foo
Пример кода
Пример разрешения конфликта в Go-файле:
GO<<<<<<< HEADfunc GetUser(id int) (*User, error) {return db.FindUser(id)}=======func GetUser(id int) (*User, error) {user, err := db.FindUser(id)if err != nil {return nil, fmt.Errorf("get user: %w", err)}return user, nil}>>>>>>> feature/error-handling
После ручного разрешения:
GOfunc GetUser(id int) (*User, error) {user, err := db.FindUser(id)if err != nil {return nil, fmt.Errorf("get user: %w", err)}return user, nil}
Затем git add и git commit.
Как отвечать на собеседовании
Начните с краткого определения, затем перечислите команды, которыми пользуетесь каждый день. Покажите понимание внутреннего устройства: commit, tree, blob, HEAD. Обязательно упомяните, как решаете конфликты и как строите процесс работы с ветками. Если спросят про rebase - объясните, когда его применяете и почему осторожно. Хорошо добавить пример из реального проекта: как вы откатывали неудачный merge или искали виновника бага через git bisect.
Что проверяет интервьюер
Интервьюер проверяет:
- понимаете ли вы разницу между локальным и удалённым репозиторием
- умеете ли работать с ветками и merge
- знаете ли, как откатить изменения без потери работы
- понимаете ли, что такое конфликт и как его решать
- умеете ли читать историю через
git logиgit blame - насколько аккуратно вы относитесь к commit message
Для junior достаточно уверенного владения базовым циклом add/commit/push/pull и понимания ветвления.
Типичные ошибки
- использование
git reset --hardбез необходимости - теряются изменения - пушить прямо в
mainбез ветки и ревью - неаккуратные commit message вида "fix", "asdf", "123"
- игнорирование
.gitignore- в репозиторий попадают бинарники и секреты - непонимание разницы между
git pullиgit fetch - попытка решить конфликт, удаляя чужой код без разбора
- забывают сделать
git pullперед началом работы - потом мучительные merge - использование
git add .без проверки, что именно добавляется
> Похожие задачи по Go
Расскажите про опыт оптимизации
Напиши SQL запрос для вывода суммы продаж по каждому пользователю, учитывая, что у пользователя может не быть продаж
Для чего используется MongoDB
Какой у тебя опыт работы с Docker
> Похожие задачи по backend
Расскажите про опыт оптимизации
Напиши SQL запрос для вывода суммы продаж по каждому пользователю, учитывая, что у пользователя может не быть продаж
Для чего используется MongoDB
Какой у тебя опыт работы с Docker
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью