Фильтрация по дате в git log - использование флага --since

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

Олег Марков

Введение

При работе с историей коммитов в Git очень часто нужно ответить на простой вопрос: какие изменения были сделаны за конкретный период времени. Например, какие коммиты попали в релиз за последнюю неделю, что делал конкретный разработчик вчера, или какие изменения были внесены с начала месяца.

Для таких задач Git предоставляет удобный механизм фильтрации истории по дате с помощью опции --since в команде git log. Смотрите, я покажу вам, как это работает, какие форматы дат поддерживаются, как комбинировать фильтрацию по времени с другими опциями и как избежать типичных ошибок.

Давайте разберем все нюансы git log --since, чтобы вы могли уверенно использовать его в повседневной работе.

Что делает git log --since

Опция --since ограничивает вывод git log только теми коммитами, которые были сделаны не ранее указанной даты и времени. Проще говоря, она говорит Git: "покажи мне все коммиты, которые новее вот этой точки во времени".

Базовый пример:

# Показать все коммиты, сделанные после 1 января 2024 года
git log --since="2024-01-01"

Комментарий:

  • Здесь --since="2024-01-01" задает нижнюю границу даты
  • Git покажет только те коммиты, дата которых равна или новее 2024-01-01
  • Без других опций вывод будет в стандартном формате git log

Важно понимать, что --since:

  • не меняет историю и не влияет на репозиторий
  • работает только как фильтр вывода
  • может комбинироваться с ветками, файлами, автором и другими опциями

Теперь давайте подробно посмотрим, какие форматы дат можно использовать и как это влияет на результат.

Поддерживаемые форматы дат для --since

Git довольно гибко относится к формату даты. Это удобно, потому что вы можете писать и строгие ISO-форматы, и более "человеческие" выражения.

Строгие форматы дат (ISO и похожие)

Начнем с форматов, которые лучше всего использовать в скриптах и документации — они однозначны и не зависят от локали.

Только дата

# Все коммиты с 5 марта 2024 включительно
git log --since="2024-03-05"

Комментарии:

  • Формат YYYY-MM-DD — год-месяц-день
  • Время по умолчанию считается как 00:00:00 в указанный день
  • То есть в примере выше вы увидите все коммиты с полуночи 5 марта и позже

Дата и время (24-часовой формат)

# Коммиты, сделанные после 5 марта 2024 года, 15:30
git log --since="2024-03-05 15:30"
# То же самое, но с указанием секунд
git log --since="2024-03-05 15:30:45"

Комментарии:

  • Можно указывать часы и минуты, при необходимости — секунды
  • Если не указать часовой пояс, Git считает дату в вашей локальной временной зоне
  • Это особенно важно в распределенных командах, где разработчики могут работать в разных часовых поясах

Дата и явный часовой пояс

# Дата и время в часовом поясе UTC
git log --since="2024-03-05 15:30 UTC"
# Время в часовом поясе +0300
git log --since="2024-03-05 15:30 +0300"

Комментарии:

  • UTC — удобное обозначение для всемирного времени
  • +0300 — смещение от UTC (в данном случае +3 часа)
  • Такой формат полезен, когда вы соглашаетесь в команде использовать единый часовой пояс (обычно UTC)

Относительные даты (человеческие выражения)

Очень часто вам нужно не "с 2024-03-05", а "за последние два дня". Git это тоже понимает.

Примеры относительных выражений

# Коммиты за последние два дня
git log --since="2 days ago"
# Коммиты за последнюю неделю
git log --since="1 week ago"
# За последние 3 часа
git log --since="3 hours ago"
# Все, что было сделано за последние 10 минут
git log --since="10 minutes ago"

Комментарии:

  • В Git можно использовать формы day, days, week, weeks, hour, hours, minute, minutes и другие
  • Конструкция "N days ago" считается от текущего системного времени
  • Такой синтаксис очень удобен в повседневной работе в терминале

Специальные выражения типа "yesterday"

# Коммиты, сделанные с полуночи сегодняшнего дня
git log --since="today"
# Коммиты, сделанные с полуночи вчерашнего дня
git log --since="yesterday"
# С начала этого месяца
git log --since="1 month ago"

