В предыдущем разделе мы научились управлять форматом вывода git log.
Теперь же посмотрим, как фильтровать коммиты, оставляя только те из них, что нам представляют интерес.
Для этого мы научимся:
расширять количество выводимых коммитов опцией
--allкомандыgit log;исключить из вывода коммиты, достижимые из заданного;
задавать диапазон коммитов для вывода;
отображать только первые несколько коммитов;
фильтровать коммиты по автору, коммитеру, дате, ключевому слову в сообщении и изменения, затронутому файлу.
Несмотря на то, что вывод git log протяженный, она не показывает все коммиты, а только те, что достижимы из текущей ветки.
Чтобы команда отобразила все коммиты, ей передают опцию --all.
Чтобы показать только коммиты конкретной ветки, ее имя передают в виде аргумента.
Вместо имени ветки может быть любое обозначение, которое указывает на коммит: имя тега и идентификатор коммита.
И при этом их может быть несколько.
Соответственно, будут показаны те коммиты, которые достижимы из переданных.
С другой стороны, подставляя символ ^ перед ссылкой на коммит, мы, наоборот, отбрасываем достижимые коммиты из вывода.
Где мы можем воспользоваться этим?
Например, посмотрим только те коммиты, которые еще не отправлены в публичное хранилище.
Они размещаются между указателем на вершину ветки HEAD и удаленной веткой origin/master.
git log HEAD ^origin/masterТот же самый вариант команды можно достичь, используя синтаксис с двумя точками, который проще для понимания: git log origin/master..HEAD.
Если предполагается, что верхний диапазон совпадет с началом ветки, то его можно и не указывать: git log origin/master...
Давайте посмотрим, что нас ожидает в следующей версии CMake.
Просмотрим все теги и увидим, что тег с последней версией -- это v3.28.3.
Команда git log --oneline v3.28.3.. покажет внесенные правки в следующую версию CMake, пока не доступные в официальном хранилище.
Показ последних нескольких коммитов (напримре, трех):
git log -3
Поиск по автору:
git log --author="имя автора"
git log --committer="имя коммитера"
Поиск по времени опциями --after и --before.
Поиск по ключевому слову в сообщении коммита: git log --grep="ключевое слово"
Поиск по ключевому слову в изменениях: git log -S="ключевое слово".
Вывод коммитов, затронувших заданный файл: git log -- путь/к/файлу.
Фильтрация коммитов и отображение форматом вывода команды git log часто применяют совместно.
Если мы ищем коммиты по автору, нас не интересует вывод поля о нем.
Контрольные вопросы¶
Какие коммиты показывает команда
git logбез аргументов?Как можно отобразить все коммиты из истории изменений?
Что означает слово “достижимые коммиты”?
Как исключить из вывода
git logкоммиты, следующие после заданного?Как отобразить только диапазон коммитов?
Как отобразить только последние 5 коммитов из ветки
main?Как фильтровать коммиты по времени их создания?
Как фильтровать коммиты по имени автора?
Как отобразить коммиты, которые затрагивают только выбранный файл?
Как вывести те коммиты, которые в сообщении содержат заданную ключевую фразу?
Как вывести те коммиты, которые в изменениях содержат заданную ключевую фразу?
Упражнения¶
Выведите на экран только один коммит с заданным идентификатором.
Повторите вывод
git log --oneline, опцией--prettyс собственным форматом. Опции для управления цветом символов описаны в справочной странице кgit logв разделеPRETTY FORMATS.Отобразите всех авторов, редактировавших файлы CMake (файлы
CMakeLists.txtи с расширением.cmake) за последний год.Отобразите всех авторов, работавших с файлами из выбранного подкаталога за последние 3 месяца.
Определите по истории из хранилища дату и время первого коммита в выбранному году.
Выведите самый первый коммит.
Посчитай количество коммитов в хранилище.
Посчитайте количество удаленных и добавленных строк автором.
git log --oneline --shortstat --no-merges --author="David Cole" | awk 'getline' | awk '{ print $4 }' | paste -sd+ | bcНайдите наименьшее количество цифр в идентификаторе коммита, которые позволяет однозначно сослаться на коммит.