Что такое Git
Распределённая система контроля версий, отслеживающая изменения в файлах и координирующая работу нескольких разработчиков
Зачем нужно
- Хранить полную историю изменений проекта
- Безопасно экспериментировать с кодом через ветки
- Работать в команде без перезаписи чужих изменений
- Откатываться к любой предыдущей версии кода
Где используется
- В любом программном проекте — от одиночного до enterprise
- В open-source сообществе (GitHub, GitLab, Bitbucket)
- В DevOps-пайплайнах для CI/CD
- Для документации, конфигураций, даже контента (блоги, книги)
Предпосылки
- Базовое понимание работы с терминалом
- Понимание файловой системы
Система контроля версий (VCS)
Зачем нужна VCS
Без VCS разработчик вручную копирует файлы (project_v1, project_v2_final, project_v2_final_REAL). Это хаотично и ненадёжно.
VCS автоматически:
- Сохраняет каждое изменение с описанием
- Позволяет откатиться к любой точке
- Отслеживает кто, когда и что изменил
Централизованные vs Распределённые
Централизованная (SVN, CVS):
[Разработчик A] ──→ [Центральный сервер] ←── [Разработчик B]
- Один сервер хранит всю историю
- Без сервера работа невозможна
- Если сервер потерян — история потеряна
Распределённая (Git, Mercurial):
[Разработчик A] [Разработчик B]
полная копия полная копия
↕ ↕
[Удалённый репозиторий]
- У каждого разработчика полная копия репозитория
- Работа возможна без сети
- Множество бэкапов по умолчанию
История Git
Git создал Линус Торвальдс в 2005 году для разработки ядра Linux. Требования при создании:
- Скорость
- Простота дизайна
- Поддержка нелинейной разработки (тысячи параллельных веток)
- Полная распределённость
- Работа с большими проектами
Основные понятия
Репозиторий (Repository)
Каталог проекта, в котором Git отслеживает изменения. Содержит скрытую папку .git с полной историей.
# Создать репозиторий
git init my-project
cd my-project
ls -la # появилась папка .git
Коммит (Commit)
Снимок (snapshot) состояния всех файлов проекта в определённый момент. Каждый коммит имеет:
- Уникальный хеш (SHA-1):
a1b2c3d4e5f6... - Автора и дату
- Сообщение с описанием изменений
- Ссылку на родительский коммит
commit a1b2c3d ← последний
↓
commit f4e5d6a
↓
commit 7b8c9d0 ← первый
Ветка (Branch)
Независимая линия разработки. По умолчанию — ветка main (или master).
main: A ── B ── C
\
feature: D ── E
HEAD
Указатель на текущий коммит (обычно — последний коммит текущей ветки).
# Посмотреть куда указывает HEAD
cat .git/HEAD
# ref: refs/heads/main
Рабочая директория, Staging Area, Репозиторий
┌─────────────────┐ git add ┌──────────────┐ git commit ┌────────────┐
│ Working │ ────────────→ │ Staging Area │ ─────────────→ │ Repository │
│ Directory │ │ (Index) │ │ (.git) │
└─────────────────┘ └──────────────┘ └────────────┘
Ваши файлы Подготовленные Зафиксированная
как есть к коммиту история
- Working Directory — текущее состояние файлов на диске
- Staging Area (Index) — "зона подготовки", куда добавляют изменения перед коммитом
- Repository (.git) — хранилище всех коммитов и истории
Как Git хранит данные
Git хранит снимки, а не различия (diff):
Коммит 1: [file_a v1] [file_b v1] [file_c v1]
Коммит 2: [file_a v2] [file_b v1] [file_c v2] ← file_b не изменился — ссылка на v1
Коммит 3: [file_a v2] [file_b v2] [file_c v2]
Неизменённые файлы не дублируются — Git хранит ссылку на предыдущую версию.
Частые ошибки
- Путать Git и GitHub — Git это инструмент, GitHub это платформа-хостинг
- Работать без VCS — "мне это не нужно, проект маленький" — нужно всегда
- Коммитить всё в одну ветку — даже одиночному разработчику стоит использовать ветки
- Не читать сообщения Git — Git подробно пишет что произошло и что делать дальше
Практика
- Установите Git (см. Установка и настройка)
- Создайте пустой репозиторий командой
git init test-repo - Загляните в папку
.git— посмотрите что там хранится - Создайте файл, добавьте в staging area, сделайте коммит
- Выполните
git logи изучите вывод
Связанные темы
Ресурсы
- Pro Git Book (русский) — полная книга по Git
- Git Documentation — официальная документация
- Learn Git Branching — интерактивный тренажёр
- Oh My Git! — игра для изучения Git