git diff: что именно изменилось
Обновлено 31 июля 2026 г.
git diff показывает построчную разницу: какие строки исчезли, какие появились и в каком месте файла это произошло.
git status отвечает на вопрос «какие файлы тронуты». git diff отвечает на вопрос «что в них тронуто». Читать её вывод стоит перед каждым коммитом: это последняя возможность заметить, что в снимок уезжает лишнее.
$ git diff
diff --git a/report.txt b/report.txt
index a90b4d6..0ecce57 100644
--- a/report.txt
+++ b/report.txt
@@ -1,4 +1,5 @@
Отчёт за третий квартал
-Продажи выросли.
+Продажи выросли на 12%.
В команду взяли двух человек.
+Бюджет на следующий квартал утверждён.Первые четыре строки - шапка: имя файла, сокращённые имена внутренних объектов git и права доступа. Полезное ниже.
Строка @@ -1,4 +1,5 @@ говорит, какой кусок файла показан: слева было четыре строки начиная с первой, справа стало пять. Такой кусок называют ханк (hunk), и в большом файле их несколько. Дальше идут сами строки. С пробелом в начале - не менялась, показана для контекста. С - - была раньше, теперь её нет. С + - появилась. Правка внутри строки выглядит как пара из минуса и плюса: половины строки для git не существует.
Рабочий каталог, индекс и коммит
Зоны три, и diff всегда сравнивает две из них.
$ git add report.txt
$ git diff # пусто: рабочий каталог совпадает с индексом
$ git diff --staged # ровно то, что уйдёт в следующий коммит
$ git diff HEAD # всё вместе: и в индексе, и ещё не в нёмМолчаливый git diff сразу после git add пугает: правки как будто пропали. Они переехали в индекс (staging area), и показывает их теперь --staged.
Между коммитами и ветками
Тем же diff сравнивают любые две точки истории:
$ git diff 438482b d5e5bbe # между двумя коммитами
$ git diff HEAD~1 HEAD # последний коммит против предыдущего
$ git diff main draft # ветка против ветки
$ git diff main draft -- report.txt # то же, но только по одному файлуКогда строк слишком много, сводка по файлам читается быстрее:
$ git diff --stat main draft
report.txt | 2 ++
1 file changed, 2 insertions(+)Частые ошибки
Порядок аргументов важен: git diff A B показывает, что нужно сделать с A, чтобы получилось B, а не наоборот. Новый файл в выводе не появится вовсе, пока git о нём не знает: неотслеживаемые файлы diff не сравнивает, их видно только в git status. И вывод на длинном файле открывается в постраничном просмотрщике, выход из него - клавиша q.
Где это в учебнике
Подробный разбор - Глава 4. Посмотреть, отменить, спрятать лишнее. Рядом пригодятся git status и git log.
Потренироваться руками - в интерактивном уроке Отмена изменений.