Контроль версий (Git)
Основы Git — индекс, коммиты, ветки, конфликты слияния, удалённые репозитории, stash и просмотр истории.
7 вопросов
JuniorТеорияОчень частоКакие git-команды вы используете ежедневно?
Какие git-команды вы используете ежедневно?
Ежедневно: git status/diff для проверки; add+commit -m для записи; push/pull для синхронизации; log --graph для истории; switch -c для веток; merge/rebase для интеграции; stash/stash pop для откладывания; cherry-pick, blame, bisect точечно.
Типичные ошибки
- ✗Использовать
git add .бездумно — случайно добавляет.env,*.oили большие бинарники; всегда проверяйтеgit statusсначала и поддерживайте хороший.gitignore - ✗Путать
git pullсgit fetch—pull= fetch + merge (или rebase); используйтеgit fetch+ проверку перед слиянием, чтобы избежать неожиданных конфликтов - ✗Терять stash-записи —
git stashсоздаёт стек;git stash listпоказывает все; stash-и не резервируются при push; используйте WIP-коммит для важной работы
Уточняющие вопросы
- →В чём разница между
git reset --soft,--mixedи--hard? - →Как восстановить удалённый stash или коммит в состоянии detached HEAD?
JuniorТеорияЧастоКаковы этапы фиксации изменений в git?
Каковы этапы фиксации изменений в git?
У Git три области: рабочее дерево (ФС), индекс/staging (снимок для следующего коммита), репозиторий (.git/objects). Workflow: редактируем файлы; git add копирует снимок в индекс; git commit создаёт объект коммита из индекса, указывающий на родителя.
Типичные ошибки
- ✗Забывать
git addи удивляться пустому коммиту —git commitкоммитит только то, что в индексе; используйтеgit commit -aдля авто-добавления отслеживаемых файлов (но пропускает неотслеживаемые) - ✗Путать
git diffиgit diff HEAD—git diffсравнивает рабочее дерево с индексом;git diff HEADсравнивает рабочее дерево с последним коммитом (включает незаинсценированные изменения) - ✗Коммитить большие бинарные файлы — Git хранит полное содержимое каждой версии; используйте Git LFS для больших ресурсов
Уточняющие вопросы
- →Как Git хранит содержимое файлов внутри (объекты blob, tree, commit, tag)?
- →В чём разница между
git commit --amendи созданием нового коммита?
JuniorТеорияЧастоРазница между git fetch и git pull.
Разница между git fetch и git pull.
git fetch загружает новые коммиты и ссылки с remote (обновляет origin/main), но не трогает рабочее дерево или текущую ветку. git pull = git fetch + git merge (или git rebase при pull.rebase=true).
Типичные ошибки
- ✗Выполнять
git pullбез проверки что изменилось — может вызвать неожиданные конфликты слияния во время активной работы; сначала используйтеgit fetch+ просмотр - ✗Забывать, что
git fetchобновляет только remote-tracking ветки —origin/mainобновляется, ноmainвсё ещё указывает на старый коммит до merge/rebase - ✗Использовать
git pull --rebaseна общих ветках — rebase переписывает историю; делайте rebase только локальных коммитов, никогда не тех, на которых другие построили свою работу
Уточняющие вопросы
- →Как настроить git для всегда rebase при pull с помощью
git config pull.rebase true? - →Что делает
git remote update --pruneи когда это полезно?
JuniorТеорияЧастоКак разрешить конфликт слияния?
Как разрешить конфликт слияния?
Git помечает конфликт <<<<<<<, =======, >>>>>>>. Шаги: (1) git status — увидеть конфликты; (2) отредактировать, выбрать сторону или объединить, убрать маркеры; (3) git add <файл>; (4) git commit (merge) или git rebase --continue (rebase).
Типичные ошибки
- ✗Принимать все 'наши' или 'их' без чтения конфликта — молча удаляет работу другого разработчика; всегда читайте обе стороны
- ✗Коммитить маркеры конфликта —
<<<<<<< HEADоставленный в коде вызывает ошибки компиляции; используйтеgit diff --checkв CI для их обнаружения - ✗Разрешать конфликт в rebase и затем запускать
git merge --continue— во время rebase используйтеgit rebase --continue; во время merge —git merge --continue; их смешивание повреждает операцию
Уточняющие вопросы
- →Как
git rerere(повторное использование записанных разрешений) помогает при повторяющихся конфликтах? - →Что такое трёхстороннее слияние и чем оно отличается от двустороннего diff?
JuniorДебаггингИногдаЧто значит «detached HEAD» в git и как из него выйти?
Что значит «detached HEAD» в git и как из него выйти?
Detached HEAD означает, что HEAD указывает на коммит, а не на ветку — обычно после git checkout <sha>. Коммиты там достижимы только через reflog и могут быть удалены GC. Сохранить: git switch -c new-branch; вернуться: git switch main. Безопасен, пока не коммитите и не забываете.
Типичные ошибки
- ✗Закоммитить в detached HEAD и уйти — коммиты теряются (восстанавливаются через reflog)
- ✗Принимать detached HEAD за «сломанное» состояние и делать reset
- ✗Использовать
git checkoutи для смены ветки, и для просмотра —git switch/git restore(с git 2.23) яснее
Уточняющие вопросы
- →Что такое
git switch --detachи когда это намеренно? - →Как найти «потерянный» коммит после выхода из detached HEAD?
JuniorТеорияИногдаЧто такое SCM и зачем использовать систему контроля версий?
Что такое SCM и зачем использовать систему контроля версий?
SCM охватывает контроль версий, сборку, релизы и отслеживание изменений. VCS фиксирует изменения с автором и сообщением — даёт откат, параллельные ветки и аудит. Git — доминирующая распределённая VCS, каждый клон — полный репозиторий.
Типичные ошибки
- ✗Коммитить напрямую в
mainбез ревью — ломает CI для всей команды; используйте короткоживущие feature-ветки и pull requests - ✗Писать бессмысленные сообщения коммитов ('fix', 'update', 'stuff') — делает
git logиgit bisectбесполезными; используйте повелительное наклонение, описывающее что и почему - ✗Коммитить сгенерированные файлы или артефакты сборки — они должны быть в
.gitignore; раздувают репозиторий и вызывают конфликты слияния
Уточняющие вопросы
- →В чём разница между распределённой VCS (Git) и централизованной VCS (SVN)?
- →Как
git bisectиспользует бинарный поиск для нахождения коммита, введшего баг?
JuniorТеорияИногдаЧто делает git stash и когда лучше его, а не WIP-коммит?
Что делает git stash и когда лучше его, а не WIP-коммит?
git stash сохраняет изменения рабочего дерева и индекса в стек и откатывает до HEAD; восстановить через stash pop/apply. Используйте для коротких прерываний (pull, switch). Для длительной работы лучше WIP-коммит — stash не виден в git log и забывается.
Типичные ошибки
- ✗Стэшить untracked-файлы без
--include-untracked— потеряются - ✗Забыть, в каком stash что лежит — нумеруются числами, не именами
- ✗Использовать stash как долговременное хранилище WIP
Уточняющие вопросы
- →Что такое
git stash branchи когда он полезен? - →Чем
git stash --keep-indexотличается от обычного stash?