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 меняется.

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 случайно — вся история проекта исчезнет; не удаляй эту папку

Связанные темы

Ресурсы