Олег Марков
Статистика изменений в Git с помощью git log --stat
Введение
Статистика изменений в истории коммитов помогает быстро понять, что именно происходило в репозитории: какие файлы менялись, насколько сильно, где были крупные рефакторинги, а где — по одному‑двум исправлениям. В Git эта задача удобно решается при помощи опции --stat у команды git log.
Смотрите, я покажу вам, как с помощью git log --stat:
- увидеть, какие файлы затронул каждый коммит;
- оценить масштаб изменений (количество добавленных и удалённых строк);
- отфильтровать вывод по файлам, автору или времени;
- настроить формат логов под свои задачи.
Мы будем двигаться от базовых примеров к более продвинутым комбинациям флагов. По ходу статьи я буду приводить практические команды и пояснять, в каких ситуациях их стоит применять.
Что делает git log --stat
Краткое описание
Команда:
git log --stat
показывает историю коммитов, а под каждым коммитом — сводку по изменённым файлам:
- список файлов;
- количество вставленных и удалённых строк в каждом файле;
- итоговую строку с суммарной статистикой по коммиту.
Давайте посмотрим, как выглядит базовый вывод.
git log --stat
Типичный фрагмент результата:
commit 7c9f5e48a9c0c42b7562de49f4b6e0b9e867c541
Author: Ivan Petrov <ivan@example.com>
Date: Mon Dec 2 10:15:23 2024 +0300
Fix user auth and update docs
src/auth/login.go | 12 ++++++++----
src/auth/session.go | 5 +++--
docs/auth.md | 7 +++++--
3 files changed, 18 insertions(+), 6 deletions(-)
Разберём этот вывод:
- строки
commit,Author,Dateи сообщение коммита — это обычныйgit log; - далее идут строки по каждому файлу:
src/auth/login.go— имя файла;| 12 ++++++++----— «мини‑диаграмма» изменений:12— всего изменённых строк (вставки + удаления);- плюсы
+— вставленные строки; - минусы
-— удалённые строки;
- последняя строка:
3 files changed— сколько файлов изменено;18 insertions(+)— сколько строк добавлено;6 deletions(-)— сколько строк удалено.
Так вы быстро видите масштаб и распределение изменений по файлам, не вдаваясь пока в подробный diff.
Базовые варианты использования git log --stat
Просмотр последних N коммитов со статистикой
Часто нужно увидеть только последние несколько коммитов. Вы можете ограничить количество записей:
git log -5 --stat
Комментарий:
-5— показать только 5 последних коммитов;--stat— добавить статистику изменений.
Так вы не просматриваете всю историю, а получаете только свежие изменения и их объём.
Просмотр статистики по конкретному файлу
Если вас интересует динамика одного файла, можно сузить вывод:
git log --stat -- path/to/file.go
Обратите внимание:
- после
--идёт путь к файлу или директории; - Git покажет только те коммиты, в которых этот файл менялся;
- статистика будет включать только этот файл (и другие, если вы укажете путь до директории).
Пример:
git log --stat -- src/auth/login.go
Так вы увидите, как часто и насколько сильно менялся конкретный файл.
Фильтрация по автору
Иногда нужно посмотреть, какие изменения вносил конкретный разработчик:
git log --stat --author="Ivan"
Комментарий:
--author="Ivan"— выберет коммиты, где имя или email автора содержитIvan;- остальной вывод (со статистикой по файлам) сохранится.
Комбинировать фильтры тоже можно. Например, только коммиты автора по определённому файлу:
git log --stat --author="Ivan" -- src/auth/login.go
Ограничение по времени
Чтобы посмотреть статистику изменений за определённый период, используйте --since и --until:
git log --stat --since="2024-11-01" --until="2024-11-30"
Или более человекочитаемые варианты:
git log --stat --since="2 weeks ago"
git log --stat --since="yesterday"
Вы можете комбинировать время и файлы:
git log --stat --since="1 month ago" -- src/
Это удобный способ понять, что произошло в проекте за месяц и в каких файлах были изменения.
Детальный разбор вывода --stat
Как читается строка с файлом
Возьмём пример строки:
src/auth/login.go | 12 ++++++++----
Разберём подробнее:
src/auth/login.go— путь к файлу относительно корня репозитория;|— визуальный разделитель;12— количество строк, которые были изменены в этом файле:- это не всегда «чистые» вставки или удаления — иногда замена строки считается как удаление одной строки и добавление одной новой;
++++++++----— гистограмма:- 8 плюсов
+— 8 вставленных строк; - 4 минуса
-— 4 удалённые строки.
- 8 плюсов
Git по умолчанию подбирает длину этой гистограммы автоматически, чтобы помещать её в строку. Если изменений много, плюсов и минусов станет больше, но точные числа всегда указаны в начале (здесь 12).
Итоговая строка с суммарной статистикой
Теперь посмотрим на итоговую строку:
3 files changed, 18 insertions(+), 6 deletions(-)
Здесь всё довольно прямолинейно:
3 files changed— количество файлов, которые вообще были затронуты в этом коммите;18 insertions(+)— суммарное количество добавленных строк по всем файлам;6 deletions(-)— суммарное количество удалённых строк.
Эта строка помогает быстро оценить «масштаб» коммита: это маленький точечный фикс или большой рефакторинг.
Параметры, влияющие на вывод --stat
Git позволяет настроить поведение --stat с помощью дополнительных опций. Смотрите, как это работает.
--stat-width
Эта опция управляет общей шириной столбца со статистикой. Например:
git log --stat --stat-width=60
Если у вас узкое окно терминала или вы хотите уменьшить перенос строк, вы можете задать более подходящее значение.
--stat-name-width
Определяет ширину колонки для имени файла:
git log --stat --stat-name-width=40
Комментарий:
- если имена файлов длинные, они будут обрезаны или переноситься;
- с помощью этого параметра можно сделать имена короче, оставив больше места для гистограммы.
--stat-graph-width
Настраивает максимальную ширину гистограммы + и -:
git log --stat --stat-graph-width=20
Это полезно, когда вы хотите сделать столбец со статистикой более компактным.
Комбинирование настроек
Вы можете объединить эти опции:
git log --stat --stat-width=80 --stat-name-width=40 --stat-graph-width=30
Так вы точнее контролируете внешний вид вывода под размеры вашего терминала или предпочтения.
Сравнение с git log -p
Важно понимать разницу между --stat и -p:
--stat— показывает только статистику (количество строк и файлы), но не сами изменения в коде;-p— показывает полный diff по каждому коммиту.
Давайте разберём на примере.
git log -1 --stat
Покажет примерно:
commit 7c9f5e48a9c0c42b7562de49f4b6e0b9e867c541
Author: Ivan Petrov <ivan@example.com>
Date: Mon Dec 2 10:15:23 2024 +0300
Fix user auth and update docs
src/auth/login.go | 12 ++++++++----
src/auth/session.go | 5 +++--
docs/auth.md | 7 +++++--
3 files changed, 18 insertions(+), 6 deletions(-)
А команда:
git log -1 -p
даст:
commit 7c9f5e48a9c0c42b7562de49f4b6e0b9e867c541
Author: Ivan Petrov <ivan@example.com>
Date: Mon Dec 2 10:15:23 2024 +0300
Fix user auth and update docs
diff --git a/src/auth/login.go b/src/auth/login.go
index 1234567..89abcd0 100644
--- a/src/auth/login.go
+++ b/src/auth/login.go
@@ -10,6 +10,10 @@ func Login(...) {
- // old logic
+ // new logic
}
...
Вы можете объединить оба флага:
git log -1 --stat -p
Тогда вы увидите и статистику, и полный diff. Это удобно, когда вы хотите сначала глазами оценить масштаб коммита (по строке с файлами и суммарной статистикой), а затем изучить конкретные изменения.
Простые практические сценарии
Оценить «вес» pull request перед ревью
Предположим, вы переключились на ветку с чужим PR. Чтобы быстро понять, насколько он большой, можно:
git log --stat main..HEAD
Комментарий:
main..HEAD— диапазон коммитов: все коммиты, которые есть в текущей ветке, но отсутствуют вmain;--stat— покажет статистику по всем этим коммитам.
Так вы увидите:
- сколько коммитов в ветке;
- какие файлы менялись;
- сколько строк в сумме добавлено и удалено.
Если изменений слишком много, вы сможете заранее спланировать ревью.
Посмотреть статистику изменений по конкретному модулю
Допустим, вы хотите понять, насколько активно меняется определённый модуль, например src/auth/. Запустите:
git log --stat -- src/auth/
Так вы увидите все коммиты, затронувшие эту директорию, со статистикой изменений только по файлам внутри неё.
Можно добавить ограничение по времени:
git log --stat --since="3 months ago" -- src/auth/
Теперь вы оцениваете только активность за последние три месяца.
Контроль за «шумными» файлами
Иногда бывают файлы, которые генерируются автоматически или часто меняются, но не слишком важны с точки зрения логики (например, package-lock.json). Вы можете исключить их из статистики git log с помощью фильтрации по пути.
Один из рабочих приёмов — смотреть статистику только по определённым поддиректориям, исключая шумные части проекта. Например:
git log --stat -- src/ tests/
Здесь мы явно указываем только те пути, которые интересны, а всё остальное, включая большие сгенерированные файлы, в статистику не попадёт.
Комбинации --stat с форматированием вывода
Использование --oneline и --stat
Если вы любите компактный формат --oneline, вы можете объединить его со статистикой:
git log --oneline --stat
Пример:
7c9f5e4 Fix user auth and update docs
src/auth/login.go | 12 ++++++++----
src/auth/session.go | 5 +++--
docs/auth.md | 7 +++++--
3 files changed, 18 insertions(+), 6 deletions(-)
a1b2c3d Add metrics for login
src/auth/login.go | 15 +++++++++++----
metrics/login.json | 3 +++
2 files changed, 14 insertions(+), 4 deletions(-)
Комментарий:
- первая строка каждого блока — короткий формат коммита;
- под ним — та же статистика, что и в обычном
--stat.
Это удобно, когда вы просматриваете историю, не вдаваясь в полные сообщения коммитов, но хотите видеть списки файлов и масштаб изменений.
Пользовательский формат + --stat
Опция --pretty позволяет настраивать формат первой части вывода (идентификатор коммита, автор, дата, сообщение). Статистика --stat к этому просто добавляется снизу.
Например:
git log --pretty=format:"%h %an %ar %s" --stat
Комментарий по плейсхолдерам:
%h— короткий хеш коммита;%an— имя автора;%ar— относительное время (например,2 days ago);%s— тема сообщения коммита.
Так вы получаете кастомный заголовок каждого коммита и под ним статистику по файлам.
Вы можете добавить перенос строки после заголовка для читабельности:
git log --pretty=format:"%h %an %ar%n%s%n" --stat
Здесь %n означает перевод строки. Так сообщение коммита будет на отдельной строке, а затем — статистика.
Диапазоны и фильтрация истории вместе с --stat
Диапазон между двумя ветками или коммитами
Часто нужно увидеть статистику изменений между двумя точками в истории: например, между релизами или ветками.
git log --stat v1.0.0..v1.1.0
Здесь:
v1.0.0..v1.1.0— все коммиты, которые есть вv1.1.0, но отсутствуют вv1.0.0.
То же самое можно сделать между ветками:
git log --stat main..feature/new-login
Так вы получите статистику изменений, которые принесёт новая фича относительно основной ветки.
Использование --grep вместе с --stat
Если вы хотите найти коммиты по ключевому слову в сообщении и для них посмотреть статистику, используйте --grep:
git log --stat --grep="auth"
Git покажет только те коммиты, в описании которых встречается auth, со всей статистикой по файлам.
Можно комбинировать --grep и --author:
git log --stat --author="Ivan" --grep="bugfix"
Так вы увидите только исправления (по ключевому слову) определённого разработчика и оцените их масштаб.
Инверсия диапазона
Иногда полезно посмотреть противоположное: что есть в одной ветке, но нет в другой.
git log --stat feature/new-login..main
Здесь вы увидите все коммиты, которые есть в main, но отсутствуют в feature/new-login. Это помогает оценить, насколько ветка отстаёт от основной, и сколько изменений придётся подтянуть.
Настройка поведения через конфиг Git
Некоторые параметры git log и --stat можно задать по умолчанию через конфигурацию. Это удобно, если вы хотите, чтобы статистика всегда показывалась определённым образом.
Пример настройки ширины статистики по умолчанию
git config --global diff.statGraphWidth 40
git config --global diff.statWidth 80
git config --global diff.statNameWidth 40
Комментарий:
--global— настройка применяется для всех репозиториев пользователя;- эти параметры влияют на то, как Git выводит статистику (
git log --stat,git show --stat,git diff --stat).
Теперь при выполнении git log --stat вам не нужно каждый раз указывать --stat-graph-width и другие опции — Git будет использовать значения из конфига.
Алиасы для часто используемых комбинаций
Вы можете создать короткие алиасы для любимых комбинаций флагов git log --stat. Например:
git config --global alias.ls "log --oneline --stat"
git config --global alias.lsa "log --oneline --stat --author"
git config --global alias.lsm "log --oneline --stat --since='1 month ago'"
Теперь вы можете писать:
git ls
git ls --since="1 week ago"
git lsm
Алиасы позволяют экономить время и быстрее получать нужный формат статистики.
Типичные ошибки и неожиданные моменты при работе с --stat
Почему суммы строк не всегда «интуитивны»
Вы можете заметить, что число изменённых строк в --stat иногда кажется завышенным или странным. Причина в том, что Git считает изменения на уровне строк, а не «логических» блоков кода.
Например, если вы:
- изменили одно слово в строке — Git считает это как изменение строки;
- перенесли строку в другое место — в некоторых случаях это будет считаться как удаление и добавление;
- отформатировали код (заменили отступы) — это может дать большую статистику изменений, хотя логика кода не поменялась.
Поэтому статистика по строкам — это ориентировочный показатель «масштаба», а не точное измерение сложности изменения.
Почему некоторые файлы не попадают в статистику
Если вы запускаете:
git log --stat -- path/
Git покажет только изменения, затрагивающие файлы внутри path/. Всё, что изменилось вне этой директории, в статистику не попадёт. Иногда разработчики забывают про -- и получают странный результат.
Правильная форма:
git log --stat -- path/
-- нужен, чтобы Git понял, что дальше идут имена файлов и директорий, а не дополнительные опции.
Ограничение по количеству файлов в статистике
По умолчанию Git может не показывать статистику для очень большого количества файлов, если коммит затронул много изменений (например, массовый рефакторинг или авто‑генерация кода). В таких случаях вывод может быть обрезан.
Можно управлять этим через конфигурацию, но чаще всего это означает одно: коммит слишком большой и, возможно, имеет смысл разбивать его на части в будущем.
Ограничение по длине строки с гистограммой
Даже если в файле изменилось 1000 строк, гистограмма ++++++++++++---- не обязательно будет такой же длины. Git масштабирует её до заданной ширины (statGraphWidth). Поэтому плюсы и минусы — это скорее визуальный индикатор, а точные значения смотрите в числах перед ними.
Продвинутые приёмы анализа истории с помощью --stat
Оценка динамики роста / уменьшения кода по файлам
Хотя git log --stat не даёт суммарную статистику по всему диапазону в одной строке (для этого лучше использовать другие команды, например git diff --stat между двумя точками), он позволяет глазами увидеть, в каких файлах чаще всего происходят крупные изменения.
Подход может быть таким:
Выбираете период или диапазон коммитов:
git log --stat --since="6 months ago"Пролистываете и обращаете внимание:
- какие файлы чаще всего появляются в списке;
- где особенно много вставок и удалений.
Так вы находите «горячие» файлы, которые:
- часто меняются;
- могут требовать рефакторинга;
- являются зонами повышенного риска.
Сравнение ветки с основной по статистике
Чтобы понять, насколько большой объём изменений несёт фича‑ветка, можно использовать:
git log --stat main..feature/awesome-feature
Давайте разберём:
- вы видите все коммиты, которыми ветка отличается от
main; - под каждым коммитом — изменённые файлы и количество строк;
- по суммарной картине можно оценить:
- сколько кода добавляется в проект;
- какие модули затрагиваются;
- не слишком ли «раздут» PR.
Если вы хотите просто оценить всё в одной суммарной статистике (без разбивки по коммитам), используйте:
git diff --stat main..feature/awesome-feature
Но при этом вы теряете детализацию по отдельным коммитам, которую даёт git log --stat.
Комбинация с --reverse для анализа старых изменений
Иногда интересно посмотреть, как всё начиналось: какие были первые изменения в конкретном модуле или файле. Для этого удобно использовать --reverse:
git log --stat --reverse -- src/auth/
Комментарий:
--reverse— меняет порядок вывода: от самых старых к самым новым;- вы увидите, как постепенно росла директория
src/auth/, какие файлы появлялись первыми и как развивались.
Это помогает разобраться в эволюции архитектуры и понять, почему те или иные решения были приняты.
Заключение
Опция --stat для git log — это простой, но мощный инструмент для анализа истории изменений. Она не показывает конкретное содержимое диффов, зато даёт быстрый обзор:
- какие файлы затронул коммит;
- насколько велики изменения;
- в каких частях проекта сосредоточена активность.
Вы можете:
- фильтровать вывод по времени, автору, файлу или ветке;
- комбинировать
--statс форматированием (--oneline,--pretty); - настраивать ширину столбцов и гистограммы под свои нужды;
- использовать диапазоны коммитов для анализа веток и релизов.
В итоге git log --stat становится удобным инструментом для ежедневной работы: от быстрой оценки PR до анализа того, как менялся отдельный модуль во времени.
Частозадаваемые технические вопросы по теме и ответы
Как вывести только суммарную статистику по диапазону без разбивки по коммитам
Используйте git diff --stat вместо git log --stat:
git diff --stat main..feature/branch
Так вы получите один сводный блок статистики по всем изменениям между двумя точками, без покоммитной детализации.
Можно ли скрыть имена файлов и оставить только итоговую строку статистики по каждому коммиту
Напрямую git log этого не умеет, но можно использовать --numstat:
git log --numstat
Он выводит числа добавленных и удалённых строк и имена файлов в табличном виде. Затем можно обработать вывод внешними инструментами (например, awk или grep), чтобы оставить только суммарные строки.
Как исключить из статистики изменения в бинарных файлах
Git по умолчанию не считает строки в бинарных файлах, поэтому в --stat они обычно не имеют вставок и удалений. Если вы хотите исключить сами файлы из списка, фильтруйте по путям:
git log --stat -- '*.go' '*.md'
Здесь будут показаны только файлы с указанными масками.
Можно ли ограничить количество выводимых файлов в статистике для одного коммита
Да, через конфиг:
git config --global diff.statLimit 20
Теперь если в коммите изменено больше 20 файлов, Git покажет только первые 20, а в конце добавит строку с информацией о скрытых файлах.
Как посчитать общее количество добавленных и удалённых строк за период
Удобно использовать связку git log --numstat и внешнюю обработку. Пример на Bash:
git log --numstat --since="1 month ago" --pretty="%H" | \
awk 'NF==3 {added+=$1; deleted+=$2} END {print "Added:", added, "Deleted:", deleted}'
Комментарии:
--numstatвыводит для каждого файла три колонки — добавлено, удалено, имя;awkсуммирует значения по всем коммитам;- в конце вы получаете общее количество добавленных и удалённых строк за указанный период.
Постройте личный план изучения Git до уровня Middle — бесплатно!
Git — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Git
Лучшие курсы по теме

Основы Git
Антон Ларичев
TypeScript с нуля
Антон Ларичев