Статистика изменений в Git с помощью git log --stat

17 декабря 2025
Автор

Олег Марков

Введение

Статистика изменений в истории коммитов помогает быстро понять, что именно происходило в репозитории: какие файлы менялись, насколько сильно, где были крупные рефакторинги, а где — по одному‑двум исправлениям. В 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 удалённые строки.

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 между двумя точками), он позволяет глазами увидеть, в каких файлах чаще всего происходят крупные изменения.

Подход может быть таким:

  1. Выбираете период или диапазон коммитов:

    git log --stat --since="6 months ago"
    
  2. Пролистываете и обращаете внимание:

    • какие файлы чаще всего появляются в списке;
    • где особенно много вставок и удалений.

Так вы находите «горячие» файлы, которые:

  • часто меняются;
  • могут требовать рефакторинга;
  • являются зонами повышенного риска.

Сравнение ветки с основной по статистике

Чтобы понять, насколько большой объём изменений несёт фича‑ветка, можно использовать:

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 log - использование флага --sinceСтрелочка вправо

Постройте личный план изучения Git до уровня Middle — бесплатно!

Git — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Git

Открыть базу знаний

Лучшие курсы по теме

изображение курса

Основы Git

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий