Модуль 01 — Системы контроля версий и Git

Какую задачу решает Git и как он устроен внутри

Прогресс курса Модуль 1 из 9

Что вы освоите в этом модуле

01

Проблема: версии без системы

Без контроля версий история проекта выглядит так:

site/
├── index.html
├── index_old.html
├── index_old2.html
├── index_final.html
├── index_final_ИСПРАВЛЕНО.html
└── index_final_v3_точно_последний.html

По именам файлов нельзя ответить на простые вопросы: чем отличается v3 от final, кто и зачем удалил блок контактов, какая версия сейчас на сервере. Когда над файлом работают двое, один перезаписывает правки другого — и узнаёт об этом последним.

Система контроля версий (VCS, version control system) хранит все состояния проекта в одном месте и для каждого записывает автора, время и пояснение. Любое состояние можно достать, два любых — сравнить.

Что даёт контроль версий

  • История. Кто, когда и зачем изменил строку — одной командой.
  • Откат. Вернуть файл или весь проект к любому сохранённому состоянию.
  • Параллельная работа. Несколько человек меняют один проект, система сводит изменения вместе и показывает, где они пересеклись.
  • Эксперименты. Новая функция делается в отдельной ветке и не ломает рабочую версию.
02

Централизованные и распределённые системы

В централизованной системе (Subversion, Perforce) история хранится на одном сервере. У разработчика — только текущая версия файлов. Посмотреть историю, сохранить изменения или переключиться на другую версию можно, только пока сервер доступен.

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

ДействиеЦентрализованнаяРаспределённая (Git)
Сохранить измененияСразу на серверЛокально, на сервер — отдельной командой
Посмотреть историюЗапрос к серверуЛокально, без сети
Сервер недоступенРабота остановленаРабота продолжается
Сервер потерянИстория потерянаВосстанавливается с любой копии

Git создал Линус Торвальдс в 2005 году для разработки ядра Linux. Сегодня это стандарт: вакансия разработчика, тестировщика или DevOps-инженера без Git почти не встречается.

03

Коммит — снимок проекта

Основная единица истории в Git — коммит (commit). Это снимок всех отслеживаемых файлов проекта в момент сохранения, а не список изменений. Файлы, которые не менялись, Git в новом снимке не копирует — он ссылается на уже сохранённые.

Каждый коммит содержит:

Ссылки на родителей связывают коммиты в цепочку — это и есть история. Каждому коммиту Git присваивает хеш — 40-символьный идентификатор, вычисленный из содержимого коммита:

$ git log --oneline
a3f9c21 Добавить форму обратной связи
7b04e8d Исправить ширину шапки на телефонах
e15d2f0 Первая версия главной страницы

В выводе показаны первые 7 символов хеша — их обычно хватает, чтобы однозначно указать коммит. Полный хеш выглядит так: a3f9c21e8b4d0f6a91c2e7d35b80f14c6a92d7e3.

Хеш зависит от содержимого, автора, даты и хеша родителя. Изменить старый коммит незаметно нельзя: у него изменится хеш, а за ним — хеши всех последующих коммитов. Поэтому история Git служит надёжной записью того, что было сделано.
04

Три области: рабочий каталог, индекс, репозиторий

Файл в Git проходит три области. Это главное, что нужно понять до первой команды.

Области Git

  • Рабочий каталог (working directory) — обычная папка проекта. Здесь вы редактируете файлы.
  • Индекс (staging area, index) — черновик следующего коммита. Сюда вы кладёте только те изменения, которые хотите сохранить.
  • Репозиторий (repository) — база коммитов в скрытой папке .git. Попав сюда, изменение становится частью истории.
  Рабочий каталог          Индекс              Репозиторий (.git)
  ───────────────          ──────              ──────────────────
  правите файлы   ──git add──▶  черновик  ──git commit──▶  коммит в истории
                  ◀────────────────── git restore ──────────────────

Индекс позволяет собрать коммит из части изменений. Пример: вы исправили опечатку в README.md и заодно начали новую страницу contacts.html, которая ещё не готова. В индекс кладётся только README.md — получается коммит «Исправить опечатку в README», а незаконченная страница остаётся в рабочем каталоге.

Один коммит — одно логическое изменение. «Исправить опечатку» и «Добавить страницу контактов» — два коммита. Такую историю легко читать, а неудачное изменение легко отменить, не задев соседнее.
05

Git и git-хостинги

Git — программа на вашем компьютере. Она работает без интернета и без регистрации.

Git-хостинг — сервис, где хранятся копии репозиториев для обмена и совместной работы: веб-интерфейс для просмотра кода, запросы на слияние, обсуждение изменений, права доступа. Git-хостинг не заменяет Git, а дополняет его.

ПлатформаЧьяВ курсе
GitFlic (gitflic.ru)РоссияПрактика с модуля 07, итоговый проект
GitVerse (gitverse.ru)РоссияАльтернатива, команды те же
GitLabМожно развернуть на своём сервереВстречается в компаниях
GitHubСШААльтернатива, команды те же

Команды Git не зависят от платформы. Проект, отправленный на GitFlic, отправляется на любой другой хостинг той же командой git push — меняется только адрес.

Ключевые выводы модуля

Запомните главное

  • Система контроля версий хранит все состояния проекта с автором, временем и пояснением
  • В Git у каждого полная копия истории: работа не зависит от сервера
  • Коммит — снимок проекта, связанный с родителем; хеш однозначно его определяет
  • Изменения проходят путь «рабочий каталог → индекс → репозиторий»
  • Git — программа, GitFlic и другие хостинги — место для обмена репозиториями
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Все модули Модуль 02: Настройка