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— три точки показывают только изменения ветки, а не все различия между ними