Какие знаешь способы просмотра истории коммитов в Git?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Просмотр истории коммитов в Git — команды и инструменты
Просмотр истории коммитов — это одна из самых важных операций при работе с Git. Понимание того, как читать и анализировать историю, критично для отладки, code review и документирования проекта.
git log — базовая команда
git log — основная команда для просмотра истории коммитов:
# Самый простой способ
git log
# Вывод:
# commit 3d5a8f2c9e1b4f7a6c2d8e9f0a1b2c3d (HEAD -> main)
# Author: John Doe <john@example.com>
# Date: Wed Mar 20 2024 15:30:45 +0000
#
# Fix authentication bug in login service
#
# commit 2c4b7e1a9d0f3e8c5b6a7d8e9f0a1b2c
# Author: Jane Smith <jane@example.com>
# Date: Tue Mar 19 2024 10:20:30 +0000
#
# Add new payment processing feature
Форматирование вывода git log
Однострочный вывод:
git log --oneline
# Вывод:
# 3d5a8f2 Fix authentication bug in login service
# 2c4b7e1 Add new payment processing feature
# 1b3a6d9 Refactor database connection pool
Граф веток (очень полезно для понимания структуры):
git log --all --graph --decorate --oneline
# Вывод:
# * 3d5a8f2 (HEAD -> main) Fix authentication bug
# * 2c4b7e1 Add payment processing
# |\n# | * 5f6e9a1 (feature/notifications) Add email notifications
# | * 4e5d8c0 Add notification templates
# |/
# * 1b3a6d9 Refactor database connection
Фильтрация коммитов
По автору:
# Все коммиты от определённого автора
git log --author="John Doe"
git log --author="john@example.com"
# Исключить автора
git log --all --not --author="John"
По дате:
# Коммиты за последние 7 дней
git log --since="7 days ago"
# Коммиты в определённый период
git log --since="2024-03-01" --until="2024-03-20"
# Коммиты на этой неделе
git log --since="last Monday" --until="last Sunday"
По сообщению коммита:
# Найти коммиты с определённым словом в сообщении
git log --grep="authentication"
# Поиск с игнорированием регистра
git log --grep="bug" -i
# Регулярные выражения
git log --grep="Fix|Add|Refactor" -E
По изменённым файлам:
# Коммиты, которые меняли конкретный файл
git log -- src/main/java/UserService.java
# Коммиты, где был добавлен/удалён файл
git log --diff-filter=A -- src/main/java/NewClass.java
# Коммиты, которые трогали какую-либо папку
git log -- src/main/java/
По содержимому (введённые/удалённые строки):
# Коммиты, добавившие определённую строку кода
git log -S "public static void main" -- src/
# Коммиты, где была изменена строка (даже её часть)
git log -G "authenticationManager"
Детальный просмотр изменений
Показать изменения в каждом коммите:
# С полными дифффами
git log -p
git log -p --oneline
# Показать только статистику изменений
git log --stat
# Показать только имена изменённых файлов
git log --name-only
git log --name-status
Просмотр конкретного коммита:
# Показать что в этом коммите изменилось
git show 3d5a8f2
# Только статистика
git show --stat 3d5a8f2
# Diff конкретного файла в коммите
git show 3d5a8f2:src/main/java/UserService.java
Работа с ветками
История между ветками:
# Коммиты в main, которых нет в feature
git log feature..main
git log main...feature
# Какие коммиты в этой ветке?
git log --oneline main ^feature
# Коммиты только в этой ветке
git log --oneline --no-merges feature
Поиск проблемного коммита
git blame — кто и когда это написал:
# Показать кто написал каждую строку
git blame src/main/java/UserService.java
# Вывод:
# 3d5a8f2c (John Doe 2024-03-20 15:30:45 +0000 45) public class UserService {
# 3d5a8f2c (John Doe 2024-03-20 15:30:45 +0000 46) private UserRepository repo;
# 2c4b7e1a (Jane Smith 2024-03-19 10:20:30 +0000 47) @Transactional
# 2c4b7e1a (Jane Smith 2024-03-19 10:20:30 +0000 48) public void saveUser(User user) {
git bisect — найти коммит, где появилась ошибка:
# Начать поиск между двумя коммитами
git bisect start
git bisect bad 3d5a8f2 # последний код с ошибкой
git bisect good 1b3a6d9 # последний работающий код
# Git автоматически предложит коммит для проверки
# Проверить, работает ли он
# Сказать git результат
git bisect good # если работает
# или
git bisect bad # если не работает
# Повторять, пока git не найдёт проблемный коммит
# Выход из bisect
git bisect reset
Продвинутые опции git log
Форматирование вывода:
# Кастомный формат
git log --format="%h - %an, %ar : %s"
# Вывод: 3d5a8f2 - John Doe, 2 hours ago : Fix authentication bug
# Все доступные форматы
git log --pretty=format:"%h - %an (%ai) %s"
# Форматы: %h (хеш), %an (автор), %ar (относит. дата), %ai (точная дата), %s (сообщение)
Статистика:
# Кто больше всего коммитил
git log --pretty=format:"%an" | sort | uniq -c | sort -rn
# Какой день недели люди коммитят чаще всего
git log --pretty=format:"%aD" | awk '{print $1}' | sort | uniq -c
# Количество добавленных и удалённых строк
git log --numstat --pretty=format: | awk '{add+=$1; sub+=$2} END {print "added lines:", add, "\nremoved lines:", sub}'
Инструменты с GUI
gitk — встроенный Git GUI:
# Откроет окно с визуальным просмотром истории
gitk
# Только определённая ветка
gitk main
# С фильтром
gitk --author="John"
GitHub/GitLab веб-интерфейс:
# Просмотр истории на GitHub
https://github.com/owner/repo/commits/main
# История конкретного файла
https://github.com/owner/repo/commits/main/src/UserService.java
# Сравнение двух коммитов
https://github.com/owner/repo/compare/commit1...commit2
IDE интеграция (IntelliJ IDEA, VS Code):
// В IntelliJ IDEA
// View → Tool Windows → Git → Log
// Или Cmd+K (Mac) / Ctrl+K (Windows)
// Показывает граф веток, фильтр по автору, поиск по сообщению
// Двойной клик на коммит = просмотр изменений
// Right-click = дополнительные опции (cherry-pick, revert и т.д.)
Комбинированные примеры
Найти когда была введена баг:
# Найти коммит, который добавил определённую строку
git log -S "buggyFunction" -p -- src/
# Показать полный контекст
git log -p --follow -- src/main/java/UserService.java
История деплоя:
# Коммиты в production ветке
git log main --since="1 week ago" --pretty=format:"%h - %an - %s"
# Что было деплойено за последний месяц
git log --tags --pretty=format:"%h - %an - %d - %s" --since="1 month ago"
Analyze changes in a specific feature:
# Коммиты в feature ветке
git log main..feature-branch --oneline
# Статистика изменений
git log main..feature-branch --stat
# Все изменения в diff формате
git log main..feature-branch -p
Лучшие практики
-
Пиши понятные сообщения коммитов:
# Плохо git commit -m "fix" # Хорошо git commit -m "Fix NullPointerException in UserService.findById()" -
Регулярно просматривай историю:
# Перед code review git log --oneline main..feature-branch # Перед deploy git log --oneline production..main --stat -
Используй git blame для понимания кода:
# Когда видишь странный код git blame -L 100,150 src/main/java/UserService.java -
Для отладки используй git bisect:
# Когда не знаешь, в каком коммите баг git bisect start -
Алиасы для частых операций:
git config --global alias.lg "log --all --graph --decorate --oneline" git config --global alias.recent "log --oneline -10" git lg # теперь просто вызываешь алиас