Git
распределённая VCS · Linus Torvalds · 2005
Что это
Git — распределённая система контроля версий. Создан Линусом Торвальдсом в апреле 2005 года за 2 недели, после того как BitKeeper (использовавшийся для разработки ядра Linux) прекратил бесплатную лицензию для opensource-разработчиков.
Название означает «сволочь, придурок» на британском сленге. Линус: «I'm an egotistical bastard, and I name all my projects after myself. First Linux, now Git».
Отличие от классических VCS
| SVN/CVS (централизованные) | Git (распределённая) | |
|---|---|---|
| Репозиторий | один на сервере | у каждого разработчика полная копия |
| Оффлайн-коммиты | нельзя | можно |
| Ветки | дорого (копирование) | дёшево (указатель) |
| Скорость | сеть-зависимо | локально всё быстро |
| Целостность | слабая | SHA-1 (сейчас SHA-256) хэши всего |
Основные концепции
- Commit — снимок состояния всех файлов с сообщением и родителем(-ями)
- Branch — просто указатель на коммит
- HEAD — указатель на текущую ветку
- Remote — ссылка на удалённый репозиторий (
origin,upstream) - Tag — именованный указатель на коммит (обычно релизы)
- Merge / Rebase — способы объединения веток
- Stash — временное сохранение изменений
Базовые команды
git init # создать репозиторий
git clone https://... # склонировать
git status # что изменилось
git add файл # подготовить к коммиту
git commit -m "сообщение" # закоммитить
git log # история
git branch # список веток
git checkout -b новая # создать ветку
git merge другая # влить ветку
git push origin main # отправить
git pull # забрать
Модель хранения
Внутри Git — key-value база в .git/objects/. Четыре типа объектов:
- blob — содержимое файла
- tree — директория (ссылки на blob и другие tree)
- commit — снимок tree + родители + автор + сообщение
- tag — аннотированная метка
Ключ — SHA-1 хэш содержимого (с 2018 идёт переход на SHA-256).
Хостинги
- GitHub — крупнейший, куплен Microsoft в 2018
- GitVerse — российский аналог (Сбер, 2023)
- Codeberg — некоммерческий, на Forgejo
- hub.mos.ru — правительство Москвы
- GitLab, Gitea, Bitbucket, SourceHut, self-hosted на своём VPS
См. также
- .gitignore — что не коммитить
- GitHub, GitVerse, Codeberg, Forgejo, hub.mos.ru