Software Development Processes → Система контроля версий (Git) → Основное
Основная идея
Базовые операции Git — это набор команд для ежедневной работы с системой контроля версий: инициализация репозитория, отслеживание изменений, создание коммитов и синхронизация с удалённым репозиторием.
Не понимают разницу между staging area и committed
Забывают про .gitignore для исключения файлов
Не знают как отменить изменения (git checkout, git reset, git revert)
Введение и проблематика
Git — это распределённая система контроля версий, которая позволяет отслеживать изменения в коде, работать над проектом совместно с другими разработчиками и возвращаться к предыдущим версиям при необходимости.
Git создан Линусом Торвальдсом в 2005 году для разработки ядра Linux. Сегодня это стандарт индустрии для контроля версий.
Зачем нужен Git?
История изменений — можно посмотреть, кто, когда и что изменил
Откат изменений — вернуться к рабочей версии при ошибке
Параллельная работа — несколько разработчиков работают над одним проектом
Резервное копирование — код хранится на сервере и у каждого разработчика
Code Review — возможность просмотреть изменения перед слиянием
Базовая теория
Три области Git
graphLR A[Working Directory]-->|git add| B[Staging Area] B -->|git commit| C[Repository] C -->|git checkout| A
# Связать с удалённым репозиториемgitremoteaddoriginhttps://github.com/user/repo.git# Отправить измененияgitpush-uoriginmain
Основные команды на каждый день
bash
# Текущее состояние файловgitstatus# Краткий статусgitstatus-s# История коммитовgitlog# Компактная историяgitlog--oneline# История с графом ветокgitlog--oneline--graph--all# Просмотр изменений в файлахgitdiff# Изменения в staging areagitdiff--staged
Файл .gitignore
⚠️
Важно настроить .gitignore в начале проекта, чтобы не коммитить лишние файлы (зависимости, конфигурации IDE, секреты).
bash
# Пример .gitignore для Node.js проекта# Зависимостиnode_modules/# Переменные окружения.env.env.local# Логиlogs/*.log# Сборкаdist/build/# IDE.idea/.vscode/*.swp# OS файлы.DS_StoreThumbs.db
Пограничные кейсы
Разница между git pull и git fetch
graphTD A[git fetch]--> B[Скачивает изменения] B --> C[Не сливает с локальной веткой] D[git pull]--> E[Скачивает изменения] E --> F[Автоматически сливает]
git pull = git fetch + git merge. Используйте fetch, когда хотите сначала посмотреть изменения, и pull для быстрого обновления.
Отмена изменений
Ситуация
Команда
Отменить изменения в файле
git restore file.js
Убрать файл из staging
git restore --staged file.js
Отменить последний коммит (сохранив изменения)
git reset --soft HEAD~1
Отменить последний коммит (удалив изменения)
git reset --hard HEAD~1
Создать коммит отмены
git revert HEAD
🚫
git reset --hard удаляет изменения безвозвратно! Используйте с осторожностью.
Плюсы и минусы Git
Преимущества
Недостатки
Распределённость — каждый имеет полную копию
Сложная кривая обучения
Быстрая работа — большинство операций локальные
Много команд с похожими названиями
Надёжность — криптографические хеши
Может быть сложен для не-программистов
Гибкость — разные workflow
Merge-конфликты требуют ручного разрешения
Бесплатный и open-source
Большие бинарные файлы хранятся неэффективно
Вопросы интервьюера
Q: Чем отличается git pull от git fetch?
fetch только скачивает изменения с сервера, pull скачивает и сразу сливает с текущей веткой
Q: Что такое staging area?
Промежуточная область между рабочей директорией и репозиторием. Позволяет выбрать, какие изменения войдут в коммит
Q: Как отменить последний коммит?
git reset --soft HEAD~1 (сохранит изменения) или git reset --hard HEAD~1 (удалит изменения). Для публичной истории — git revert
Q: Что делает git clone?
Создаёт полную копию удалённого репозитория со всей историей коммитов
Q: Как посмотреть изменения перед коммитом?
git diff для unstaged изменений, git diff --staged для staged