git diff

Команда для сравнения изменений: между рабочей директорией, staging-area и коммитами.

Зачем нужно

git diff показывает конкретные строки, которые были добавлены или удалены, в отличие от git status, который только перечисляет изменённые файлы. Это незаменимый инструмент для ревью собственных изменений перед коммитом, сравнения веток и выяснения, что именно изменилось между двумя точками истории.

Где используется

  • Проверка изменений перед git add и git commit
  • Сравнение текущей ветки с main перед отправкой Pull Request
  • Просмотр что изменилось в конкретном коммите
  • Поиск регрессии: сравнение двух тегов или коммитов

Основной контент

Базовые варианты

# Изменения в рабочей директории (не в staging)
git diff

# Изменения в staging (что войдёт в следующий commit)
git diff --staged
# или синоним
git diff --cached

# Изменения конкретного файла
git diff src/app.js

# Изменения конкретного файла в staging
git diff --staged src/app.js

Сравнение коммитов и веток

# Разница между двумя коммитами
git diff abc1234 def5678

# Разница между текущей веткой и main
git diff main

# Разница между двумя ветками
git diff main feature/auth

# Что изменилось в ветке feature/auth относительно точки ответвления
git diff main...feature/auth

# Изменения конкретного коммита (что было добавлено этим коммитом)
git diff abc1234~1 abc1234

Просмотр статистики без деталей

# Только имена изменённых файлов
git diff --name-only

# Имена файлов со статусом (M=modified, A=added, D=deleted)
git diff --name-status main

# Краткая статистика (+/- строк)
git diff --stat main
# src/app.js    | 15 +++++++++------
# src/utils.js  |  3 +--
# 2 files changed, 9 insertions(+), 9 deletions(-)

Формат вывода diff

--- a/src/app.js        ← старая версия
+++ b/src/app.js        ← новая версия
@@ -10,7 +10,8 @@      ← позиция в файле
 const PORT = 3000;
-app.listen(PORT);                      ← удалённая строка (красная)
+app.listen(PORT, () => {               ← добавленная строка (зелёная)
+  console.log(`Server on port ${PORT}`);
+});

Частые ошибки

  • Путать git diff и git diff --staged — первый показывает то, что ещё не добавлено в индекс, второй — то, что уже добавлено
  • Запускать git diff после git add и удивляться пустому выводу — изменения ушли в staging, нужен git diff --staged
  • Не знать про git diff main...feature — три точки показывают только изменения ветки, а не все различия между ними

Связанные темы

Ресурсы