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.

Потренироваться руками - в интерактивном уроке Отмена изменений.