Урок курса

Проверяем, что попадёт в коммит

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.

Границы сравнения git diff и git diff --staged

Задача 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 в полном снимке нового коммита и вне него?

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

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

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

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