Урок курса
Проверяем, что попадёт в коммит
Git и GitHub с нуля: бесплатный курс с практикойgit add записывает в индекс текущую версию файла, а более поздние правки остаются в рабочей папке. git diff показывает разницу между рабочей папкой и индексом; git diff --staged — между индексом и последним коммитом. Эти два сравнения отделяют неподготовленные правки от изменений, которые зафиксирует git commit.
git diff: что изменено, но ещё не в индексе
git diff без аргументов сравнивает рабочую папку с индексом и показывает только те изменения, которые в индекс ещё не попали.
Каждая строка в выводе начинается с символа, который говорит, что произошло:
-— эта строка есть в индексе (то есть в том состоянии, которое было зафиксировано при последнем git add или коммите).+— эта строка появилась в рабочей папке, но в индекс ещё не добавлена.
Если изменений вне индекса нет, вывод будет пустым. Это не значит, что изменений вообще нет — возможно, они уже добавлены через git add.
Команда ничего не меняет: она только читает и показывает. Можно запускать сколько угодно раз без последствий.
Пример вывода, когда в README.md добавлена строка «Раздел 2», но git add ещё не выполнялся:
$ git diff
diff --git a/README.md b/README.md
index 223118c..adfb727 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
Введение
+Раздел 2
Строка +Раздел 2 — это то, что есть в рабочем файле, но отсутствует в индексе. Строка Введение без знака — общая для обеих версий, она не изменилась.
git diff --staged: что войдёт в следующий коммит
git diff --staged сравнивает уже другую пару: индекс и последний коммит (HEAD). Эта команда показывает то, что зафиксируется при выполнении git commit прямо сейчас.
Здесь важно не перепутать границы:
git diff— рабочая папка ↔ индекс (что ещё не добавлено).git diff --staged— индекс ↔ HEAD (что уже добавлено и пойдёт в коммит).
Если после git add запустить просто git diff, вывод по добавленному файлу окажется пустым — рабочий файл и индекс совпадают. Это легко принять за «ничего не изменилось», но это неверно: изменение есть, оно просто уже в индексе. Чтобы его увидеть, нужен git diff --staged.
Пример. Выполнили git add README.md, затем:
$ git diff --staged
diff --git a/README.md b/README.md
index 223118c..adfb727 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
Введение
+Раздел 2
Здесь - означает, что было в последнем коммите, + — что появится в новом снимке. Если индекс совпадает с HEAD (то есть ничего не добавлено), вывод будет пустым.
git diff --staged — это финальная проверка перед коммитом: убеждаемся, что в индексе лежит именно нужное изменение, не больше и не меньше.
git add по пути: обновляем версию выбранного файла в индексе
Когда в рабочей папке изменены несколько отслеживаемых файлов, git add с явным путём обновляет в индексе версию только указанного файла.
Допустим, исходный коммит уже содержит README.md и notes.md, индекс совпадает с этим коммитом, а в рабочей папке изменены оба файла. Команда
$ git add README.md
записывает в индекс текущую версию README.md. Запись notes.md сохраняет прежнюю версию из последнего коммита; новая рабочая правка notes.md в индекс не попадает.
После этого, если других изменений нет и README.md больше не редактировали:
git diffпокажет только новую правку notes.md: она есть в рабочей папке, но отсутствует в его версии в индексе.git diff --stagedпокажет только изменение README.md относительно последнего коммита.
Индекс — будущий полный снимок отслеживаемых файлов. Явный git add README.md обновляет одну запись, а остальные сохраняются. Новый коммит будет содержать обновлённый README.md и прежний notes.md. Вне коммита останется новая правка notes.md, а не сам файл.
Повторный git add неизменённого отслеживаемого файла не создаёт новой разницы с последним коммитом. Если путь не существует, Git сообщит об ошибке.
Рабочий цикл: status → diff → add → diff --staged → commit → status
Подготовка отдельного примера. Создайте новую пустую папку git-review рядом с прежней учебной папкой: в терминале перейдите в её родительский каталог через cd .., затем выполните знакомые команды. Если такое имя уже занято, выберите новое.
mkdir git-review
cd git-review
git init -b main
git config user.name "Student"
git config user.email "student@example.com"
Через обычный текстовый редактор сохраните в этой папке два файла UTF-8: README.md с единственной строкой Введение и notes.md с единственной строкой Начало. Завершите каждую строку переводом строки. Других файлов в примере нет. Зафиксируйте обе исходные версии:
git add README.md
git add notes.md
git commit -m "Базовый снимок"
git status
Последняя команда должна сообщить nothing to commit, working tree clean: оба файла уже отслеживаются, рабочая папка и индекс совпадают с базовым коммитом. Если статус иной, проверьте сохранённые файлы и завершите этот шаг перед продолжением.
Теперь через редактор добавьте вторую строку Раздел 2 в README.md и вторую строку Заметка в notes.md; сохраните файлы с переводом строки в конце. git add после этих правок пока не выполняйте. Других изменений в рабочей папке и индексе нет.
Далее показаны значимые части вывода git status. ID в ответе git commit — иллюстрация; в вашем репозитории он будет своим.
Шаг 1. Смотрим общее состояние.
$ git status
Changes not staged for commit:
modified: README.md
modified: notes.md
Оба файла отслеживаются и изменены в рабочей папке. Их прежние версии остаются в индексе; новые правки ещё не добавлены.
Шаг 2. Смотрим, что именно изменено.
$ git diff
diff --git a/README.md b/README.md
index 223118c..adfb727 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
Введение
+Раздел 2
diff --git a/notes.md b/notes.md
index 7da1033..bfdeb93 100644
--- a/notes.md
+++ b/notes.md
@@ -1 +1,2 @@
Начало
+Заметка
Видны правки в обоих файлах.
Шаг 3. Обновляем в индексе только версию README.md.
$ git add README.md
Шаг 4. Проверяем подготовленные изменения.
$ git diff --staged
diff --git a/README.md b/README.md
index 223118c..adfb727 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
Введение
+Раздел 2
В diff видна только новая правка README.md. notes.md здесь не появится, потому что его версия в индексе совпадает с базовым коммитом.
Если сейчас запустить просто git diff — он покажет только notes.md, потому что новая версия README.md уже записана в индекс и рабочий файл с индексом совпадают. Пустой вывод по README.md — не потеря правки, а подтверждение, что она в индексе.
Шаг 5. Делаем коммит.
$ git commit -m "Обновить README"
[main f00c774] Обновить README
1 file changed, 1 insertion(+)
Коммит изменил только README.md. Полный снимок содержит обновлённый README.md и notes.md в прежней версии со строкой Начало. Новая строка Заметка осталась в рабочей папке.
Шаг 6. Проверяем итоговое состояние.
$ git status
Changes not staged for commit:
modified: notes.md
notes.md виден как изменённый: его новая правка осталась вне коммита. Сам файл сохранён в коммите в прежней версии и остаётся на диске с обеими строками, готовый к следующему git add.

