> Что такое система 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, чтобы не терять историю

Пример рабочего цикла:

BASH
git checkout main
git pull origin main
git checkout -b feature/foo
# пишем код, тестируем
git add .
git commit -m "feat: add foo handler"
git push origin feature/foo
# создаём PR, после ревью и мержа
git checkout main
git pull origin main
git branch -d feature/foo

Пример кода

Пример разрешения конфликта в Go-файле:

GO
<<<<<<< HEAD
func 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

После ручного разрешения:

GO
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
}

Затем 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 . без проверки, что именно добавляется

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью