Как посмотреть изменения в Git: полное руководство
В Git есть несколько команд для просмотра изменений, и каждая отвечает на свой вопрос. git status — что сейчас изменено? git diff — что именно изменилось в коде? git log — что менялось в прошлом? Эта статья объясняет, когда использовать каждую команду.
git status: общий обзор состояния #
git status — первая команда, которую нужно запускать для понимания ситуации:
git status
Пример вывода:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/auth.js ← в индексе (будет в коммите)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: src/utils.js ← изменён, не в индексе
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/new-feature.js ← новый файл, не отслеживается
Три категории: «Changes to be committed» — в индексе, войдёт в следующий коммит; «Changes not staged» — изменено, но не добавлено; «Untracked files» — новые файлы, Git не знает о них.
Краткий формат:
git status -s
# M src/auth.js ← M в первой колонке = в индексе
# M src/utils.js ← M во второй колонке = не в индексе
# ?? src/new.js ← ?? = не отслеживается
git diff: что именно изменилось #
git diff показывает точные изменения в коде (построчно):
# Изменения не в индексе
git diff
# Изменения в индексе (что войдёт в коммит)
git diff --staged
# Только статистику (без построчного diff)
git diff --stat
Типичный вывод:
--- a/src/utils.js
+++ b/src/utils.js
@@ -15,6 +15,8 @@
function formatDate(date) {
- return date.toISOString();
+ const options = { year: 'numeric', month: 'long', day: 'numeric' };
+ return date.toLocaleDateString('ru-RU', options);
}
Строки с - удалены, с + добавлены.
Быстрая проверка перед коммитом:
git status # что изменено?
git diff --staged # что именно войдёт в коммит?
git commit -m "..."
git log: история прошлых изменений #
git log показывает историю коммитов:
# Полная история
git log
# Компактный формат
git log --oneline -10
# С графом веток
git log --graph --oneline --all
Для просмотра изменений в коммитах:
# Что изменилось в последнем коммите
git show
# История конкретного файла
git log --oneline src/auth.js
# Изменения в файле по коммитам
git log -p src/auth.js
Просмотр изменений в конкретном файле #
# Что изменилось в файле (не в индексе)
git diff src/main.js
# История изменений файла
git log --oneline src/main.js
# Полный diff истории файла
git log -p src/main.js
# Кто и когда изменил каждую строку
git blame src/main.js
Просмотр изменений, не отправленных на сервер #
# Что запушим (коммиты, которых нет на сервере)
git log origin/main..HEAD
# Что запушим в виде diff
git diff origin/main HEAD
git diff с дополнительными опциями #
Более продвинутые варианты git diff:
# Сравнить две ветки
git diff main feature/new-feature
git diff main..feature/new-feature # такой же результат
git diff main...feature/new-feature # только изменения в feature ветке
# Сравнить два коммита
git diff abc1234 def5678
# Сравнить коммит с parent
git diff HEAD~1 HEAD
git diff abc1234^..abc1234 # коммит abc1234 против его parent
# Diff только для конкретного файла
git diff src/auth.js
git diff main..feature src/auth.js # между ветками, но только файл
# Игнорировать пробелы
git diff -w # игнорировать все пробелы
git diff -b # игнорировать changes в пробелах
# Word-level diff (вместо line-level)
git diff --word-diff
git diff --word-diff-regex='[^[:space:]]+'
# Только имена файлов (без содержимого)
git diff --name-only
git diff --name-status # с статусом (M=modified, A=added, D=deleted)
# Статистика изменений
git diff --stat
git diff --stat main..feature
# Проценты изменений
git diff --diffstat
# Числовые изменения
git diff -U0 # 0 lines of context (только что изменилось, без контекста)
git diff -U10 # 10 lines of context
git show: просмотр конкретного коммита #
git show — специальная команда для просмотра одного коммита:
# Показать последний коммит
git show
# Показать конкретный коммит
git show abc1234
# Показать определённый файл из конкретного коммита
git show abc1234:src/main.js
# Без diff, только информация о коммите
git show --stat abc1234
# Показать однострочное имя коммита
git show --oneline abc1234
# Format вывода
git show --format=medium abc1234
git show --format=fuller abc1234
git show --format=raw abc1234
git log -p: история с дифами #
История всех изменений в файле:
# История файла со всеми дифами
git log -p src/auth.js
# Последние 3 коммита с дифами
git log -p -3
# История функции (требует -L опцию)
git log -L :functionName:src/file.js
git log -L 10,20:src/file.js # строки 10-20 файла
# История с графом и дифами
git log -p --graph --oneline --all
# История одного автора
git log -p --author="John Doe"
# История за период времени
git log -p --since="2024-01-01" --until="2024-12-31"
git blame: кто и когда изменил каждую строку #
git blame показывает для каждой строки: кто её добавил, когда, в каком коммите:
# Посмотреть кто изменил каждую строку
git blame src/main.js
# Вывод:
# 7c1234ab src/main.js (Alice 2024-01-15 10:30:45 +0000 1) function start() {
# 7c1234ab src/main.js (Alice 2024-01-15 10:30:45 +0000 2) console.log('starting');
# 8d5678ef src/main.js (Bob 2024-02-20 14:20:10 +0000 3) init();
# 8d5678ef src/main.js (Bob 2024-02-20 14:20:10 +0000 4) }
# Только хеши коммитов
git blame -l src/main.js
# Считать пробелы и пунктуацию (не просто пробелы)
git blame -w src/main.js
# Показать дополнительную информацию
git blame -e src/main.js # email вместо имени
git blame --date=short src/main.js
# Для определённых строк
git blame -L 10,20 src/main.js
# Интерактивно с git-log
git blame -C src/main.js # показать если строка скопирована из другого файла
Сравнение веток и коммитов #
Быстро посмотреть что отличается:
# Какие коммиты в feature но не в main
git log main..feature --oneline
# Какие коммиты в main но не в feature
git log feature..main --oneline
# Кол-во коммитов
git log main..feature --oneline | wc -l
# Все коммиты между ветками в обе стороны
git log main...feature --oneline
# Файлы которые отличаются
git diff main feature --name-only
# С статусом
git diff main feature --name-status
# M src/auth.js (modified)
# A src/new.js (added)
# D src/old.js (deleted)
Визуальные инструменты для diff #
Настройка внешних инструментов:
# VS Code как difftool
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
# Использование
git difftool src/auth.js
# Meld (Linux)
git config --global diff.tool meld
git difftool src/auth.js
# KDiff3
git config --global diff.tool kdiff3
git difftool src/auth.js
# Beyond Compare
git config --global diff.tool bc
git config --global difftool.bc.cmd 'bcomp $LOCAL $REMOTE'
Интерактивный просмотр в IDE #
Все современные IDE поддерживают Git визуально:
VS Code:
- Ctrl+Shift+G: Source Control panel
- Видны все изменённые файлы
- Клик на файл → diff боком
- Встроенный merge conflict resolver
- Timeline view (история файла)
JetBrains (IntelliJ, PyCharm, WebStorm):
- Alt+9: Git tool window
- Или: View → Tool Windows → Git
- Visual diff с подсветкой синтаксиса
- Blame annotations (кто и когда)
- Merge conflict resolution UI
Sublime Text:
- Package: GitGutter (shows diff in gutter)
- Package: Git (Git commands)
- Или просто запустить: git diff в терминале
Проверка перед commit #
Типичный workflow для проверки перед коммитом:
# 1. Посмотреть общий статус
git status
# 2. Посмотреть точные изменения (не staged)
git diff
# 3. Добавить в индекс
git add src/auth.js
# 4. Посмотреть что именно будет в коммите
git diff --staged
# 5. Если всё ОК
git commit -m "feat: add authentication"
# 6. Проверить что залетело в коммит
git show
Практические примеры #
# Состояние репозитория
git status
# Краткий формат статуса
git status -s
# Просмотр точных изменений в файлах
git diff
# Изменения, готовые к коммиту
git diff --staged
# Просмотр истории коммитов
git log --oneline -10
# История коммитов с изменениями
git log -p -3
# Информация о конкретном коммите
git show a1b2c3d
# Просмотр только добавленных и удалённых строк
git diff --stat
# История конкретного файла
git log -p src/main.js
# Просмотр веток и их позиций
git branch -v
# Изменения, которые не отправлены на сервер
git log origin/main..HEAD
# Статус с подробной информацией
git status --porcelain
# Просмотр изменений в конкретном диапазоне
git log -p main..feature/new
# Всё что изменилось на текущей ветке
git diff main...HEAD
# История удаления файла
git log --diff-filter=D --summary | grep delete
# Показать коммит когда файл был последний раз изменён
git log -1 --format=%H -- src/main.js
# Просмотр веток которые уже слиты
git branch --merged
# Просмотр веток которые ещё не слиты
git branch --no-merged
Быстрые команды для повседневной работы #
Шпаргалка для постоянного использования:
# Перед commit: что добавится?
git diff --cached # или --staged (в новых версиях)
# После commit: что залетело?
git show # последний коммит
git log -1 -p # то же самое
# Что я сделал сегодня?
git log --since="8am" --until="now" --oneline
# Чего не отправить на сервер?
git log origin/main..HEAD
# Кто последний менял файл?
git log -1 --format=%an -- src/main.js
# Когда файл был создан?
git log --follow --format=%H -- src/main.js | tail -1
# Размер изменений
git diff --stat main..HEAD
# Статус как для скрипта
git status --porcelain > status.txt
# Виды изменений
git diff --name-status main..HEAD
# Просмотр неcommented кода (WIP коммитов)
git log --oneline --grep="WIP" --grep="TODO"
# История конфликтов merge
git log --oneline | grep Merge
Анализ и статистика #
Получить информацию о разработке:
# Кол-во коммитов по авторам
git shortlog -sn
# Изменённые строки по авторам
git shortlog -sn -e
# Статистика по файлам (добавлено/удалено)
git log --stat | grep "files changed"
# Самые часто изменяемые файлы
git log --oneline --name-only | sort | uniq -c | sort -rn
# Анализ merge коммитов (разрешение конфликтов)
git log --merges --oneline
# Когда была последняя активность на ветке
git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate)'
# Список всех веток отсортированных по дате
git branch -a --sort=-version:refname --sort=-committerdate
Часто задаваемые вопросы #
Как увидеть, что изменилось в файле перед коммитом? git diff <файл> — для не добавленных изменений. git diff --staged <файл> — для уже добавленных в индекс.
Какая команда показывает все изменения в репозитории? git status — общий обзор. git diff — детали не-staged изменений. git diff --staged — детали staged. Все вместе дают полную картину.
Как увидеть историю изменений конкретного файла? git log --oneline src/file.js — список коммитов. git log -p src/file.js — с диффами. git blame src/file.js — построчно с авторами.
Что означают разные символы в git status -s? В первой колонке — статус в индексе: M изменён, A добавлен, D удалён, R переименован. Во второй колонке — статус в рабочей директории. ?? — не отслеживается.
Как просмотреть изменения в удалённой ветке? git fetch origin для обновления информации, затем git diff main origin/main для сравнения.
Заключение #
Для понимания состояния репозитория достаточно трёх команд: git status (что изменено), git diff --staged (что войдёт в коммит), git log --oneline (история). Привыкните запускать их регулярно — это сделает работу с Git осознанной.