📖 Теория: Введение в Git

К оглавлению урока

⚡ Ключевые факты

  • CVCS (CVS, SVN, Perforce) — единый центральный сервер; уязвим к отказам.
  • DVCS (Git, Mercurial) — каждый имеет полную копию; работает офлайн.
  • Git создан Линусом Торвальдсом в 2005 году после разрыва с BitKeeper.
  • Git ≠ GitHub: Git — локальный инструмент; GitHub — веб-платформа Microsoft.
  • .git/ — хранит весь репозиторий: objects/, refs/, index, hooks/, config.

1. Виды систем контроля версий

Системы контроля версий (СКВ) — это программные инструменты, помогающие командам разработчиков управлять изменениями в исходном коде с течением времени.

1.1 Централизованные системы (CVCS)

Примеры: CVS (Concurrent Versions System), SVN (Subversion), Perforce.

  • Единый центральный сервер содержит все версии файлов и историю изменений.
  • Разработчики работают с локальными копиями, которые синхронизируются с сервером.
  • Ограничения: уязвимость к отказам сервера, медленная скорость при слиянии, нет работы офлайн.

1.2 Распределённые системы (DVCS)

Примеры: Git, Mercurial, Bazaar.

  • Каждый разработчик имеет полную копию репозитория, включая всю историю изменений.
  • Репозиторий может быть скопирован (клонирован) на локальный компьютер — работа без доступа к серверу.
  • Большая гибкость, устойчивость к отказам, высокая производительность.

1.3 Локальные системы

Пример: RCS (Revision Control System). Работают с отдельными файлами на одном компьютере. Базовый уровень контроля версий — не подходят для командной работы.

2. Создание Git

История Git началась в 2005 году, когда Линус Торвальдс, создатель ядра Linux, столкнулся с необходимостью эффективного управления версиями кода для своего проекта.

До этого использовалась система BitKeeper, но возникли разногласия с её разработчиками относительно доступа к коду. Линус решил создать собственную систему контроля версий, придерживаясь ключевых принципов: скорость, простота, распределённость.

Благодаря эффективности и гибкости Git стал широко принятым стандартом в индустрии разработки программного обеспечения.

3. Основные принципы и функции Git

Принципы

  • Распределённая система: Каждый разработчик имеет полную копию репозитория — работа автономно, без зависимости от центрального сервера.
  • Система снимков (Snapshots): Git сохраняет снимки проекта в разные моменты времени, а не отслеживает изменения файлов (как SVN). Каждый коммит — это снимок состояния всех файлов.
  • Эффективность и скорость: Git оптимизирован для работы с большими проектами за счёт локального хранилища — большинство операций не требует сети.

Функции

  • Управление версиями: отслеживание изменений и возврат к предыдущим версиям проекта.
  • Ветвление и слияние (Branching and Merging): изолированная разработка функций в отдельных ветках с последующим объединением в основную ветку (main/master).
  • Работа с удалёнными репозиториями: синхронизация локального и удалённого репозиториев через HTTP, SSH и другие протоколы.
  • Контроль доступа и авторства: каждый коммит содержит информацию об авторе (имя, email, дата).

4. Отличие Git от GitHub

Git

  • Система контроля версий (СКВ)
  • Разработана Линусом Торвальдсом
  • Работает локально на компьютере разработчика
  • Командная строка и графические интерфейсы
  • Открытый исходный код, бесплатный

GitHub

  • Веб-платформа для хостинга Git-репозиториев
  • Принадлежит компании Microsoft
  • Социальные и совместные функции
  • Pull Requests, Issues, Actions (CI/CD)
  • Интеграция с инструментами разработки (IDE)
Запомните: Git — это инструмент; GitHub — это сервис. Можно использовать Git без GitHub (локально или с другими платформами: GitLab, Bitbucket). GitHub не работает без Git.

5. Установка и настройка

Для пользователей Windows удобен Git Bash; для macOS — стандартный терминал (Git входит в xcode command line tools).

Перед первым использованием необходимо настроить имя и email — они будут отображаться в каждом коммите:

git config --global user.name "Your Name"
git config --global user.email "your@email.com"

Флаг --global сохраняет настройки для всех репозиториев на данном компьютере в файл ~/.gitconfig.

6. git init и директория .git

Команда git init инициализирует новый репозиторий Git в текущем каталоге. После выполнения:

  • Создаётся скрытая директория .git со всеми данными репозитория.
  • Создаётся пустой репозиторий без файлов и истории коммитов.
  • Создаётся файл конфигурации .git/config.
  • Создаётся пустой индекс (staging area) для подготовки изменений к коммиту.

Структура директории .git

Директория .git содержит все данные, необходимые Git для управления репозиторием:

  • config — настройки репозитория (информация о пользователе, настройки remote)
  • objects/ — хранилище объектов: все файлы, коммиты, теги хранятся здесь в виде объектов
  • index — список изменений, готовых к коммиту (staging area)
  • refs/ — ссылки на ветки, теги и другие объекты в репозитории
  • hooks/ — скрипты, которые запускаются на определённых этапах работы (pre-commit, post-commit и др.)
  • Другие вспомогательные файлы: журналы, информация о подмодулях и т.д.
Важно: Никогда не редактируйте файлы внутри .git/ вручную. Git самостоятельно управляет этой директорией. Случайное изменение может повредить репозиторий.

7. Основные стадии работы с Git

Типичный рабочий процесс с Git включает следующие стадии:

  1. git clone — скачать существующий репозиторий:
    git clone <repo_url>
    Создаёт локальную копию репозитория из GitHub (или другого remote).
  2. git add — добавить изменения в staging area:
    git add README.md — конкретный файл
    git add . — все изменённые файлы
  3. git commit — зафиксировать изменения:
    git commit -m "Описание изменений"
    Создаёт снимок текущего состояния проекта.
  4. git push — отправить коммиты в удалённый репозиторий:
    git push origin main
  5. git pull — получить изменения из удалённого репозитория:
    git pull origin main
    Комбинирует fetch + merge.
Порядок важен: git addgit commitgit push. Пропуск git add — самая частая ошибка новичков: файлы не попадут в коммит.

8. Современное дополнение: git switch

⚠️ Проверить по документации
В Git 2.23+ появилась команда git switch — более интуитивная альтернатива git checkout для переключения между ветками:
# Старый способ (из лекции)
git checkout main

# Современный синтаксис (git 2.23+)
git switch main
git switch -c new-branch   # создать и переключиться
Обе команды работают, но git switch специализирована только на ветках, что делает намерение явным. На уроке 13 ветки изучаются поверхностно — подробно о git switch на занятии 16.