Олег Марков
Фильтрация по автору в Git - git log --author
Введение
Фильтрация истории коммитов по автору в Git помогает быстро найти нужные изменения, понять вклад конкретного разработчика и подготовить отчеты или ревью. Вместо того чтобы просматривать всю историю, вы можете сразу сузить список коммитов до тех, которые сделал конкретный человек.
Здесь вы разберете, как работает параметр --author у команды git log, на какие поля он влияет, как использовать регулярные выражения, как комбинировать фильтрацию по автору с другими опциями git log, и чем --author отличается от --committer. Я буду опираться на практические примеры команд, которые вы сможете сразу использовать у себя в репозитории.
Что именно делает git log --author
Автор и коммитер в Git — в чем разница
Сначала важно понять разницу между двумя участниками, которые могут быть записаны в коммите:
- author (автор) — тот, кто фактически написал изменения
- committer (коммитер) — тот, кто записал изменения в репозиторий (выполнил коммит или, например, применил патч / сделал rebase)
При обычной работе через git commit автор и коммитер совпадают. Но в сценариях с git cherry-pick, git rebase, git am и при применении чужих патчей коммитер может отличаться.
Параметр --author у git log фильтрует коммиты по полю Author, а не по полю Committer.
Давайте посмотрим простой пример:
git log -1
# commit a1b2c3d4e5f6...
# Author: Ivan Petrov <ivan@example.com> # Поле Author
# Date: Tue Nov 21 10:15:30 2023 +0300 # Дата создания изменений
#
# Fix user profile page
#
# commit a7b8c9d0e1f2...
# Committer: Admin Bot <ci@example.com> # Поле Committer (можно увидеть с форматированием)
Если вы выполните:
git log --author="Ivan"
вы получите коммиты, у которых в поле Author есть совпадение со строкой Ivan, независимо от того, кто указан в поле Committer.
Базовое использование git log --author
Поиск коммитов по имени автора
Начнем с самого частого сценария: у вас есть имя (или часть имени), и нужно увидеть все коммиты этого разработчика.
git log --author="Ivan Petrov"
- Git отфильтрует все коммиты, где строка Author содержит подстроку
Ivan Petrov - Поиск нечувствителен к регистру (по умолчанию
--authorиспользует регулярное выражение с опциейi)
Если вы не уверены в точном написании имени, можно ограничиться частью:
git log --author="ivan"
Git найдет всех, чье имя или email содержит ivan (например, Ivan Petrov, ivan.petrov, dev-ivan@company.com).
Поиск по email автора
Параметр --author ищет совпадения и в имени, и в email, потому что строка автора выглядит так:
Author: Ivan Petrov <ivan.petrov@example.com>
Поэтому вы можете фильтровать по почте:
git log --author="ivan.petrov@example.com"
или даже по домену:
git log --author="@example.com"
В этом случае вы увидите коммиты всех авторов, чья почта оканчивается на @example.com.
Просмотр только хэшей коммитов конкретного автора
Иногда вам нужен не полный лог, а список хэшей — например, для передачи в другие команды.
git log --author="Ivan Petrov" --pretty=format:"%h"
# %h - сокращенный хэш коммита
Комментарии к примеру:
git log \
--author="Ivan Petrov" # Фильтруем только коммиты Ивана
--pretty=format:"%h %ad %s" # Настраиваем вывод - хэш дата сообщение
--date=short # Дата в коротком формате ГГГГ-ММ-ДД
Так вы получите удобный список вида:
a1b2c3d 2023-11-21 Fix user profile page
f9e8d7c 2023-11-19 Add validation to login form
...
Фильтрация по нескольким авторам и использование регулярных выражений
Использование регулярных выражений в --author
Параметр --author принимает регулярное выражение (PCRE), а не просто строку. Это значит, что вы можете гибко описывать шаблоны поиска.
Простой пример: найти всех авторов, у которых имя начинается на Ivan:
git log --author="^Ivan"
^— начало строки- Git найдет
Ivan Petrov,Ivan Sidorov, но неSuperIvan.
Или наоборот — найти всех, у кого в имени есть Petrov:
git log --author="Petrov"
Поскольку поиск нечувствителен к регистру, не нужно отдельно учитывать PETROV или petrov.
Фильтрация по нескольким авторам с помощью |
Вы можете объединить несколько имен через | (оператор ИЛИ в регулярных выражениях):
git log --author="Ivan Petrov|Petr Ivanov"
В этом примере вы увидите коммиты, где автор — либо Ivan Petrov, либо Petr Ivanov.
Еще вариант — искать сразу несколько email-доменов:
git log --author="@company.com|@outsourcing.com"
Так вы выявите коммиты внутренних и внешних разработчиков.
Поиск с учетом границ слова
Если вам важно, чтобы поиск сработал по полному слову, а не по части, используйте \b (граница слова):
git log --author="\bIvan\b"
Комментарии:
git log \
--author="\bIvan\b" # Ищем слово Ivan целиком
--oneline # Краткий формат - только хэш и сообщение
Но обратите внимание: иногда в имени или email могут быть символы, которые ломают ожидания от \b, поэтому при сложных кейсах проверяйте шаблон постепенно.
Экранирование специальных символов
Если в имени или email есть специальные символы для regexp (например, +, ?, ., (, )), вам нужно их экранировать с помощью \.
Например, email dev+ci@example.com. Чтобы искать по нему, напишите:
git log --author="dev\+ci@example\.com"
Комментарии к шаблону:
+— экранируем плюс.— экранируем точку в домене
Без экранирования точка . означала бы «любой символ», а + — «один или более предыдущих символов».
Комбинирование --author с другими параметрами git log
В реальных задачах вы редко фильтруете только по автору. Обычно нужно дополнительно ограничить период, ветку или файлы. Давайте разберем самые полезные комбинации.
Фильтрация по автору и дате
Если вы хотите посмотреть коммиты конкретного автора за определенный период, используйте --since и --until.
git log \
--author="Ivan Petrov" \
--since="2023-11-01" \
--until="2023-11-30"
Комментарии:
--since— начиная с указанной даты--until— до указанной даты (включительно)- Даты можно задавать гибко, например
"2 weeks ago","yesterday","2023-11-01 10:00".
Еще пример — за последние 7 дней:
git log --author="Ivan" --since="7 days ago"
Фильтрация по автору и файлам
Иногда нужно узнать, какие изменения конкретный разработчик внес в определенный файл или директорию. Для этого используйте путь после --:
git log --author="Ivan" -- path/to/file.go
Комментарии:
--отделяет список опций от списка файлов/путейpath/to/file.go— путь к файлу или каталогу, по которому будет ограничен лог.
Еще пример — все изменения Ивана в папке internal/user:
git log --author="Ivan" -- internal/user
Git покажет только те коммиты, где автор — Иван и где изменялись файлы внутри internal/user.
Фильтрация по ветке и автору
По умолчанию git log показывает историю для текущей ветки. Если нужно явно указать ветку:
git log feature/new-api --author="Ivan"
Комментарии:
feature/new-api— имя ветки, для которой вы смотрите лог- Далее добавляем
--author, чтобы сузить список по автору.
Также можно искать коммиты автора в нескольких ветках или в диапазоне:
git log master..feature/new-api --author="Ivan"
Здесь:
master..feature/new-api— все коммиты, которые есть вfeature/new-api, но отсутствуют вmaster- Плюс фильтрация по автору.
Фильтрация по автору и по сообщению коммита
Если вы хотите найти конкретные изменения, которые делал определенный автор, полезно комбинировать --author с --grep (поиск по сообщению коммита).
git log \
--author="Ivan" \
--grep="bug" \
--grep="critical" \
--all-match
Комментарии:
--grep="bug"и--grep="critical"— два условия по сообщению--all-matchтребует, чтобы оба шаблона в--grepсовпали одновременно- В итоге останутся коммиты Ивана, в сообщении которых есть и слово
bug, и словоcritical.
Если --all-match не использовать, будет логика «Иван и (bug или critical)».
Краткий формат вывода с фильтрацией по автору
Чтобы получить компактный список, удобно использовать --oneline:
git log --author="Ivan" --oneline
или с сортировкой по времени:
git log --author="Ivan" --oneline --decorate --graph
Комментарии к опциям:
--oneline— сокращенный хэш + первая строка сообщения--decorate— показывает метки веток и тегов--graph— рисует ASCII-граф веток.
Это удобно, когда вы хотите визуально оценить вклад конкретного автора.
Отличия --author и --committer
Когда использовать --committer вместо --author
Иногда изменения пишет один человек, а в репозиторий их записывает другой (например, через git am или CI-систему). Тогда поле Author будет одним, а Committer — другим.
Чтобы фильтровать по коммитеру, есть параметр --committer:
git log --committer="CI Bot"
Комментарии:
- Вы увидите коммиты, которые попали в репозиторий через бота CI, merge-бота или человека, который применяет патчи
- Но автором (Author) там могут быть разные разработчики.
Примеры различий на практике
Допустим, вы приняли патч по почте и применили его через git am:
# Здесь вы применяете патч от автора
git am patch.mbox
Автором в коммите будет тот, кто прислал патч, а коммитером — вы.
Теперь:
git log --author="Petrov"
покажет все патчи, которые написал Петров (даже если применяли их вы), а
git log --committer="Ivan"
покажет все коммиты, которые вы записали в репозиторий, независимо от того, кто их написал.
Это важно понимать, когда вы анализируете историю:--author — про «кто написал изменения»,--committer — про «кто их зафиксировал в репозитории».
Просмотр статистики по автору
Подсчет количества коммитов автора
Чтобы просто узнать, сколько коммитов сделал конкретный автор, можно использовать --oneline и wc -l (в Unix-подобных системах):
git log --author="Ivan" --oneline | wc -l
# Эта команда выведет количество строк - то есть количество коммитов
Комментарии:
git log --oneline— один коммит в строкуwc -l— посчитать количество строк.
Использование git shortlog
git shortlog специально предназначен для статистики по авторам. Его можно комбинировать с фильтрацией по пути/ветке, но не напрямую с --author. Зато он аггрегирует коммиты по авторам.
Пример статистики по всем авторам:
git shortlog -s -n
# -s - выводить только количество коммитов
# -n - сортировать по количеству
Если нужно ограничить путь (например, вас интересует файлы в backend/), используйте:
git shortlog -s -n -- backend/
Хотя здесь мы не используем --author, результат покажет вклад всех авторов. Если хотите увидеть только одного автора, используйте grep:
git shortlog -s -n | grep "Ivan"
# Вывод будет примерно таким:
# 42 Ivan Petrov
Комментарии:
shortlogсуммирует коммиты по авторамgrep "Ivan"оставляет только строки, где фигурирует Иван.
Статистика по изменениям (строкам кода) автора
Чтобы увидеть, сколько строк добавил и удалил конкретный автор, можно скомбинировать --author и --shortstat:
git log --author="Ivan" --shortstat
--shortstat выведет краткую статистику по каждому коммиту: количество файлов, вставок и удалений.
Если вам нужна сумма по всем коммитам, можно использовать дополнительную обработку (через awk или git diff --author с --stat), но это уже выходит за базовый уровень.
Поиск конкретных изменений конкретного автора
Поиск по коду с учетом автора (git log -S / -G)
Иногда нужно ответить на вопрос: «Кто впервые добавил эту строку в код?» или «Кто менял конкретный фрагмент?». Здесь помогут опции -S и -G у git log. Их можно комбинировать с --author.
-S<string>— поиск по добавлению/удалению точной строки-G<regex>— поиск по паттерну (регулярному выражению) в изменяемых строках
Пример: найти все коммиты Ивана, в которых он трогал строку IsUserActive:
git log --author="Ivan" -S "IsUserActive" -- path/to/file.go
Комментарии:
-S "IsUserActive"— будут найдены коммиты, где эта строка была добавлена или удалена--author="Ivan"— ограничим поиск только коммитами Ивана-- path/to/file.go— только в указанном файле.
Пример с регулярным выражением:
git log --author="Ivan" -G "Validate.*Email" -- path/to/file.go
Здесь будут найдены коммиты Ивана, где он менял строки, соответствующие шаблону Validate...Email.
Поиск по файловому пути и по автору
Если вы знаете, что нужные изменения лежат в конкретной директории, сразу ограничьте путь:
git log --author="Ivan" -- src/auth
или несколько путей:
git log --author="Ivan" -- src/auth src/user
Комментарии:
- Это особенно полезно в монорепозиториях, где один автор может работать сразу в нескольких подсистемах
- Вы фильтруете логи не только по автору, но и по нужной области кода.
Настройка вывода для удобного анализа по авторам
Пользовательский формат вывода с указанием автора
Чтобы при фильтрации по авторам видеть сразу email, дату и сообщение, используйте --pretty=format.
git log --author="Ivan" --pretty=format:"%h | %an <%ae> | %ad | %s" --date=short
Расшифровка плейсхолдеров:
%h— сокращенный хэш%an— имя автора (Author Name)%ae— email автора (Author Email)%ad— дата автора (Author Date)%s— сообщение коммита (subject)
Комментарии:
git log \
--author="Ivan" \
--pretty=format:"%h %an %ae %ad %s" \
--date=short
# Так вы получите читабельный лог - удобно копировать в отчеты
Скрытие merge-коммитов автора
Иногда merge-коммиты только «шумят» в истории. Чтобы исключить их, добавьте --no-merges:
git log --author="Ivan" --no-merges
Комментарии:
- Вы увидите только обычные (non-merge) коммиты
- Это помогает оценить именно «чистые» изменения автора, без технических слияний веток.
Показать только первые N коммитов автора
Если история длинная, ограничьте вывод:
git log --author="Ivan" -n 10
Комментарии:
-n 10— максимум 10 коммитов- Удобно, если вы ищете что-то «из недавнего», а не за всю историю.
Типичные сценарии использования git log --author
Подготовка к коду-ревью
Ситуация: вы мержите ветку feature/payments и хотите быстро просмотреть только изменения конкретного разработчика, чтобы проверить их внимательнее.
git log master..feature/payments --author="Ivan" --oneline
Комментарии:
- Сначала мы берем разницу веток
masterиfeature/payments - Потом фильтруем по автору
--onelineделает список компактным для обзора.
Далее можно брать хэши из этого списка и смотреть детали через git show.
Разбор инцидента и поиск ответственного коммита
Допустим, в сервисе появилась ошибка в модуле авторизации. Вы знаете, что за модуль в основном отвечает Иван. Начните анализ так:
git log --author="Ivan" -- src/auth
Затем найдите последние коммиты и изучите их:
git show a1b2c3d
# Здесь вы увидите diff и комментарии автора
Подготовка статистики по вкладу разработчика
Если руководителю или коллеге нужно показать вклад конкретного разработчика, можно:
Посчитать количество коммитов:
git log --author="Ivan" --since="2023-01-01" --oneline | wc -lПосмотреть области, где он работал:
git log --author="Ivan" --name-only --since="2023-01-01" # --name-only - после каждого коммита выводит список измененных файловПри необходимости собрать вывод в отдельный файл:
git log --author="Ivan" --since="2023-01-01" --name-status > ivan_changes_2023.txt # --name-status - показывает статусы файлов - добавлен изменен удален
Отладка проблем с неправильными именами и email
Иногда разработчики настраивают Git не сразу, и в истории появляются «плавающие» имена и адреса, вроде user, User, ivan, Ivan Petrov. Вам может понадобиться собрать все такие варианты:
git log --author="ivan" --oneline
git log --author="petrov" --oneline
git log --author="user" --oneline
А затем уже принимать решение о переписывании истории через git filter-repo или git filter-branch (это более сложная тема).
Важный момент: --author помогает вначале понять масштаб проблемы, посмотрев, где и как автор фигурировал с разными вариантами имени и email.
Заключение
Параметр --author у git log — один из самых полезных инструментов для анализа истории коммитов. Он позволяет:
- быстро найти все изменения конкретного разработчика;
- сузить поиск до нужной ветки, периода, файла или директории;
- комбинировать фильтрацию с поиском по сообщениям (
--grep) и содержимому (-S,-G); - отличать «кто написал» (
--author) от «кто записал в репозиторий» (--committer); - строить простую статистику по вкладу автора.
Используя git log --author в сочетании с форматированием вывода, ограничением по датам и путям, вы можете очень точно отвечать на вопросы «кто и когда сделал это изменение» даже в больших проектах.
Ниже — несколько вопросов, которые часто возникают, когда разработчики начинают глубже использовать фильтрацию по автору.
Частозадаваемые технические вопросы и ответы
Как искать по точному совпадению имени автора а не по подстроке
По умолчанию --author использует регулярное выражение, поэтому Ivan совпадет и с SuperIvan. Чтобы максимально приблизиться к точному совпадению, добавьте якоря начала и конца строки:
git log --author="^Ivan Petrov <ivan@example.com>$"
Здесь вы явно указываете полную строку автора. Ее проще всего взять из вывода обычного git log -1 и скопировать строку Author, экранировав при необходимости спецсимволы.
Как отфильтровать все коммиты кроме одного автора
Напрямую сделать отрицание в --author нельзя, но можно использовать grep -v поверх вывода:
git log --pretty=format:"%h %an %s" | grep -vi -E "Ivan Petrov"
Комментарии:
grep -v— исключить все строки, где найден шаблон-i— игнорировать регистр-E— расширенные регулярные выражения.
Если нужно при этом сохранить структурированный вывод (git show и т.п.), проще сначала получить список нужных хэшей через скрипт или алиас.
Как использовать git log --author на Windows без проблем с кавычками
На Windows командная строка по-другому обрабатывает кавычки. Если команда с двойными кавычками работает некорректно, попробуйте:
git log --author=Ivan
или в PowerShell:
git log --author 'Ivan Petrov'
В PowerShell рекомендуется использовать одинарные кавычки вокруг регулярных выражений, чтобы оболочка не пыталась их интерпретировать.
Как посмотреть только первые и последние коммиты автора в репозитории
Чтобы увидеть самый ранний коммит автора:
git log --author="Ivan" --reverse -n 1
Комментарии:
--reverse— инвертирует порядок (от старых к новым)-n 1— берем первый после инверсии, то есть самый ранний.
Чтобы увидеть самый свежий коммит автора:
git log --author="Ivan" -n 1
Здесь не нужно --reverse — по умолчанию лог идет от новых к старым.
Как вывести diff только для коммитов конкретного автора
Если вы хотите посмотреть сразу все изменения кода, сделанные автором, добавьте -p:
git log --author="Ivan" -p
Комментарии:
-p— показывает патчи (diff) для каждого коммита- Можно дополнительно ограничивать по файлам или датам, чтобы объем diff был разумным:
git log --author="Ivan" --since="2023-11-01" -p -- src/auth
Постройте личный план изучения Git до уровня Middle — бесплатно!
Git — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Git
Лучшие курсы по теме

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