Урок курса

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

Git и GitHub с нуля: бесплатный курс с практикой

В прошлом уроке вы создали папку git-practice и положили в неё файл README.md. Пока это просто папка на диске — Git о ней ничего не знает.

Три области Git: рабочая папка, индекс, репозиторий

Git разделяет всё на три области, у каждой своя роль.

Рабочая папка (working tree) — то, что вы видите в файловом менеджере или в терминале командой ls. Здесь лежит README.md, здесь вы его открываете и редактируете. Git видит эту папку, но ничего в ней не трогает без вашей команды.

Индекс (index, или staging area) — промежуточная область, невидимая глазом. Когда вы решаете, что изменение готово, вы явно кладёте его в индекс. Индекс — это черновик будущего снимка: именно его содержимое Git запишет в историю при следующем коммите. Файлы в рабочей папке, которые вы туда не положили, в снимок не попадут.

Репозиторий (.git) — база данных снимков. После инициализации Git создаёт скрытую подпапку .git прямо внутри вашей рабочей папки. Все коммиты, вся история хранятся там. Сама папка git-practice с README.md остаётся рядом — это рабочая папка. .git внутри неё — это репозиторий.

Главный практический вывод: коммит фиксирует только то, что лежит в индексе в момент выполнения команды. Не всё изменённое в папке, не всё новое — только то, что вы явно туда добавили.

Если удалить папку .git, история исчезнет безвозвратно. Рабочие файлы при этом останутся нетронутыми, но репозитория больше нет — обычная папка.

Инициализация репозитория и локальная конфигурация автора

Находясь в папке git-practice, выполните:

git init -b main

Git создаст подпапку .git и выведет что-то вроде:

Initialized empty Git repository in /home/user/git-practice/.git/

Флаг -b main задаёт имя начальной ветки — main. Без него название зависит от версии Git и системных настроек, что создаёт разнобой. Указывать -b main при инициализации — хорошая привычка.

Команду git init выполняют один раз в корне папки. Повторный запуск не сломает репозиторий, но и не нужен.


Прежде чем делать коммит, Git должен знать, кто его автор. Каждый коммит несёт имя и e-mail — без этих данных Git откажется его создавать.

Задайте их локально, то есть только для этого репозитория:

git config user.name "Student"
git config user.email "student@example.com"

Без флага --global настройки записываются в файл .git/config текущего репозитория и никуда не распространяются. Это удобно для учёбы: не затрагиваете глобальные настройки системы.

Кавычки нужны там, где значение содержит пробел — как в имени "Student Name". Для одного слова они не обязательны, но не мешают.

Проверить, что записалось, можно так:

git config user.name
git config user.email

Git выведет те значения, которые вы только что сохранили.

Перевод файла в индекс: git add и git status

Сразу после git init запустите:

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

Раздел Untracked files означает: Git видит файл в рабочей папке, но не отслеживает его и в индексе его нет. Такой файл не попадёт в коммит, пока вы явно его не добавите.

Добавьте README.md в индекс:

git add README.md

Git скопирует текущее содержимое файла в индекс. Файл на диске не изменится — изменится только состояние индекса.

Снова запустите git status:

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

Теперь README.md находится в разделе Changes to be committed — он в индексе и войдёт в следующий коммит.

git status ничего не меняет и безопасен в любой момент: запускайте его столько раз, сколько нужно, чтобы понять текущее состояние.


Типичная ошибка в новом репозитории: попытаться создать первый коммит, пока README.md остаётся в Untracked files. В этом случае Git сообщает:

nothing added to commit but untracked files present

До первого коммита в нашем примере в индекс ещё не добавлен ни один файл. Выполните git add README.md и проверьте, что README.md появился в Changes to be committed.

Ответ nothing to commit, working tree clean после уже созданного коммита означает другую ситуацию: индекс совпадает с последним коммитом, а рабочие файлы не содержат новых изменений. Повторный git add неизменённого файла не создаст изменений для фиксации. Если хотите сохранить новую версию, сначала внесите нужную правку в файл и сохраните её, затем подготовьте её через git add.

Первый коммит и чтение истории: git commit -m и git log --oneline

Когда README.md в индексе, создайте коммит:

git commit -m "Add README"

Флаг -m позволяет передать сообщение прямо здесь, в командной строке, не открывая текстовый редактор. После -m обязательно укажите сообщение: git commit -m "Add README" передаёт его в кавычках и не открывает редактор. Обычный git commit без -m при наличии подготовленных изменений обычно открывает редактор сообщения. Неполная команда git commit -m без сообщения завершается ошибкой обязательного аргумента.

Git выведет примерно следующее:

[main (root-commit) e5f3a1c] Add README
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Здесь e5f3a1c — короткий хеш коммита, уникальный идентификатор этого снимка. Ваш хеш будет другим — это нормально.

Посмотрите историю:

git log --oneline

Вывод:

e5f3a1c (HEAD -> main) Add README

Каждая строка — один коммит. После первого коммита строка ровно одна: короткий хеш и сообщение. HEAD -> main показывает, что вы находитесь на ветке main и она указывает на этот коммит. Если список длинный, выйти из просмотра можно клавишей q.

Наконец, проверьте статус:

git status
On branch main
nothing to commit, working tree clean

В нашем примере рабочий README.md и его версия в индексе совпадают с последним коммитом. Индекс по-прежнему содержит сохранённую версию файла; пуст список подготовленных изменений, а не сам индекс. Новых изменений для фиксации нет, репозиторий чист.

Задача 1

Коллега говорит: «После git add README.md файл переехал в .git, поэтому в рабочей папке его больше нет». Какая поправка верно описывает роли трёх областей Git?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 2

В новой папке лежит notes.md. Репозиторий и локальные данные автора настроены, коммитов ещё нет. git status показывает только Untracked files: notes.md. После git commit -m "Add notes" первый коммит не появился. Что исправит именно эту причину?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 3

В новом репозитории уже задан user.email. Git не может определить имя автора; оно ещё не настроено. Нужно записать учебное имя Student только для текущего репозитория, сохранив глобальные настройки. Какую команду выбрать?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 4

Практика на своём компьютере: в учебной папке с README.md создайте новый репозиторий с начальной веткой main, задайте локальные имя и учебный e-mail, подготовьте README и запишите первый коммит с сообщением Add README. Затем проверьте историю и состояние проекта. Если уже выполняли пример урока, повторяйте упражнение в новой отдельной папке с новым README, сохранив прежнюю работу.

Перед запуском запишите выбранные команды в заметки: инициализация, две настройки автора, подготовка README, коммит с сообщением без открытия редактора, компактная история и статус. После выполнения сопоставьте свой вывод с ожидаемым: одна запись истории и чистый статус; ваш хеш может отличаться.

Платформа проверяет только ответ ниже; локальный репозиторий и введённые команды вы проверяете самостоятельно.

В контрольном опыте первая фиксация уже прошла успешно. Требуется увидеть компактную историю, не создавая ещё одного коммита и не меняя подготовленные файлы. Какая команда подходит?

Выберите один вариант
Без регистрации · результат не сохраняется

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку