Урок курса
Первый репозиторий и первый коммит
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, коммит с сообщением без открытия редактора, компактная история и статус. После выполнения сопоставьте свой вывод с ожидаемым: одна запись истории и чистый статус; ваш хеш может отличаться.
Платформа проверяет только ответ ниже; локальный репозиторий и введённые команды вы проверяете самостоятельно.
В контрольном опыте первая фиксация уже прошла успешно. Требуется увидеть компактную историю, не создавая ещё одного коммита и не меняя подготовленные файлы. Какая команда подходит?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
