Первый коммит
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 ]
- Working directory — что лежит на диске. Просто файлы.
- Staging area (индекс) — то, что попадёт в следующий коммит.
- Repository — закоммиченное, лежит в
.git/.
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, и что
не отслеживается вообще (новые файлы).
Хорошее сообщение коммита
Сообщение читают коллеги и ты сам через полгода. Минимальные правила:
- одна строка темы, повелительное наклонение, до ~72 символов:
fix: nginx 502 при перезагрузке worker'ов, - если нужно объяснить почему (а не что), оставь вторую строку пустой, а дальше пиши абзац,
- префиксы типа
fix:,feat:,chore:помогают сортировать в логе и часто требуются по правилам команды (Conventional Commits).
Не пиши update, fix bug, wip в основную ветку. Из такого лога
через год никто ничего не выяснит.
.gitignore
Файл в корне репозитория, в котором перечислено, что git не должен видеть.
Пример:
# зависимости
node_modules/
.venv/
# артефакты сборки
dist/
build/
*.log
# секреты
.env
.env.local
# IDE и ОС
.idea/
.DS_Store
Синтаксис:
node_modules/игнорирует всю папку,*.logловит все файлы с расширением,/distдействует только в корне, не во вложенных папках,!keep.logзадаёт исключение: этот файл не игнорировать.
.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 коммитится в репо, должен быть один для всех.
В следующем уроке разбираем ветки и параллельную работу.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Какие три состояния проходит файл в git?
GIT-104Зачем нужен staging area (индекс)?
GIT-105Что делает .gitignore и нужно ли его коммитить?
GIT-106Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс