Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 - это критически важный инструмент в повседневной работе разработчика. Он помогает убедиться, что ваш код изменяет только то, что нужно, и не содержит случайных изменений.