Какую задачу решает Git и как он устроен внутри
Без контроля версий история проекта выглядит так:
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) хранит все состояния проекта в одном месте и для каждого записывает автора, время и пояснение. Любое состояние можно достать, два любых — сравнить.
В централизованной системе (Subversion, Perforce) история хранится на одном сервере. У разработчика — только текущая версия файлов. Посмотреть историю, сохранить изменения или переключиться на другую версию можно, только пока сервер доступен.
В распределённой системе (Git, Mercurial) у каждого участника полная копия репозитория со всей историей. Сохранение, просмотр истории, ветки — локальные операции, они работают без сети и выполняются мгновенно. Сервер нужен только для обмена изменениями.
| Действие | Централизованная | Распределённая (Git) |
|---|---|---|
| Сохранить изменения | Сразу на сервер | Локально, на сервер — отдельной командой |
| Посмотреть историю | Запрос к серверу | Локально, без сети |
| Сервер недоступен | Работа остановлена | Работа продолжается |
| Сервер потерян | История потеряна | Восстанавливается с любой копии |
Git создал Линус Торвальдс в 2005 году для разработки ядра Linux. Сегодня это стандарт: вакансия разработчика, тестировщика или DevOps-инженера без Git почти не встречается.
Основная единица истории в Git — коммит (commit). Это снимок всех отслеживаемых файлов проекта в момент сохранения, а не список изменений. Файлы, которые не менялись, Git в новом снимке не копирует — он ссылается на уже сохранённые.
Каждый коммит содержит:
Ссылки на родителей связывают коммиты в цепочку — это и есть история. Каждому коммиту Git присваивает хеш — 40-символьный идентификатор, вычисленный из содержимого коммита:
$ git log --oneline
a3f9c21 Добавить форму обратной связи
7b04e8d Исправить ширину шапки на телефонах
e15d2f0 Первая версия главной страницы
В выводе показаны первые 7 символов хеша — их обычно хватает, чтобы однозначно указать коммит. Полный хеш выглядит так: a3f9c21e8b4d0f6a91c2e7d35b80f14c6a92d7e3.
Файл в Git проходит три области. Это главное, что нужно понять до первой команды.
.git. Попав сюда, изменение становится частью истории. Рабочий каталог Индекс Репозиторий (.git)
─────────────── ────── ──────────────────
правите файлы ──git add──▶ черновик ──git commit──▶ коммит в истории
◀────────────────── git restore ──────────────────
Индекс позволяет собрать коммит из части изменений. Пример: вы исправили опечатку в README.md и заодно начали новую страницу contacts.html, которая ещё не готова. В индекс кладётся только README.md — получается коммит «Исправить опечатку в README», а незаконченная страница остаётся в рабочем каталоге.
Git — программа на вашем компьютере. Она работает без интернета и без регистрации.
Git-хостинг — сервис, где хранятся копии репозиториев для обмена и совместной работы: веб-интерфейс для просмотра кода, запросы на слияние, обсуждение изменений, права доступа. Git-хостинг не заменяет Git, а дополняет его.
| Платформа | Чья | В курсе |
|---|---|---|
| GitFlic (gitflic.ru) | Россия | Практика с модуля 07, итоговый проект |
| GitVerse (gitverse.ru) | Россия | Альтернатива, команды те же |
| GitLab | Можно развернуть на своём сервере | Встречается в компаниях |
| GitHub | США | Альтернатива, команды те же |
Команды Git не зависят от платформы. Проект, отправленный на GitFlic, отправляется на любой другой хостинг той же командой git push — меняется только адрес.