Здесь Git пытается интерпретировать выражения максимально естественно:

  • "today" — с 00:00 текущего дня
  • "yesterday" — с 00:00 предыдущего дня
  • "1 month ago" — примерно месяц назад от текущей даты (в зависимости от количества дней в месяце)

Комбинированные даты (дата + относительное смещение)

Иногда полезно комбинировать разные варианты.

# С 1 января 2024 года, но минус три часа от полуночи
git log --since="2024-01-01 00:00 -3 hours"
# С полуночи вчера в UTC
git log --since="yesterday 00:00 UTC"

Git довольно терпим к таким строкам, но здесь важно не переусердствовать. Если строка станет слишком запутанной, Git может ее не распознать корректно. В таких случаях лучше перейти к более строгому формату.

Комбинация --since и --until (диапазон дат)

Часто фильтрация по дате нужна не в одну сторону, а в виде диапазона. Например, "коммиты за прошлую неделю" или "изменения между двумя релизами по времени".

Для этого есть опция --until. Смотрите, как они работают вместе.

# Коммиты с 1 по 10 мая 2024 включительно
git log --since="2024-05-01" --until="2024-05-10"

Комментарии:

  • --since задает нижнюю границу (начало периода)
  • --until — верхнюю границу (конец периода)
  • Обе даты включаются (если коммит произошел точно в указанное время, он попадет в выборку)

Давайте разберемся на более практическом примере.

# Коммиты за прошлую неделю
git log --since="1 week ago" --until="now"
# Все коммиты за вчерашний день
git log --since="yesterday" --until="today"
# Коммиты, сделанные в марте 2024 года
git log --since="2024-03-01" --until="2024-03-31 23:59:59"

Вот еще вариант, когда удобно выбирать период между двумя релизами по датам:

# Коммиты между датой выхода релиза 1.0.0 и 1.1.0
git log --since="2024-02-15" --until="2024-03-10"

Комментарий:

  • В реальном проекте даты релизов можно брать из тегов или документации
  • Такой диапазон по времени иногда удобнее, чем диапазон по хэшам коммитов

Сочетание фильтрации по дате с другими опциями git log

Использовать просто --since — это только начало. Настоящая сила в том, чтобы комбинировать фильтрацию по времени с другими критериями: автор, файлы, ветки и т.д. Теперь давайте перейдем к этим комбинациям.

Фильтрация по автору и дате

Иногда нужно посмотреть, что делал конкретный разработчик за период.

# Коммиты автора Иван Иванов за последние 3 дня
git log --author="Иван Иванов" --since="3 days ago"
# Коммиты автора по email за прошлую неделю
git log --author="ivan@example.com" --since="1 week ago"
# Коммиты автора с именем, содержащим Ivan, с начала месяца
git log --author="Ivan" --since="2024-03-01"

Комментарии:

  • Опция --author принимает строку, которая ищется в имени и email автора
  • Регулярные выражения тоже поддерживаются, но тогда лучше использовать флаг --author="^Ivan" и т.п.
  • К фильтрации по дате это не добавляет сложности — Git просто применяет оба фильтра одновременно

Фильтрация по файлам и дате

Частая задача — посмотреть, какие изменения были сделаны в конкретном файле или директории за определенное время.

# Коммиты, затрагивающие файл app.py за последние 2 недели
git log --since="2 weeks ago" -- app.py
# Коммиты по директории src за вчера
git log --since="yesterday" -- src/

Комментарий:

  • Обратите внимание на -- перед путями.
    • Этот разделитель говорит Git, что дальше идут пути к файлам или директориям
    • Это помогает избежать путаницы между опциями и именами файлов
  • Фильтрация по датам применяется уже после фильтрации по путям

Фильтрация по веткам и дате

Часто история интересует в рамках конкретной ветки.

# Коммиты в ветке main за последние 7 дней
git log main --since="7 days ago"
# Коммиты в ветке feature/login, сделанные после 1 апреля 2024 года
git log feature/login --since="2024-04-01"
# Коммиты в текущей ветке с начала месяца
git log --since="2024-03-01"

Комментарии:

  • Если вы не указываете ветку явно, по умолчанию используется текущая (HEAD)
  • Можно указывать и более сложные диапазоны веток, например main..feature/login, и одновременно фильтровать по дате

Улучшение читаемости: формат вывода, ограничение количества и т.п.

Фильтрация по дате — это хорошо, но если в периоде много коммитов, вывод становится длинным. Давайте кратко посмотрим, как сделать результат удобнее.

