Git diff: сравнить ветки, коммиты и изменения в индексе

Категория: Git · Язык: Bash · Обновлено:

Команда git diff показывает построчные различия. Без аргументов она сравнивает рабочую папку с индексом, то есть показывает изменения, которые ещё не добавлены командой git add. Для проиндексированных изменений используйте git diff --staged.

Какая команда что сравнивает

Команда

Что показывает

git diff

Рабочая папка и индекс: изменения, ещё не добавленные в индекс

git diff --staged

Индекс и последний коммит: то, что попадёт в следующий коммит

git diff HEAD

Рабочая папка и последний коммит: все незакоммиченные изменения

git diff a1b2c3d e4f5a6b

Два коммита

git diff main feature/login

Концы двух веток

git diff main...feature/login

Изменения ветки с момента ответвления от main

git diff HEAD~3 -- src/app.js

Один файл относительно коммита трёхкоммитной давности

Базовые примеры

Bash
git diff                          # что изменено, но не добавлено в индекс
git diff --staged                 # что уже в индексе
git diff HEAD                     # всё, что не закоммичено
git diff HEAD~1 HEAD              # что изменил последний коммит

Сравнить две ветки

Bash
git diff main feature/login       # разница между текущими концами веток
git diff main...feature/login     # только то, что добавлено в ветку после ответвления

Разница между двумя и тремя точками важна. Если main ушёл вперёд, запись с двумя точками покажет и его новые правки как «удалённые» в ветке, а запись с тремя точками покажет только работу ветки.

Сократить вывод

Bash
git diff --stat                   # список файлов и число изменённых строк
git diff --name-only              # только имена файлов
git diff --name-status            # имена и статус: A добавлен, M изменён, D удалён
git diff --shortstat              # одна строка итога

Игнорировать пробелы и посмотреть по словам

Bash
git diff -w                       # игнорировать различия в пробелах
git diff --word-diff              # подсвечивать изменения внутри строк по словам
git diff --check                  # найти лишние пробелы в конце строк и маркеры конфликта

Сохранить изменения в файл

Bash
git diff > changes.patch          # сохранить как патч
git apply changes.patch           # применить патч в другом репозитории

Сравнить два файла вне репозитория

Bash
git diff --no-index old.txt new.txt

Частые вопросы

Почему git diff ничего не показывает после git add?

Изменения уже в индексе, а git diff без аргументов сравнивает рабочую папку именно с индексом. Используйте git diff --staged.

Как посмотреть изменения только в одной папке?

Добавьте путь после двух дефисов: git diff main feature/login -- src/.