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

Какие знаешь способы просмотра истории коммитов в Git?

1.0 Junior🔥 231 комментариев
#Soft Skills и карьера

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

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

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

Просмотр истории коммитов в 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

Лучшие практики

  1. Пиши понятные сообщения коммитов:

    # Плохо
    git commit -m "fix"
    
    # Хорошо
    git commit -m "Fix NullPointerException in UserService.findById()"
    
  2. Регулярно просматривай историю:

    # Перед code review
    git log --oneline main..feature-branch
    
    # Перед deploy
    git log --oneline production..main --stat
    
  3. Используй git blame для понимания кода:

    # Когда видишь странный код
    git blame -L 100,150 src/main/java/UserService.java
    
  4. Для отладки используй git bisect:

    # Когда не знаешь, в каком коммите баг
    git bisect start
    
  5. Алиасы для частых операций:

    git config --global alias.lg "log --all --graph --decorate --oneline"
    git config --global alias.recent "log --oneline -10"
    git lg  # теперь просто вызываешь алиас