# Краткий формат вывода за последние 3 дня
git log --since="3 days ago" --oneline
# Только 20 последних коммитов за последние 30 дней
git log --since="30 days ago" -n 20 --oneline
# Вывод с датой в удобном формате
git log --since="1 week ago" --pretty=format:"%h %ad %an %s"

Комментарии к последнему примеру:

  • %h — сокращенный хэш коммита
  • %ad — дата автора (формат можно менять через --date=...)
  • %an — имя автора
  • %s — заголовок коммита

Такой формат удобно использовать, когда вы готовите отчеты или хотите быстро просмотреть историю.

Как git выбирает, по какой дате фильтровать

Здесь есть важный технический момент, который иногда вызывает вопросы. У коммита в Git есть как минимум две разные даты:

  • дата автора (Author Date) — когда автор сделал изменение
  • дата коммитера (Committer Date) — когда изменение попало в репозиторий как коммит

Обычно эти даты совпадают, но:

  • при ребейзе (rebase)
  • при cherry-pick
  • при изменении истории

дата коммитера может быть более поздней, чем дата автора.

По умолчанию git log --since использует именно дату автора (Author Date). Это важно понимать, особенно когда вы работаете с переписанной историей.

Давайте посмотрим, как можно управлять форматом дат, чтобы лучше это увидеть.

# Показываем обе даты явно
git log --since="2024-03-01" \
  --pretty=format:"%h%nАвтор  %an %ad%nКоммит %cn %cd%n%s%n"

Комментарии к формату:

  • %ad — Author Date
  • %cd — Committer Date
  • %an — Author Name
  • %cn — Committer Name
  • %n — перенос строки

Так вы увидите, что иногда даты могут отличаться. Но фильтрация по --since все равно ориентируется на дату автора.

Практические сценарии использования git log --since

Теперь давайте посмотрим на реальные примеры, как применять фильтрацию по дате в повседневной разработке.

Сценарий 1: Отчет о проделанной работе за день

Предположим, вы хотите посмотреть, что вы сделали сегодня.

# Ваши коммиты за сегодня в текущем репозитории
git log --author="Ваше Имя" --since="today" --oneline

Для большей точности можете фильтровать по email:

git log --author="your.email@example.com" --since="today" --oneline

Комментарии:

  • Аргумент --oneline помогает сделать вывод более компактным
  • Такую команду удобно добавлять в alias в Git (например, git config --global alias.today 'log --since="today" --oneline')

Сценарий 2: Что изменилось с последнего релиза по времени

Предположим, релиз 1.2.3 был 15 марта 2024 года, и вам нужно посмотреть, какие коммиты были с того времени.

git log --since="2024-03-15" --oneline

Если вы знаете точную дату и время релиза, добавьте и их:

git log --since="2024-03-15 18:00" --oneline

Комментарий:

  • Такой подход полезен, когда управление релизами ведется не по тегам, а по датам
  • Иногда QA или менеджеры спрашивают список изменений "с момента выката" — это как раз такой случай

Сценарий 3: Проверка nightly или weekly изменений

Например, у вас есть nightly-сборка, и вы хотите понимать, какие изменения входят в ежедневную сборку.

# Изменения за последние 24 часа
git log --since="24 hours ago" --oneline
# Изменения за последние 7 дней по директории backend
git log --since="7 days ago" --oneline -- backend/

Комментарии:

  • Такой вывод удобно прикреплять к письму или отчёту о сборке
  • При необходимости можно добавить авторов или даты в формат вывода

Сценарий 4: Анализ активности в конкретном модуле за месяц

Допустим, вы хотите понять, как активно меняется модуль payments за последний месяц.

git log --since="1 month ago" -- payments/
# Более компактный формат с датами
git log --since="1 month ago" \
  --pretty=format:"%h %ad %an %s" --date=short -- payments/

Комментарии:

  • --date=short меняет формат даты, чтобы она занимала меньше места
  • Такой вывод удобно копировать в документацию или отчеты

Сценарий 5: Анализ коммитов в определенное окно времени

Иногда нужно посмотреть только те коммиты, которые были сделаны, например, ночью (с 00:00 до 06:00) какого-то дня.

# Ночные коммиты 1 мая 2024
git log --since="2024-05-01 00:00" --until="2024-05-01 06:00"

Комментарий:

  • Такой прием можно использовать для поиска "подозрительных" изменений, сделанных в необычное время
  • Или для анализа нагрузки и графика работы команды

Особенности, тонкости и типичные ошибки

Теперь давайте посмотрим на моменты, которые чаще всего вызывают сложности, когда разработчики начинают активно пользоваться git log --since.

Ошибка 1: Неправильный формат даты

Иногда Git не может распознать дату, и тогда фильтрация работает не так, как вы ожидали, или вообще не фильтрует.

Пример потенциальной проблемы:

# Плохой вариант (день и месяц перепутаны для некоторых локалей)
git log --since="03/05/2024"

Комментарий:

  • Формат DD/MM/YYYY или MM/DD/YYYY неоднозначен
  • Git может интерпретировать его не так, как вы ожидаете

Рекомендация:

  • Всегда используйте формат YYYY-MM-DD — он однозначен
  • Либо полностью текстовый формат месяца, например "5 Mar 2024" (но это уже зависит от локали)
# Надежный вариант
git log --since="2024-05-03"

Ошибка 2: Путаница с часовыми поясами

Если вы работаете в распределенной команде, даты могут относиться к разным часовым поясам.

Пример:

  • Разработчик в Москве (UTC+3) сделал коммит в 23:30 по своему времени
  • В UTC это уже следующий день 20:30 (в зависимости от смещения)

Если вы фильтруете "since=yesterday" без уточнения часового пояса, результат иногда будет казаться "странным".

Рекомендации:

  • Для строгого анализа лучше использовать UTC в строке даты
  • Или договориться в команде, какую временную зону считать "истиной"
# Явное указание времени в UTC
git log --since="2024-05-01 00:00 UTC" --until="2024-05-01 23:59 UTC"

Ошибка 3: Ожидание фильтрации по дате коммитера

Как уже обсуждалось, по умолчанию --since ориентируется на дату автора, а не коммитера. Если вы часто делаете rebase, это может удивлять.

Например:

  • Автор сделал коммит 1 мая
  • Через неделю вы сделали rebase, и коммитер дата стала 8 мая

При фильтрации --since="2024-05-05" вы не увидите этот коммит, хотя по дате коммитера он должен был бы попасть в выборку.

Решение:

  • Если вам важно именно время попадания в репозиторий, ориентируйтесь на дату коммитера через дополнительный анализ (например, скриптами)
  • В стандартном git log прямой смены ориентира с Author Date на Committer Date для --since нет

Ошибка 4: Ожидание, что --since работает "до" указанной даты

Иногда встречается такая путаница: разработчик ожидает, что --since="2024-05-01" покажет коммиты до 1 мая, а не после.

Запомните простое правило:

  • --since — "начиная с" (после указанной даты)
  • --until — "до" (не позже указанной даты)

Чтобы выбрать все коммиты "до" определенной даты, используйте --until:

# Все коммиты до 1 мая 2024
git log --until="2024-05-01"

А чтобы задать "от-до", комбинируйте:

git log --since="2024-04-01" --until="2024-05-01"

Ошибка 5: Забытый разделитель -- перед путями

Если вы объединяете фильтрацию по дате и по файлам, легко забыть разделитель --.

Плохой пример:

# Может быть воспринято неправильно
git log --since="2024-05-01" app.py

Git может попытаться интерпретировать app.py как ревизию, а не как путь.

Правильный вариант:

git log --since="2024-05-01" -- app.py

Комментарий:

  • Всегда ставьте -- перед списком файлов или директорий
  • Это простое правило избавляет от неожиданных результатов

Как комбинировать --since с другими инструментами анализа

Чтобы извлечь максимум пользы из --since, полезно сочетать его с другими командами и возможностями Git.

Использование с git shortlog для подсчета коммитов

git shortlog удобно использовать для обзора активности по авторам за период.

# Активность разработчиков за последнюю неделю
git shortlog --since="1 week ago" --summary --numbered

Комментарии:

  • --summary — показывает только числа и имена авторов
  • --numbered — сортирует по количеству коммитов
  • Так вы можете быстро оценить, кто насколько активно коммитил за период

Использование в скриптах и автоматизации

В скриптах лучше использовать строгие форматы дат и избегать относительных выражений, чтобы избежать зависимости от локали и текущего времени.

