Твой первый репозиторий и первый коммит
В прошлом уроке мы поняли боль: копии файлов не масштабируются. Теперь решим её на практике. К концу этого урока у вас будет настоящий Git-репозиторий с настоящим коммитом внутри. Мы не будем объяснять, как Git хранит данные внутри (это в следующем модуле) — сначала важно один раз пройти весь путь руками и увидеть, что всё работает. Это ваш первый успех.
Всё, что нужно, — терминал и установленный Git (вы поставили его на Ступени 0). Проверим:
git --version
Ожидаемый вывод (номер версии может отличаться, это нормально):
git version 2.54.0
Если команда выдала версию — отлично, поехали. Если «command not found» — вернитесь к установке Git и доведите её до конца.
Шаг 1. Создаём папку проекта
Репозиторий Git живёт внутри обычной папки. Создадим её и зайдём внутрь:
mkdir -p ~/git-sandbox/my-first-repo
cd ~/git-sandbox/my-first-repo
Папка пустая. Пока это просто папка, Git про неё ничего не знает.
Шаг 2. git init — превращаем папку в репозиторий
Команда git init говорит Git: «начни следить за этой папкой».
git init
Ожидаемый вывод:
Initialized empty Git repository in /Users/you/git-sandbox/my-first-repo/.git/
Что произошло: Git создал внутри папки скрытую подпапку .git. В ней он будет хранить всю историю версий. Вам туда лазить не нужно — Git управляет ею сам. Проверим, что папка появилась:
ls -a
Ожидаемый вывод:
. .. .git
Видите .git — значит, репозиторий создан. Эта папка и отличает обычный каталог от репозитория.
tip
git initзапускают один раз на проект. Если вы выполните его повторно в той же папке, Git просто скажет «Reinitialized» и ничего не сломает — но обычно так делать не нужно.
Шаг 3. git status — что Git думает прямо сейчас
git status — самая полезная команда новичка. Она показывает, что Git видит в папке. Запускайте её часто — после каждого шага, чтобы понимать, что происходит.
git status
Ожидаемый вывод:
On branch main
No commits yet
nothing to commit (working tree clean)
Перевод на человеческий: «Ты на ветке main. Коммитов пока нет. Сохранять нечего — папка пустая». Всё верно: мы ещё не создали ни одного файла.
Шаг 4. Создаём файл
Создадим простой текстовый файл — это и будет наш проект:
echo "# Мой первый проект" > README.md
Снова спросим Git, что изменилось:
git status
Ожидаемый вывод:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
Ключевое слово — Untracked (неотслеживаемый). Git заметил новый файл README.md, но пока не следит за ним. Git намеренно не хватает всё подряд: вы сами решаете, что попадёт в историю, а что нет (например, временные файлы вам не нужны). Git даже подсказывает следующий шаг: use "git add".
Шаг 5. git add — готовим файл к сохранению
Чтобы Git начал отслеживать файл и включил его в следующую сохранённую версию, добавим его командой git add:
git add README.md
Эта команда ничего не выводит — и это нормально. Проверим статус:
git status
Ожидаемый вывод:
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
Теперь файл в разделе Changes to be committed (изменения, готовые к коммиту). Git как бы подготовил список того, что войдёт в следующую версию. Пока коммита нет — есть только намерение.
note Зачем отдельный шаг
git add, почему нельзя сразу коммитить? Потому что часто вы меняете десять файлов, а сохранить хотите только три связанных между собой.git add— это способ собрать именно те изменения, которые логически образуют одну версию. Подробно эту «область подготовки» разберём в модуле про три области Git. Пока просто принимаем правило: сначалаadd, потомcommit.
Шаг 6. git commit — сохраняем версию
Теперь главный момент — сохраняем версию. Это и есть коммит. Каждому коммиту полагается сообщение: короткое объяснение, что и зачем вы сохранили. Передаётся через флаг -m (от message):
git commit -m "Первый коммит: добавил README"
Ожидаемый вывод (хеш будет другим — это нормально):
[main (root-commit) 9f2a3c1] Первый коммит: добавил README
1 file changed, 1 insertion(+)
create mode 100644 README.md
Поздравляю — у вас есть первый коммит! Разберём вывод по словам:
main— имя ветки, на которой вы находитесь.(root-commit)— это самый первый коммит в репозитории, у истории появилось начало.9f2a3c1— короткий идентификатор коммита. У каждого коммита он свой и уникальный. Что это за набор символов и откуда он берётся — разберём позже, сейчас просто примите как «номер версии».1 file changed, 1 insertion(+)— статистика: один файл, одна добавленная строка.
Спросим статус ещё раз:
git status
Ожидаемый вывод:
On branch main
nothing to commit, working tree clean
working tree clean — «всё сохранено, несохранённых изменений нет». Сравните с самым первым статусом: тогда было «No commits yet», теперь история не пуста.
Шаг 7. git log — смотрим историю
Убедимся, что версия действительно сохранена. Команда git log показывает историю коммитов:
git log
Ожидаемый вывод:
commit 9f2a3c1d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b (HEAD -> main)
Author: Ваше Имя <[email protected]m>
Date: Thu May 29 14:03:11 2026 +0300
Первый коммит: добавил README
Вот она — ваша версия, подписанная автором, датой и сообщением. То самое, чего так не хватало папке с копиями. Длинный набор символов после commit — это полный идентификатор; короткий 9f2a3c1 из прошлого шага — его начало.
Если коммитов будет много, удобнее компактный вид — по одной строке на коммит:
git log --oneline
Ожидаемый вывод:
9f2a3c1 (HEAD -> main) Первый коммит: добавил README
tip Если
git logоткрылся на весь экран и не отдаёт управление — нажмитеq(quit), чтобы выйти. Git показывает длинный вывод через постраничный просмотрщик.
Что вы только что сделали
Вы прошли полный базовый цикл Git: создали репозиторий (git init), создали файл, подготовили его (git add), сохранили версию (git commit) и посмотрели историю (git log). Между шагами вы постоянно сверялись с git status — привыкайте, это ваш главный навигатор.
Запомните этот ритм: изменил -> add -> commit. Дальше вся работа в Git — это повторение этого цикла снова и снова. В следующем уроке мы изменим файл, сделаем второй коммит и впервые увидим, как Git показывает разницу между версиями.