← Git: основы
10 мин · просто · Урок 2 из 6

Первый коммит

init, add, commit, status, log. Зачем нужен .gitignore.

Создаём репозиторий

В пустой папке проекта:

git init

Появилась скрытая папка .git/. Это и есть репозиторий: внутри объекты, ссылки, конфиг. Если её удалить, вся история проекта пропадёт. Сам код не тронут, только versioning.

git init идемпотентен: безопасно запускать в уже инициализированной папке, ничего не сломается.

Заодно он печатает такое предупреждение:

hint: Using 'master' as the name for the initial branch.
hint: Names commonly chosen instead of 'master' are 'main', 'trunk'
hint: and 'development'. The just-created branch can be renamed via:
hint:   git branch -m <name>

Это не ошибка, а подсказка про имя первой ветки. Сам Git до сих пор называет её master. Привычное main берётся не из Git, а из GitHub и GitLab: там дефолтная ветка новых репозиториев именно main, поэтому после git clone ты видишь main, а после git init — master.

Чтобы имя не зависело от того, откуда взялся репозиторий, задай его один раз глобально:

git config --global init.defaultBranch main

Подсказка после этого пропадёт, и новые репозитории будут начинаться с main.

Три состояния файла

В git у файла есть три места:

[ working dir ] --git add--> [ staging (index) ] --git commit--> [ repo ]

git add переносит из working в staging. git commit фиксирует staging в новый коммит.

Почему так, а не "редактирую и сразу коммитится": staging позволяет собирать коммит точечно. Изменил пять файлов, но в коммит хочешь два - добавляешь только их.

Базовый цикл

git status                  # что изменилось, что в staging
git add file.md             # добавить конкретный файл
git add .                   # всё из папки - сначала глянь git status, чтобы не утащить .env/мусор
git commit -m "сообщение"   # зафиксировать staging в коммит
git log                     # история коммитов
git log --oneline           # компактный лог
git log --oneline --graph   # с ASCII-графом веток

git status — команда, в которую смотришь чаще всего. Она показывает: что в staging (готово к коммиту), что изменено, но не в staging, и что не отслеживается вообще (новые файлы).

Хорошее сообщение коммита

Сообщение читают коллеги и ты сам через полгода. Минимальные правила:

Не пиши update, fix bug, wip в основную ветку. Из такого лога через год никто ничего не выяснит.

.gitignore

Файл в корне репозитория, в котором перечислено, что git не должен видеть.

Пример:

# зависимости
node_modules/
.venv/

# артефакты сборки
dist/
build/
*.log

# секреты
.env
.env.local

# IDE и ОС
.idea/
.DS_Store

Синтаксис:

.gitignore обязательно коммитится в репозиторий: правила должны быть у всех участников.

Ловушка: секрет ушёл в коммит

Случайно закоммитил .env с паролем. Удалить из staging:

git rm --cached .env

Эта команда добавляет удаление файла в staging: в следующем коммите его уже не будет. Но в предыдущих коммитах файл остался. Если репозиторий уже запушен, считай, что секрет утёк. Меняй его.

Чистка уже закоммиченного — отдельная тема (git filter-repo, BFG), но профилактика проще: .gitignore + проверка git status перед коммитом.

Что важно запомнить

git init создаёт .git/, где лежит вся история. Первая ветка у него называется master; main — дефолт GitHub и GitLab, локально его включает git config --global init.defaultBranch main.

Файл проходит три состояния: working dir -> staging -> repo.

git status смотри перед каждым коммитом.

.gitignore коммитится в репо, должен быть один для всех.

В следующем уроке разбираем ветки и параллельную работу.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Какие три состояния проходит файл в git?

GIT-104
02

Зачем нужен staging area (индекс)?

GIT-105
03

Что делает .gitignore и нужно ли его коммитить?

GIT-106

Прошли материал до конца? Отметьте урок пройденным.