Вот пример bash-скрипта, который выводит коммиты за последние N дней:

#!/usr/bin/env bash

# days - сколько дней назад считать
days="$1"

# Проверяем, что пользователь передал число
if [ -z "$days" ]; then
  # Если аргумент не передан - показываем подсказку
  echo "Использование: $0 <количество_дней>"
  exit 1
fi

# Выводим коммиты за указанный период
git log --since="$days days ago" --oneline

Комментарии:

  • Скрипт принимает число дней как аргумент
  • Проверяет, что аргумент передан
  • Использует --since="N days ago" для вывода коммитов
  • Такой скрипт можно положить в ~/bin и вызывать, например, git-days 7

Если нужна более строгая дата, можно заранее вычислить ее, используя date (на Linux/macOS):

# Пример вычисления даты 7 дней назад в формате YYYY-MM-DD
since_date=$(date -d "7 days ago" +"%Y-%m-%d")
git log --since="$since_date" --oneline

Комментарий:

  • Команда date рассчитывает нужную дату
  • Формат +%Y-%m-%d гарантирует, что Git правильно поймет строку

Заключение

Фильтрация истории по дате с помощью git log --since — один из наиболее полезных и при этом довольно простых инструментов Git. Он помогает:

  • быстро просматривать изменения за нужный период
  • готовить отчеты о проделанной работе
  • анализировать активность команды
  • отслеживать изменения по конкретным файлам или модулям во времени

Ключевые моменты, на которые стоит опираться:

  • используйте однозначные форматы дат (YYYY-MM-DD, дата+время+часовой пояс)
  • для повседневной работы удобно применять относительные выражения (2 days ago, yesterday, 1 week ago)
  • комбинируйте --since с --until, --author, выбором ветки и фильтрацией по файлам
  • не забывайте про -- перед списком файлов
  • помните, что по умолчанию фильтрация идет по дате автора (Author Date)

Постепенно вы сможете выстроить для себя набор привычных команд и алиасов, которые ускорят работу с историей и сделают анализ изменений гораздо удобнее.

Частозадаваемые технические вопросы по теме статьи и ответы на них

Как вывести только хэши коммитов за определенный период

Вы можете использовать специальный формат вывода:

# Только хэши коммитов за последние 3 дня
git log --since="3 days ago" --pretty=format:"%H"

Комментарий:

  • %H — полный хэш коммита
  • Так удобно передавать список коммитов в другие инструменты или скрипты

Как отфильтровать коммиты по дате и сообщению (тексту в коммите)

Используйте комбинацию --since и --grep:

# Коммиты с текстом "bugfix" в сообщении за последний месяц
git log --since="1 month ago" --grep="bugfix"
# Поиск без учета регистра
git log --since="1 month ago" --grep="bugfix" -i

Комментарий:

  • -i включает режим "ignore case" — без учета регистра
  • --grep ищет по заголовку и телу сообщения коммита

Как вывести коммиты за период в формате, который удобно парсить программами

Лучше всего использовать формат --pretty с понятным разделителем:

git log --since="2024-03-01" --until="2024-03-31" \
  --pretty=format:"%H|%ad|%an|%s" --date=iso

Комментарий:

  • Поля разделены символом |, который удобно парсить
  • --date=iso обеспечивает предсказуемый формат даты

Как посмотреть историю по датам только для merge-коммитов

Используйте флаг --merges:

# Merge-коммиты за последние две недели
git log --since="2 weeks ago" --merges --oneline

Комментарий:

  • --merges ограничивает вывод только коммитами слияния
  • Это удобно при анализе интеграции веток за период

Как увидеть количество строк, измененных за период

Можно использовать --stat или --numstat вместе с --since:

# Статистика изменений по файлам за последнюю неделю
git log --since="1 week ago" --stat
# Формат, удобный для автоматической обработки
git log --since="1 week ago" --numstat

Комментарии:

  • --stat показывает краткую статистику по каждому коммиту
  • --numstat выводит количество добавленных и удаленных строк по файлам в машиночитаемом виде
Стрелочка влевоСтатистика изменений в Git с помощью git log --statКраткая история репозитория в Git с помощью git log --onelineСтрелочка вправо

Постройте личный план изучения 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 ₽
Подробнее

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