← Назад к вопросам

Что такое git diff?

2.0 Middle🔥 191 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

git diff

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

Основные концепции

Diff показывает добавленные строки (обычно зелёные), удалённые строки (красные) и контекст вокруг них. Это помогает разработчикам ревьюировать код перед коммитом или pull request.

Unified diff - стандартный формат, где строки начинаются с + (добавлено), - (удалено) или (контекст).

Основные команды git diff

1. git diff (изменения, не staging area)

Показывает изменения в рабочей директории, которые ещё не добавлены в staging area:

git diff
# Показывает все изменения в рабочей директории

2. git diff --staged (или --cached)

Показывает изменения, которые уже добавлены в staging area и готовы к коммиту:

git add src/main/java/PaymentService.java
git diff --staged
# Показывает только те изменения, которые будут в следующем коммиту

3. git diff <commit>

Сравнивает текущие изменения с конкретным коммитом:

git diff HEAD
# Показывает разницу между рабочей директорией и последним коммитом

git diff HEAD~1
# Сравнивает с коммитом перед последним

4. git diff <branch1> <branch2>

Сравнивает две ветки целиком:

git diff main feature/new-payment
# Показывает все изменения, которые есть в feature/new-payment, но нет в main

5. git diff <file>

Показывает изменения конкретного файла:

git diff src/main/java/PaymentService.java
# Только изменения в этом файле

Практический пример

Предположим, я разрабатываю новую функцию в Java:

# 1. Я отредактировал файл PaymentService.java
git diff src/main/java/PaymentService.java

Вывод может выглядеть так:

--- a/src/main/java/PaymentService.java
+++ b/src/main/java/PaymentService.java
@@ -5,10 +5,15 @@
 public class PaymentService {
     private PaymentGateway gateway;
 
-    public PaymentResult pay(Payment payment) {
-        return gateway.process(payment);
+    public PaymentResult pay(Payment payment) throws PaymentException {
+        if (payment.getAmount() <= 0) {
+            throw new PaymentException("Amount must be positive");
+        }
+        return gateway.process(payment);
     }
 
+    public PaymentResult refund(String transactionId, BigDecimal amount) {
+        return gateway.refund(transactionId, amount);
+    }
 }

Здесь:

  • Строки с - - удалённый код
  • Строки с + - добавленный код
  • Строки без префикса - контекст (не изменилась)

Более продвинутые опции

git diff --stat

Показывает статистику изменений (сколько строк добавлено/удалено в каждом файле):

git diff --stat

Вывод:
 src/main/java/PaymentService.java | 15 ++++++++++++---
 src/test/java/PaymentServiceTest.java | 8 ++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

git diff -p (или --patch)

Показывает подробный diff с контекстом (по умолчанию):

git diff -p HEAD

git diff --color

Раскрашивает output для лучшей читаемости:

git diff --color

git diff --ignore-whitespace

Игнорирует изменения в пробелах и табуляции:

git diff --ignore-whitespace
# Полезно, когда кто-то переформатировал код

git diff -U5

Показывает больше контекста (5 строк вокруг изменений вместо 3):

git diff -U5

Сравнение нескольких коммитов

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

# Разница между HEAD и 2 коммита назад
git diff HEAD HEAD~2

# Все изменения в текущей ветке по сравнению с main
git diff main...HEAD
# Три точки показывают: что есть в HEAD, но нет в main

Пример code review с git diff

Когда я готовлю pull request:

# 1. Смотрю все свои изменения
git diff main..HEAD
# или
git diff origin/main..HEAD

# 2. Сравниваю с последним коммитом
git diff HEAD~1

# 3. Проверяю, что ничего не сломалось
git diff --stat

Когда использовать git diff в работе

Перед добавлением в staging area:

git diff
# Проверяю, что я изменил то, что нужно было

Перед коммитом:

git diff --staged
# Проверяю, что я коммичу только то, что нужно

Перед pull request:

git diff origin/main..HEAD
# Смотрю все свои изменения для ревью

При решении конфликтов:

git diff HEAD
# Вижу, что именно пошло не так

Инструменты для красивого diff

В конфиге Git можно настроить красивые инструменты:

# ~/.gitconfig
[diff]
    tool = vimdiff

[difftool]
    prompt = false

git difftool
# Откроет красивое сравнение в IDE/редакторе

git diff в IDE

В современных IDE (IntelliJ IDEA, VS Code) есть встроенные инструменты для diff, которые показывают изменения визуально с подсветкой синтаксиса.

Это очень удобнее, чем консоль, потому что:

  • Подсветка синтаксиса
  • Можно быстро переходить между файлами
  • Полезные горячие клавиши для навигации
  • Можно видеть inline comments коллег

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

Ошибка: забыл посмотреть diff перед коммитом

git commit -m "Fix bug" 
# ... потом понял, что коммитнул не то

Правильно:

git diff --staged
# Проверяю ещё раз перед коммитом

git diff - это критически важный инструмент в повседневной работе разработчика. Он помогает убедиться, что ваш код изменяет только то, что нужно, и не содержит случайных изменений.

Что такое git diff? | PrepBro