Что такое 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
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 подробно пишет что произошло и что делать дальше

Практика

  1. Установите Git (см. Установка и настройка)
  2. Создайте пустой репозиторий командой git init test-repo
  3. Загляните в папку .git — посмотрите что там хранится
  4. Создайте файл, добавьте в staging area, сделайте коммит
  5. Выполните git log и изучите вывод

Связанные темы

Ресурсы