Git -- репозиторий, коммит, ветка
Три ключевых понятия Git: репозиторий — хранилище всей истории проекта, коммит — снимок изменений в конкретный момент, ветка — именованный указатель на коммит.
Зачем нужно
Без понимания этих трёх концепций невозможно разобраться в остальных командах Git. Они — фундамент: репозиторий хранит, коммит фиксирует, ветка указывает. Всё остальное (merge, rebase, push, pull) строится на них.
Где используется
- Инициализация любого нового проекта:
git init - Коммит каждого осмысленного изменения
- Создание ветки для каждой фичи или багфикса
Основной контент
Репозиторий (Repository)
Репозиторий — это папка проекта + скрытая папка .git внутри неё. .git содержит всю историю изменений, настройки, ссылки на ветки.
git init # создать новый репозиторий
git init my-project # создать папку и инициализировать
git clone https://github.com/user/repo.git # клонировать существующий
ls -la .git/ # содержимое .git
# HEAD — текущая ветка
# config — настройки репозитория
# objects/ — все объекты (коммиты, файлы)
# refs/ — ссылки на ветки и теги
Коммит (Commit)
Коммит — это снимок (snapshot) всех отслеживаемых файлов в момент сохранения. Каждый коммит содержит:
- Хеш (SHA-1): уникальный идентификатор (
a1b2c3d) - Автор и дата
- Сообщение коммита
- Ссылку на родительский коммит
- Ссылки на файлы (tree objects)
git commit -m "feat: добавить форму авторизации"
git commit -am "fix: исправить опечатку" # add + commit для отслеживаемых файлов
# Просмотр истории коммитов
git log # полный лог
git log --oneline # краткий: хеш + сообщение
git log --oneline --graph # с деревом веток
git show a1b2c3d # содержимое конкретного коммита
Структура истории коммитов
a1b2c3d feat: добавить авторизацию
│
b4c5d6e fix: исправить валидацию email
│
c7d8e9f init: начальная структура проекта
Каждый коммит знает своего «родителя» — предыдущий коммит. Так образуется связный список = история.
Ветка (Branch)
Ветка — это просто текстовый файл с хешем коммита. main — файл .git/refs/heads/main, содержащий последний хеш ветки.
git branch # список веток (* — текущая)
git branch feature/login # создать ветку
git switch feature/login # переключиться
git switch -c feature/login # создать и переключиться
git log --oneline --all --graph # визуализация всех веток
HEAD
HEAD — указатель на текущую ветку (обычно). При переключении ветки HEAD меняется.
cat .git/HEAD
# ref: refs/heads/main ← прикреплён к ветке
git switch --detach a1b2c3d # "detached HEAD" — указывает на коммит напрямую
Базовый цикл работы
git init # 1. Создать репозиторий
git add README.md # 2. Добавить файл в staging
git commit -m "init: README" # 3. Создать первый коммит
git switch -c feature/about # 4. Создать ветку для работы
# ... редактировать файлы ...
git add . # 5. Staging
git commit -m "feat: страница about" # 6. Коммит в ветке
git switch main # 7. Переключиться на main
git merge feature/about # 8. Слить ветку
Частые ошибки
- Коммит без сообщения —
git commitбез-mоткрывает редактор; сообщение обязательно - Коммитить всё подряд — один коммит = одно логическое изменение; не смешивай фичи и исправления
- Удалить
.gitслучайно — вся история проекта исчезнет; не удаляй эту папку