Задача 1
Оба файла уже отслеживаются. Других изменений нет. А — исходный текст, Б — исходный текст с новой строкой README, В — исходный текст с новой строкой notes.
| Файл | Последний коммит | Индекс | Рабочая папка |
|---|---|---|---|
| README.md | А | Б | Б |
| notes.md | А | А | В |
Какая пара описаний правильно предсказывает оба сравнения?
Задача 2
config.txt и log.txt уже входят в последний коммит. Оба изменены только в рабочей папке; индекс пока совпадает с коммитом. Нужно подготовить новую версию config.txt, оставив новую правку log.txt вне следующего коммита. Какое действие подходит?
Задача 3
Самостоятельная практика: подготовьте отдельный репозиторий с базовым коммитом README.md и notes.md по инструкции этого урока. Через редактор добавьте «Раздел 2» в README и «Заметка» в notes. Проверьте оба изменения через diff, подготовьте только README, проверьте staged diff, создайте коммит «Обновить README» и проверьте status. Запишите выполненные команды по порядку и содержимое обоих сравнений до коммита.
Платформа проверяет только ответ ниже; действия в своём репозитории и письменные ответы вы проверяете самостоятельно.
После успешного коммита из практики файлы больше не редактировали и других действий не выполняли. git diff --staged показывает пустой вывод, а git status показывает только notes.md как modified в «Changes not staged for commit». Какое описание правильно объясняет состояние notes.md в полном снимке нового коммита и вне него?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
