Коммиты и ветки: рабочий минимум

Три состояния файла и что на самом деле такое ветка.

Три состояния

Файл в Git находится в одном из трёх мест:

  1. Рабочий каталог — то, что вы видите и редактируете.
  2. Индекс (staging) — то, что попадёт в следующий коммит.
  3. Репозиторий — то, что уже зафиксировано.
git status           # где что находится
git add file         # рабочий каталог → индекс
git commit           # индекс → репозиторий
git diff             # рабочий каталог против индекса
git diff --staged    # индекс против последнего коммита

Отдельный индекс существует затем, чтобы коммитить не всё подряд, а осмысленную часть изменений. git add -p даёт добавить отдельные куски одного файла.

Ветка — это указатель

Ветка в Git не копия файлов. Это файл с одним хешем коммита. Создание ветки — запись сорока байт, поэтому оно мгновенно.

git switch -c feature/login   # создать и перейти
git switch main               # вернуться
git branch -v                 # список и где каждая стоит

Коммит указывает на родителя, тот на своего — так получается история. HEAD указывает на текущую ветку.

Полезные команды при разборе

git log --oneline --graph --all -20   # картина ветвления
git log -p file                       # история изменений файла
git blame file                        # кто и когда менял каждую строку
git show <hash>                       # что именно было в коммите

git blame нужен не чтобы найти виноватого, а чтобы найти коммит и прочитать его сообщение — там обычно написано, почему код такой.

Сообщение коммита

Полезное сообщение объясняет почему, а не что: что изменилось, и так видно в диффе.

Плохо:  fix
Плохо:  изменил конфиг nginx
Лучше:  увеличить client_max_body_size до 20m

        Загрузка изображений уроков падала с 413: дефолтный
        лимит nginx — 1 МБ, а картинки со скриншотами больше.

Через полгода именно это объяснение сэкономит время — вам же.