Русский ▾ Topics ▾ Latest version ▾ git-rev-list last updated in 2.54.0

НАЗВАНИЕ

git-rev-list — Выводит список объектов коммитов в обратном хронологическом порядке

ОБЗОР

git rev-list [<параметры>] <коммит>…​ [--] [<путь>…​]

ОПИСАНИЕ

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

Это можно представить как операцию над множествами. Коммиты, достижимые из любого из коммитов, указанных в командной строке, образуют множество, а затем коммиты, достижимые из любого из тех, перед которыми стоит ^, вычитаются из этого множества. Оставшиеся коммиты выводятся в результате работы команды. Различные другие параметры и параметры путей могут использоваться для дальнейшего ограничения результата.

Таким образом, следующая команда:

$ git rev-list foo bar ^baz

означает «перечислить все коммиты, достижимые из foo или bar, но не из baz».

Специальное обозначение "<коммит1>..<коммит2>" можно использовать как сокращение для "^<коммит1> <коммит2>". Например, любое из следующих может использоваться взаимозаменяемо:

$ git rev-list origin..HEAD
$ git rev-list HEAD ^origin

Ещё одно специальное обозначение — "<коммит1>...<коммит2>", которое полезно для слияний. Результирующее множество коммитов представляет собой симметрическую разность двух операндов. Следующие две команды эквивалентны:

$ git rev-list A B --not $(git merge-base --all A B)
$ git rev-list A...B

rev-list — это важная команда Git, поскольку она предоставляет возможность строить и обходить графы родословной коммитов. По этой причине она имеет много различных параметров, которые позволяют использовать её таким разным командам, как git bisect и git repack.

ПАРАМЕТРЫ

Ограничение коммитов

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

Использование большего количества параметров обычно дополнительно ограничивает вывод (например, --since=<дата1> ограничивает коммитами новее <дата1>, а использование его с --grep=<шаблон> дополнительно ограничивает коммитами, сообщение журнала которых содержит строку, соответствующую <шаблон>), если не указано иное.

Обратите внимание, что они применяются перед параметрами упорядочивания и форматирования коммитов, такими как --reverse.

-<число>
-n <число>
--max-count=<число>

Ограничить вывод <числом> коммитов.

--skip=<число>

Пропустить <число> коммитов перед началом показа вывода коммитов.

--since=<дата>
--after=<дата>

Показать коммиты новее <дата>.

--since-as-filter=<дата>

Показать все коммиты новее <дата>. Это посещает все коммиты в диапазоне, а не останавливается на первом коммите, который старше <дата>.

--until=<дата>
--before=<дата>

Показать коммиты старше <дата>.

--max-age=<метка-времени>
--min-age=<метка-времени>

Ограничить вывод коммитов указанным временным диапазоном.

--author=<шаблон>
--committer=<шаблон>

Ограничить вывод коммитов теми, у которых строки заголовка автора/коммиттера соответствуют регулярному выражению <шаблон>. При наличии более одного --author=<шаблон> выбираются коммиты, чей автор соответствует любому из <шаблон> (аналогично для нескольких --committer=<шаблон>).

--grep-reflog=<шаблон>

Ограничить вывод коммитов теми, у которых записи журнала ссылок (reflog) соответствуют регулярному выражению <шаблон>. При наличии более одного --grep-reflog выбираются коммиты, чьё сообщение в журнале ссылок соответствует любому из заданных шаблонов. Использование этого параметра является ошибкой, если не используется --walk-reflogs.

--grep=<шаблон>

Ограничить вывод коммитов теми, у которых сообщение журнала соответствует регулярному выражению <шаблон>. При наличии более одного --grep=<шаблон> выбираются коммиты, чьё сообщение соответствует любому из <шаблон> (но см. --all-match).

--all-match

Ограничить вывод коммитов теми, которые соответствуют всем заданным --grep, а не тем, которые соответствуют хотя бы одному.

--invert-grep

Ограничить вывод коммитов теми, у которых сообщение журнала не соответствует <шаблон>, указанному с помощью --grep=<шаблон>.

-i
--regexp-ignore-case

Сопоставлять шаблоны ограничения регулярных выражений без учёта регистра букв.

--basic-regexp

Считать шаблоны ограничения базовыми регулярными выражениями; это значение по умолчанию.

-E
--extended-regexp

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

-F
--fixed-strings

Считать шаблоны ограничения фиксированными строками (не интерпретировать шаблон как регулярное выражение).

-P
--perl-regexp

Считать шаблоны ограничения Perl-совместимыми регулярными выражениями.

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

--remove-empty

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

--merges

Печатать только коммиты слияния. Это точно то же самое, что и --min-parents=2.

--no-merges

Не печатать коммиты с более чем одним родителем. Это точно то же самое, что и --max-parents=1.

--min-parents=<число>
--max-parents=<число>
--no-min-parents
--no-max-parents

Показывать только коммиты, которые имеют по крайней мере (или не более) указанное количество родительских коммитов. В частности, --max-parents=1 — то же самое, что --no-merges, --min-parents=2 — то же самое, что --merges. --max-parents=0 даёт все корневые коммиты, а --min-parents=3 — все слияния octopus.

--no-min-parents и --no-max-parents сбрасывают эти ограничения (снимают ограничения). Эквивалентными формами являются --min-parents=0 (любой коммит имеет 0 или более родителей) и --max-parents=-1 (отрицательные числа означают отсутствие верхнего предела).

--first-parent

При поиске коммитов для включения следовать только первому родительскому коммиту при обнаружении коммита слияния. Этот параметр может дать лучший обзор при просмотре эволюции конкретной тематической ветки, поскольку слияния в тематическую ветку, как правило, касаются только периодической подстройки под обновлённый вышестоящий (upstream) репозиторий, и этот параметр позволяет вам игнорировать отдельные коммиты, внесённые в вашу историю таким слиянием.

--exclude-first-parent-only

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

--maximal-only

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

--not

Инвертирует значение префикса ^ (или его отсутствие) для всех последующих спецификаторов редакций вплоть до следующего --not. При использовании в командной строке перед --stdin редакции, переданные через stdin, не будут им затронуты. И наоборот, при передаче через стандартный ввод, редакции, переданные в командной строке, не будут им затронуты.

--all

Предполагать, как если бы все ссылки в refs/, вместе с HEAD, были перечислены в командной строке как <коммит>.

--branches[=<шаблон>]

Предполагать, как если бы все ссылки в refs/heads были перечислены в командной строке как <коммит>. Если задан <шаблон>, ограничить ветки теми, которые соответствуют заданному glob-шаблону оболочки. Если в <шаблоне> отсутствуют ?, * или [, подразумевается /* в конце.

--tags[=<шаблон>]

Предполагать, как если бы все ссылки в refs/tags были перечислены в командной строке как <коммит>. Если задан <шаблон>, ограничить метки теми, которые соответствуют заданному glob-шаблону оболочки. Если в шаблоне отсутствуют ?, * или [, подразумевается /* в конце.

--remotes[=<шаблон>]

Предполагать, как если бы все ссылки в refs/remotes были перечислены в командной строке как <коммит>. Если задан <шаблон>, ограничить отслеживаемые внешние ветки теми, которые соответствуют заданному glob-шаблону оболочки. Если в шаблоне отсутствуют ?, * или [, подразумевается /* в конце.

--glob=<шаблон-glob>

Предполагать, как если бы все ссылки, соответствующие glob-шаблону оболочки <glob-шаблон>, были перечислены в командной строке как <коммит>. Ведущий refs/ автоматически добавляется, если отсутствует. Если в шаблоне отсутствуют ?, * или [, подразумевается /* в конце.

--exclude=<шаблон-glob>

Не включать ссылки, соответствующие <glob-шаблон>, которые в противном случае были бы учтены следующим --all, --branches, --tags, --remotes или --glob. Повторения этого параметра накапливают шаблоны исключения до следующего параметра --all, --branches, --tags, --remotes или --glob (другие параметры или аргументы не очищают накопленные шаблоны).

Заданные шаблоны не должны начинаться с refs/heads, refs/tags или refs/remotes при применении к --branches, --tags или --remotes соответственно, и они должны начинаться с refs/ при применении к --glob или --all. Если подразумевается завершающий /*, он должен быть указан явно.

--exclude-hidden=(fetch|receive|uploadpack)

Не включать ссылки, которые были бы скрыты git-fetch, git-receive-pack или git-upload-pack путём обращения к соответствующей конфигурации fetch.hideRefs, receive.hideRefs или uploadpack.hideRefs вместе с transfer.hideRefs (см. git-config[1]). Этот параметр влияет на следующий параметр псевдоссылки --all или --glob и очищается после их обработки.

--reflog

Предполагать, как если бы все объекты, упомянутые в журналах ссылок (reflogs), были перечислены в командной строке как <коммит>.

--alternate-refs

Предполагать, как если бы все объекты, упомянутые как верхушки (tips) ссылок дополнительных репозиториев, были перечислены в командной строке. Дополнительный репозиторий — это любой репозиторий, чей каталог объектов указан в objects/info/alternates. Набор включаемых объектов может быть изменён с помощью core.alternateRefsCommand и т.д. См. git-config[1].

--single-worktree

По умолчанию следующие параметры будут проверять все рабочие каталоги, когда их больше одного (см. git-worktree[1]): --all, --reflog и --indexed-objects. Этот параметр заставляет их проверять только текущий рабочий каталог.

--ignore-missing

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

--stdin

В дополнение к получению аргументов из командной строки, также читать их из стандартного ввода. Это принимает коммиты и псевдопараметры, такие как --all и --glob=. Когда встречается разделитель --, следующий ввод обрабатывается как пути и используется для ограничения результата. Флаги, такие как --not, которые читаются через стандартный ввод, учитываются только для аргументов, переданных таким же образом, и не будут влиять на последующие аргументы командной строки.

--quiet

Не печатать ничего в стандартный вывод. Эта форма в первую очередь предназначена для того, чтобы вызывающая сторона могла проверить код завершения, чтобы увидеть, полностью ли связан диапазон объектов (или нет). Это быстрее, чем перенаправление stdout в /dev/null, поскольку вывод не нужно форматировать.

--disk-usage
--disk-usage=human

Подавить обычный вывод; вместо этого вывести сумму байтов, используемых для хранения на диске выбранными коммитами или объектами. Это эквивалентно передаче вывода в git cat-file --batch-check='%(objectsize:disk), за исключением того, что это работает намного быстрее (особенно с --use-bitmap-index). Ограничения того, что означает «хранение на диске», см. в разделе CAVEATS в git-cat-file[1]. С необязательным значением human размер хранения на диске отображается в удобочитаемой строке (например, 12.24 КиБ, 3.50 МиБ).

--cherry-mark

Как --cherry-pick (см. ниже), но помечает эквивалентные коммиты символом =, а не опускает их, а неэквивалентные — символом +.

--cherry-pick

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

Например, если у вас есть две ветки, A и B, обычный способ перечислить все коммиты только на одной из них — использовать --left-right (см. пример ниже в описании параметра --left-right). Однако он показывает коммиты, которые были скопированы (cherry-picked) из другой ветки (например, «3rd on b» мог быть скопирован из ветки A). С этим параметром такие пары коммитов исключаются из вывода.

--left-only
--right-only

Перечислять только коммиты на соответствующей стороне симметрической разности, т.е. только те, которые были бы помечены < или > параметром --left-right.

Например, --cherry-pick --right-only A...B опускает те коммиты из B, которые находятся в A или являются эквивалентными по изменению (patch-equivalent) коммиту в A. Другими словами, это перечисляет коммиты + из git cherry A B. Более точно, --cherry-pick --right-only --no-merges даёт точный список.

--cherry

Синоним для --right-only --cherry-mark --no-merges; полезен для ограничения вывода коммитами на нашей стороне и пометки тех, которые были применены к другой стороне разветвлённой истории, с помощью git log --cherry upstream...mybranch, аналогично git cherry upstream mybranch.

-g
--walk-reflogs

Вместо обхода цепочки предков коммитов обходить записи журнала ссылок (reflog) от самых последних к более старым. При использовании этого параметра вы не можете указывать коммиты для исключения (то есть обозначения ^<коммит>, <коммит1>..<коммит2> и <коммит1>...<коммит2> не могут использоваться).

С форматом --pretty, отличным от oneline и reference (по понятным причинам), это приводит к появлению в выводе двух дополнительных строк информации, взятой из журнала ссылок (reflog). Обозначение журнала ссылок в выводе может отображаться как ref@{<N-й>} (где <N-й> — это обратный хронологический индекс в журнале ссылок) или как ref@{<временная-метка>}<временной-меткой> для этой записи), в зависимости от нескольких правил:

  1. Если начальная точка указана как ref@{<N-й>}, показывать формат индекса.

  2. Если начальная точка была указана как ref@{now}, показывать формат временной метки.

  3. Если не использовалось ни то, ни другое, но --date был указан в командной строке, показывать временную метку в формате, запрошенном --date.

  4. В противном случае показывать формат индекса.

В режиме --pretty=oneline сообщение коммита имеет префикс с этой информацией в той же строке. Этот параметр нельзя комбинировать с --reverse. См. также git-reflog[1].

В режиме --pretty=reference эта информация вообще не будет отображаться.

--merge

Показывать коммиты, затрагивающие конфликтующие пути, в диапазоне HEAD...<другое>, где <другое> — это первая существующая псевдоссылка в MERGE_HEAD, CHERRY_PICK_HEAD, REVERT_HEAD или REBASE_HEAD. Работает только тогда, когда в индексе есть неслитые (unmerged) записи. Этот параметр можно использовать для показа соответствующих коммитов при разрешении конфликтов из трёхстороннего слияния.

--boundary

Выводить исключённые граничные коммиты. Граничные коммиты имеют префикс -.

--use-bitmap-index

Попытаться ускорить обход, используя индекс битовой карты пакета (pack bitmap index) (если он доступен). Обратите внимание, что при обходе с --objects пути, связанные с деревьями и blob-объектами, не будут выводиться.

--progress=<заголовок>

Показывать отчёты о ходе выполнения в stderr по мере обработки объектов. Текст <заголовок> будет выводиться с каждым обновлением хода выполнения.

-z

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

<OID> NUL [<лексема>=<значение> NUL]...

Дополнительные метаданные объекта, такие как пути объектов или граничные объекты, выводятся с использованием формы <лексема>=<значение>. Значения лексем выводятся как есть без какого-либо кодирования/усечения. Запись OID никогда не содержит символ = и поэтому используется для сигнализации о начале новой записи объекта. Примеры:

<OID> NUL
<OID> NUL path=<путь> NUL
<OID> NUL boundary=yes NUL
<OID> NUL missing=yes NUL [<лексема>=<значение> NUL]...

Этот режим совместим только с параметрами вывода --objects, --boundary и --missing.

Упрощение истории

Иногда вас интересуют только части истории, например, коммиты, изменяющие конкретный <путь>. Но в «Упрощении истории» есть две части: одна — выбор коммитов, а другая — как это сделать, поскольку существует множество стратегий упрощения истории.

Следующие параметры выбирают коммиты для отображения:

<пути>

Выбираются коммиты, изменяющие заданные <пути>.

--simplify-by-decoration

Выбираются коммиты, на которые ссылается какая-либо ветка или метка.

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

Следующие параметры влияют на способ выполнения упрощения:

Режим по умолчанию

Упрощает историю до простейшей истории, объясняющей конечное состояние дерева. Простейшей, потому что она отсекает некоторые побочные ветки, если конечный результат одинаков (т.е. слияние веток с одинаковым содержимым)

--show-pulls

Включает все коммиты из режима по умолчанию, а также любые коммиты слияния, которые не являются TREESAME для первого родителя, но являются TREESAME для последующего родителя. Этот режим полезен для отображения коммитов слияния, которые «первыми внесли» изменение в ветку.

--full-history

То же, что и режим по умолчанию, но не отсекает некоторую историю.

--dense

Показываются только выбранные коммиты плюс некоторые для осмысленности истории.

--sparse

Показываются все коммиты в упрощённой истории.

--simplify-merges

Дополнительный параметр к --full-history для удаления некоторых ненужных слияний из результирующей истории, поскольку нет выбранных коммитов, вносящих вклад в это слияние.

--ancestry-path[=<коммит>]

При задании диапазона коммитов для отображения (например, <коммит1>..<коммит2> или <коммит2> ^<коммит1>) и коммита <коммит> в этом диапазоне, отображать только те коммиты в диапазоне, которые являются предками <коммит>, потомками <коммит> или самим <коммит>. Если коммит не указан, использовать <коммит1> (исключённую часть диапазона) в качестве <коммит>. Может быть передан несколько раз; если да, коммит включается, если он является любым из заданных коммитов или если он является предком или потомком одного из них.

Далее следует более подробное объяснение.

Предположим, вы указали foo в качестве <пути>. Будем называть коммиты, которые изменяют foo, !TREESAME, а остальные — TREESAME. (В разнице (diff), отфильтрованной по foo, они выглядят соответственно разными и одинаковыми.)

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

	  .-A---M---N---O---P---Q
	 /     /   /   /   /   /
	I     B   C   D   E   Y
	 \   /   /   /   /   /
	  `-------------'   X

Горизонтальная линия истории A---Q считается первым родителем каждого слияния. Коммиты:

  • I — это начальный коммит, в котором foo существует с содержимым asdf, и файл quux существует с содержимым quux. Начальные коммиты сравниваются с пустым деревом, поэтому I является !TREESAME.

  • В A foo содержит просто foo.

  • B содержит то же изменение, что и A. Его слияние M тривиально и, следовательно, является TREESAME для всех родителей.

  • C не изменяет foo, но его слияние N изменяет его на foobar, поэтому оно не является TREESAME ни для одного из родителей.

  • D устанавливает foo в baz. Его слияние O объединяет строки из N и D в foobarbaz; т.е. оно не является TREESAME ни для одного из родителей.

  • E изменяет quux на xyzzy, и его слияние P объединяет строки в quux xyzzy. P является TREESAME для O, но не для E.

  • X — это независимый корневой коммит, который добавил новый файл side, а Y изменил его. Y является TREESAME для X. Его слияние Q добавило side в P, и Q является TREESAME для P, но не для Y.

rev-list проходит историю в обратном направлении, включая или исключая коммиты в зависимости от того, используются ли --full-history и/или перезапись родителей (через --parents или --children). Доступны следующие настройки.

Режим по умолчанию

Коммиты включаются, если они не являются TREESAME ни для одного из родителей (хотя это можно изменить, см. --sparse ниже). Если коммит был слиянием и был TREESAME для одного родителя, следовать только этому родителю. (Даже если есть несколько родителей TREESAME, следовать только одному из них.) В противном случае следовать всем родителям.

Это приводит к:

	  .-A---N---O
	 /     /   /
	I---------D

Обратите внимание, как правило следовать только родителю TREESAME, если он доступен, полностью исключило B из рассмотрения. C рассматривался через N, но является TREESAME. Корневые коммиты сравниваются с пустым деревом, поэтому I является !TREESAME.

Отношения родитель/потомок видны только с --parents, но это не влияет на коммиты, выбранные в режиме по умолчанию, поэтому мы показали линии родителей.

--full-history без перезаписи родителей

Этот режим отличается от режима по умолчанию в одном: всегда следовать всем родителям слияния, даже если оно является TREESAME для одного из них. Даже если более чем одна сторона слияния имеет включаемые коммиты, это не означает, что само слияние включается! В примере мы получаем

	I  A  B  N  D  O  P  Q

M был исключён, потому что он является TREESAME для обоих родителей. E, C и B были все пройдены, но только B был !TREESAME, поэтому остальные не появляются.

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

--full-history с перезаписью родителей

Обычные коммиты включаются только в том случае, если они являются !TREESAME (хотя это можно изменить, см. --sparse ниже).

Слияния всегда включаются. Однако их список родителей переписывается: вдоль каждого родителя отсекаются (prune) коммиты, которые сами не включены. Это приводит к

	  .-A---M---N---O---P---Q
	 /     /   /   /   /
	I     B   /   D   /
	 \   /   /   /   /
	  `-------------'

Сравните с --full-history без перезаписи выше. Обратите внимание, что E был отсечён, потому что он является TREESAME, но список родителей P был переписан, чтобы содержать родителя EI. То же самое произошло с C и N, а также с X, Y и Q.

В дополнение к вышеуказанным настройкам вы можете изменить, влияет ли TREESAME на включение:

--dense

Пройденные коммиты включаются, если они не являются TREESAME ни для одного из родителей.

--sparse

Все пройденные коммиты включаются.

Обратите внимание, что без --full-history это всё равно упрощает слияния: если один из родителей является TREESAME, мы следуем только за ним, поэтому другие стороны слияния никогда не просматриваются.

--simplify-merges

Сначала постройте граф истории так же, как это делает --full-history с перезаписью родителей (см. выше).

Затем упростите каждый коммит C до его замены C' в финальной истории в соответствии со следующими правилами:

  • Установите C' в C.

  • Замените каждого родителя P коммита C' его упрощением P'. В процессе отбросьте родителей, которые являются предками других родителей или являются корневыми коммитами TREESAME для пустого дерева, и удалите дубликаты, но будьте осторожны, чтобы никогда не отбрасывать всех родителей, для которых мы являемся TREESAME.

  • Если после этой перезаписи родителей C' является корневым или слитым коммитом (имеет ноль или более одного родителя), граничным коммитом или !TREESAME, он остаётся. В противном случае он заменяется своим единственным родителем.

Эффект этого лучше всего показать путём сравнения с --full-history с перезаписью родителей. Пример превращается в:

	  .-A---M---N---O
	 /     /       /
	I     B       D
	 \   /       /
	  `---------'

Обратите внимание на основные различия в N, P и Q по сравнению с --full-history:

  • Список родителей N был удалён I, потому что он является предком другого родителя M. Тем не менее, N остался, потому что он является !TREESAME.

  • Список родителей P также был удалён I. Затем P был полностью удалён, потому что у него был один родитель, и он является TREESAME.

  • Список родителей Q упростил Y до X. Затем X был удалён, потому что он был корневым TREESAME. Затем Q был полностью удалён, потому что у него был один родитель, и он является TREESAME.

Доступен ещё один режим упрощения:

--ancestry-path[=<коммит>]

Ограничить отображаемые коммиты теми, которые являются предком <коммит>, или которые являются потомком <коммит>, или самим <коммит>.

В качестве примера рассмотрим следующую историю коммитов:

	    D---E-------F
	   /     \       \
	  B---C---G---H---I---J
	 /                     \
	A-------K---------------L--M

Обычный D..M вычисляет набор коммитов, которые являются предками M, но исключает те, которые являются предками D. Это полезно, чтобы увидеть, что произошло в истории, ведущей к M, начиная с D, в смысле «что есть в M, чего не было в D». Результатом в этом примере будут все коммиты, кроме A и B (и самого D, конечно).

Однако, когда мы хотим выяснить, какие коммиты в M заражены ошибкой, внесённой D, и требуют исправления, мы можем захотеть просмотреть только подмножество D..M, которое является фактическими потомками D, т.е. исключая C и K. Это именно то, что делает параметр --ancestry-path. Применённый к диапазону D..M, он даёт:

		E-------F
		 \       \
		  G---H---I---J
			       \
				L--M

Мы также можем использовать --ancestry-path=D вместо --ancestry-path, что означает то же самое при применении к диапазону D..M, но является более явным.

Если вместо этого нас интересует определённая тема в этом диапазоне и все коммиты, затронутые этой темой, мы можем захотеть просмотреть только подмножество D..M, которое содержит эту тему в своём пути предков. Так, например, использование --ancestry-path=H D..M приведёт к:

		E
		 \
	      C---G---H---I---J
			       \
				L--M

Тогда как --ancestry-path=K D..M привело бы к

		K---------------L--M

Прежде чем обсуждать другой параметр, --show-pulls, нам нужно создать новый пример истории.

Распространённая проблема, с которой сталкиваются пользователи при просмотре упрощённой истории, заключается в том, что коммит, который, как они знают, изменил файл, каким-то образом не отображается в упрощённой истории этого файла. Давайте продемонстрируем новый пример и покажем, как такие параметры, как --full-history и --simplify-merges, работают в этом случае:

	  .-A---M-----C--N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`-Z'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `---Y--'

Для этого примера предположим, что I создал file.txt, который был изменён A, B и X по-разному. Коммиты с одним родителем C, Z и Y не изменяют file.txt. Коммит слияния M был создан путём разрешения конфликта слияния, чтобы включить оба изменения из A и B, и поэтому не является TREESAME ни для одного из них. Однако коммит слияния R был создан путём игнорирования содержимого file.txt в M и взятия только содержимого file.txt в X. Следовательно, R является TREESAME для X, но не для M. Наконец, естественное разрешение слияния для создания N — взять содержимое file.txt в R, поэтому N является TREESAME для R, но не для C. Коммиты слияния O и P являются TREESAME для своих первых родителей, но не для своих вторых родителей, Z и Y соответственно.

При использовании режима по умолчанию N и R имеют родителя TREESAME, поэтому эти рёбра обходятся, а остальные игнорируются. Результирующий граф истории:

	I---X

При использовании --full-history Git обходит каждое ребро. Это обнаружит коммиты A и B и слияние M, но также выявит коммиты слияния O и P. С перезаписью родителей результирующий граф:

	  .-A---M--------N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`--'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `------'

Здесь коммиты слияния O и P вносят дополнительный шум, поскольку они фактически не вносили изменений в file.txt. Они лишь объединили тему, которая была основана на старой версии file.txt. Это распространённая проблема в репозиториях, использующих рабочий процесс, в котором многие участники работают параллельно и объединяют свои тематические ветки в одном стволе: в результатах --full-history появляется много несвязанных слияний.

При использовании параметра --simplify-merges коммиты O и P исчезают из результатов. Это происходит потому, что переписанные вторые родители O и P достижимы из их первых родителей. Эти рёбра удаляются, и тогда коммиты выглядят как коммиты с одним родителем, которые являются TREESAME для своего родителя. Это также происходит с коммитом N, в результате чего представление истории выглядит следующим образом:

	  .-A---M--.
	 /     /    \
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

В этом представлении мы видим все важные изменения с одним родителем от A, B и X. Мы также видим тщательно разрешённое слияние M и не столь тщательно разрешённое слияние R. Обычно этой информации достаточно, чтобы определить, почему коммиты A и B «исчезли» из истории в представлении по умолчанию. Однако у этого подхода есть несколько проблем.

Первая проблема — производительность. В отличие от любых предыдущих параметров, параметр --simplify-merges требует обхода всей истории коммитов перед возвратом единственного результата. Это может затруднить использование этого параметра для очень больших репозиториев.

Вторая проблема — аудит. Когда многие участники работают над одним репозиторием, важно, какие коммиты слияния внесли изменение в важную ветку. Проблемное слияние R выше, вероятно, не является коммитом слияния, который использовался для слияния с важной веткой. Вместо этого слияние N использовалось для слияния R и X в важную ветку. Этот коммит может содержать в своём сообщении информацию о том, почему изменение X переопределило изменения из A и B.

--show-pulls

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

Когда коммит слияния включается с помощью --show-pulls, слияние рассматривается так, как если бы оно «извлекло» (pulled) изменение из другой ветки. При использовании --show-pulls в этом примере (и никаких других параметров) результирующий граф:

	I---X---R---N

Здесь коммиты слияния R и N включены, потому что они извлекли (pulled) коммиты X и R в базовую ветку соответственно. Эти слияния являются причиной того, что коммиты A и B не отображаются в истории по умолчанию.

Когда --show-pulls используется вместе с --simplify-merges, граф включает всю необходимую информацию:

	  .-A---M--.   N
	 /     /    \ /
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

Обратите внимание, что поскольку M достижим из R, ребро от N к M было упрощено. Однако N по-прежнему появляется в истории как важный коммит, потому что он «извлёк» (pulled) изменение R в основную ветку.

Параметр --simplify-by-decoration позволяет просматривать только общую картину топологии истории, опуская коммиты, на которые нет ссылок из меток. Коммиты помечаются как !TREESAME (другими словами, сохраняются после правил упрощения истории, описанных выше), если (1) на них есть ссылки из меток или (2) они изменяют содержимое путей, указанных в командной строке. Все остальные коммиты помечаются как TREESAME (подлежат упрощению).

Вспомогательные средства двоичного поиска

--bisect

Ограничить вывод одним объектом-коммитом, который находится примерно на полпути между включаемыми и исключаемыми коммитами. Обратите внимание, что плохая ссылка двоичного поиска refs/bisect/bad добавляется к включаемым коммитам (если она существует), а хорошие ссылки двоичного поиска refs/bisect/good-* добавляются к исключаемым коммитам (если они существуют). Таким образом, предполагая, что в refs/bisect/ нет ссылок, если

	$ git rev-list --bisect foo ^bar ^baz

выводит midpoint, результат двух команд

	$ git rev-list foo ^midpoint
	$ git rev-list midpoint ^bar ^baz

будут примерно одинаковой длины. Таким образом, поиск изменения, которое вносит регрессию, сводится к двоичному поиску: многократно генерировать и тестировать новые «midpoint», пока цепочка коммитов не станет длиной в один.

--bisect-vars

Это вычисляет то же самое, что и --bisect, за исключением того, что ссылки в refs/bisect/ не используются, и за исключением того, что выводится текст, готовый к выполнению (eval) оболочкой. Эти строки присвоят имя средней редакции (midpoint) переменной bisect_rev, ожидаемое количество коммитов для тестирования после тестирования bisect_revbisect_nr, ожидаемое количество коммитов для тестирования, если bisect_rev окажется хорошим, — bisect_good, ожидаемое количество коммитов для тестирования, если bisect_rev окажется плохим, — bisect_bad, и количество коммитов, для которых мы сейчас выполняем двоичный поиск, — bisect_all.

--bisect-all

Это выводит все объекты-коммиты между включаемыми и исключаемыми коммитами, упорядоченные по их расстоянию до включаемых и исключаемых коммитов. Ссылки в refs/bisect/ не используются. Сначала отображается самый дальний от них. (Это единственный, отображаемый --bisect.)

Это полезно, потому что позволяет легко выбрать хороший коммит для тестирования, когда вы хотите по какой-то причине избежать тестирования некоторых из них (например, они могут не компилироваться).

Этот параметр можно использовать вместе с --bisect-vars; в этом случае после всех отсортированных объектов-коммитов будет тот же текст, как если бы --bisect-vars использовался отдельно.

Упорядочивание коммитов

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

--date-order

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

--author-date-order

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

--topo-order

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

Например, в истории коммитов, подобной этой:

    ---1----2----4----7
	\	       \
	 3----5----6----8---

где числа обозначают порядок временных меток коммитов, git rev-list и подобные команды с --date-order показывают коммиты в порядке временных меток: 8 7 6 5 4 3 2 1.

С --topo-order они покажут 8 6 5 3 7 4 2 1 (или 8 7 4 2 6 5 3 1); некоторые более старые коммиты показываются перед более новыми, чтобы избежать перемешивания коммитов из двух параллельных веток разработки.

--reverse

Выводить коммиты, выбранные для отображения (см. раздел «Ограничение коммитов» выше), в обратном порядке. Нельзя комбинировать с --walk-reflogs.

Обход объектов

Эти параметры в основном предназначены для упаковки репозиториев Git.

--objects

Выводить идентификаторы объектов любого объекта, на который ссылаются перечисленные коммиты. Таким образом, --objects foo ^bar означает «отправь мне все идентификаторы объектов, которые мне нужно загрузить, если у меня есть объект-коммит bar, но нет foo». См. также --object-names ниже.

--in-commit-order

Выводить идентификаторы деревьев и blob-объектов в порядке коммитов. Идентификаторы деревьев и blob-объектов выводятся после того, как на них впервые появится ссылка из коммита.

--objects-edge

Аналогично --objects, но также выводит идентификаторы исключённых коммитов с префиксом "-". Это используется git-pack-objects[1] для создания «тонкого» (thin) пакета, который записывает объекты в дельтифицированной форме на основе объектов, содержащихся в этих исключённых коммитах, для уменьшения сетевого трафика.

--objects-edge-aggressive

Аналогично --objects-edge, но прилагает больше усилий для поиска исключённых коммитов ценой увеличения времени. Это используется вместо --objects-edge для создания «тонких» (thin) пакетов для частичных (shallow) репозиториев.

--indexed-objects

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

--unpacked

Полезно только с --objects; выводить идентификаторы объектов, которые не находятся в пакетах.

--object-names

Полезно только с --objects; выводить имена найденных идентификаторов объектов. Это поведение по умолчанию. Обратите внимание, что «имя» каждого объекта неоднозначно и в основном предназначено как подсказка для упаковки объектов. В частности: не делается различий между именами меток, деревьев и blob-объектов; имена путей могут быть изменены для удаления новых строк; и если объект появляется несколько раз с разными именами, показывается только одно имя.

--no-object-names

Полезно только с --objects; не выводить имена найденных идентификаторов объектов. Это инвертирует --object-names. Этот флаг позволяет выводу легче анализироваться такими командами, как git-cat-file[1].

--filter=<спецификатор-фильтра>

Полезно только с одним из --objects*; опускает объекты (обычно blob-объекты) из списка выводимых объектов. <спецификатор-фильтра> может быть одним из следующих:

Форма --filter=blob:none опускает все blob-объекты.

Форма --filter=blob:limit=<n>[kmg] опускает blob-объекты размером не менее <n> байт или единиц. <n> может быть нулём. Суффиксы k, m и g можно использовать для указания единиц в КиБ, МиБ или ГиБ. Например, blob:limit=1k — то же самое, что blob:limit=1024.

Форма --filter=object:type=(tag|commit|tree|blob) опускает все объекты, которые не относятся к запрошенному типу. Обратите внимание, что явно предоставленные объекты игнорируют фильтры и всегда выводятся, если также не указан --filter-provided-objects.

Форма --filter=sparse:oid=<blob-ish> использует спецификацию частичного переключения (sparse-checkout), содержащуюся в blob-объекте (или blob-выражении) <blob-ish>, чтобы опустить blob-объекты, которые не потребовались бы для частичного переключения на запрошенных ссылках.

Форма --filter=tree:<глубина> опускает все деревья и blob-объекты, чья глубина от корневого дерева >= <глубина> (минимальная глубина, если объект находится на нескольких глубинах в пройденных коммитах). <глубина>=0 не будет включать никакие деревья или blob-объекты, если они не включены явно в командной строке (или в стандартном вводе при использовании --stdin). <глубина>=1 будет включать только дерево и blob-объекты, на которые непосредственно ссылается коммит, достижимый из <коммит> или явно заданный объект. <глубина>=2 аналогична <глубина>=1, но также включает деревья и blob-объекты, удалённые на один уровень от явно заданного коммита или дерева.

Обратите внимание, что форма --filter=sparse:path=<путь>, которая хотела читать из произвольного пути в файловой системе, была удалена по соображениям безопасности.

Можно указать несколько флагов --filter= для объединения фильтров. Включаются только объекты, которые принимаются каждым фильтром.

Форму --filter=combine:<фильтр1>+<фильтр2>+...<фильтрN> также можно использовать для объединения нескольких фильтров, но это сложнее, чем просто повторять флаг --filter, и обычно не требуется. Фильтры соединяются с помощью +, а отдельные фильтры %-кодируются (т.е. URL-кодируются). Кроме символов + и %, следующие символы зарезервированы и также должны быть закодированы: ~!@#$^&*()[]{}\;",<>?'`, а также все символы с ASCII-кодом <= 0x20, включая пробел и новую строку.

Другие произвольные символы также могут быть закодированы. Например, combine:tree:3+blob:none и combine:tree%3A3+blob%3Anone эквивалентны.

--no-filter

Отключить любой предыдущий аргумент --filter=.

--filter-provided-objects

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

--filter-print-omitted

Полезно только с --filter=; выводит список объектов, опущенных фильтром. Идентификаторы объектов имеют префикс в виде символа “~”.

--missing=<действие-при-отсутствии>

Параметр отладки, помогающий будущей разработке «частичного клонирования». Этот параметр определяет, как обрабатываются отсутствующие объекты.

Форма --missing=error требует, чтобы rev-list остановился с ошибкой, если встретится отсутствующий объект. Это действие по умолчанию.

Форма --missing=allow-any позволяет продолжить обход объектов, если встретится отсутствующий объект. Отсутствующие объекты будут молча опущены в результатах.

Форма --missing=allow-promisor похожа на allow-any, но позволяет продолжить обход объектов только для ОЖИДАЕМЫХ отсутствующих объектов-поручителей (promisor). Неожиданный отсутствующий объект вызовет ошибку.

Форма --missing=print похожа на allow-any, но также выводит список отсутствующих объектов. Идентификаторы объектов имеют префикс в виде символа “?”.

Форма --missing=print-info похожа на print, но также выводит дополнительную информацию об отсутствующем объекте, полученную из содержащего его объекта. Вся информация выводится в одной строке с идентификатором отсутствующего объекта в форме: ?<oid> [<лексема>=<значение>].... Пары <лексема>=<значение>, содержащие дополнительную информацию, отделяются друг от друга ПРОБЕЛОМ. Значение кодируется специфическим для лексемы образом, но ПРОБЕЛ или ПЕРЕВОД_СТРОКИ, содержащиеся в значении, всегда должны быть представлены таким образом, чтобы результирующее закодированное значение не содержало ни одного из этих двух проблемных байтов. Каждый <лексема>=<значение> может быть одним из следующих:

  • path=<путь> показывает путь отсутствующего объекта, полученный из содержащего его объекта. Путь, содержащий ПРОБЕЛ или специальные символы, при необходимости заключается в двойные кавычки в стиле C.

  • type=<тип> показывает тип отсутствующего объекта, полученный из содержащего его объекта.

Если некоторые верхушки (tips), переданные для обхода, отсутствуют, они также будут считаться отсутствующими, и обход проигнорирует их. Однако, если мы не можем получить их идентификатор объекта, будет вызвана ошибка.

--exclude-promisor-objects

(Только для внутреннего использования.) Предварительная фильтрация обхода объектов на границе поручителя (promisor). Используется с частичным клонированием. Это сильнее, чем --missing=allow-promisor, потому что это ограничивает обход, а не просто подавляет ошибки об отсутствующих объектах.

--no-walk[=(sorted|unsorted)]

Показывать только заданные коммиты, но не обходить их предков. Это не имеет эффекта, если указан диапазон. Если указан аргумент unsorted, коммиты показываются в том порядке, в котором они были заданы в командной строке. В противном случае (если указан sorted или аргумент не указан) коммиты показываются в обратном хронологическом порядке по времени коммита. Нельзя комбинировать с --graph.

--do-walk

Переопределяет предыдущий --no-walk.

Форматирование коммитов

Используя эти параметры, git-rev-list[1] будет действовать аналогично более специализированному семейству инструментов журнала коммитов: git-log[1], git-show[1], и git-whatchanged[1].

--pretty[=<формат>]
--format=<формат>

Вывести содержимое журналов коммитов в заданном структурированном формате, где <формат> может быть одним из: oneline, short, medium, full, fuller, reference, email, raw, format:<строка> и tformat:<строка>. Если <формат> не является ни одним из вышеперечисленных и содержит %<заполнитель>, он действует так, как если бы был задан --pretty=tformat:<формат>.

См. раздел "СТРУКТУРИРОВАННЫЕ ФОРМАТЫ" для получения дополнительных сведений о каждом формате. Если часть =<формат> опущена, по умолчанию используется medium.

Note
вы можете указать структурированный формат по умолчанию в конфигурации репозитория (см. git-config[1]).
--abbrev-commit

Вместо отображения полного 40-байтового шестнадцатеричного имени объекта коммита показывать префикс, который однозначно именует объект. Параметр --abbrev=<n> (которая также изменяет вывод diff, если он отображается) может быть использована для указания минимальной длины префикса.

Это должно сделать --pretty=oneline намного более читаемым для людей, использующих терминалы с 80 колонками.

--no-abbrev-commit

Показать полное 40-байтовое шестнадцатеричное имя объекта коммита. Это отменяет --abbrev-commit, как явный, так и подразумеваемый другими опциями, такими как --oneline. Также это переопределяет переменную log.abbrevCommit.

--oneline

Это краткая форма для совместного использования --pretty=oneline --abbrev-commit.

--encoding=<кодировка>

Объекты коммитов записывают кодировку символов, используемую для сообщения журнала, в своём заголовке encoding; этот параметр можно использовать, чтобы указать команде перекодировать сообщение журнала коммита в кодировку, предпочитаемую пользователем. Для команд не внутреннего интерфейса по умолчанию используется UTF-8. Обратите внимание, что если объект утверждает, что закодирован в X, и мы выводим в X, мы будем выводить объект как есть; это означает, что недопустимые последовательности в исходном коммите могут быть скопированы в вывод. Аналогично, если iconv(3) не удаётся преобразовать коммит, мы будем молча выводить исходный объект как есть.

--expand-tabs=<n>
--expand-tabs
--no-expand-tabs

Выполнить раскрытие табуляции (заменить каждый таб достаточным количеством пробелов, чтобы заполнить до следующего столбца отображения, кратного <n>) в сообщении журнала перед его отображением в выводе. --expand-tabs — это краткая форма для --expand-tabs=8, а --no-expand-tabs — краткая форма для --expand-tabs=0, которая отключает раскрытие табуляции.

По умолчанию табуляция раскрывается в красивых форматах, которые делают отступ сообщения журнала в 4 пробела (т.е. medium, который является форматом по умолчанию, full и fuller).

--show-signature

Проверить действительность подписанного объекта коммита, передав подпись в gpg --verify, и показать вывод.

--relative-date

Синоним для --date=relative.

--date=<формат>

Вступает в силу только для дат, отображаемых в удобочитаемом формате, например, при использовании --pretty. Переменная конфигурации log.date устанавливает значение по умолчанию для параметра --date команды log. По умолчанию даты отображаются в исходном часовом поясе (либо коммиттера, либо автора). Если к формату добавлен -local (например, iso-local), вместо него используется местный часовой пояс пользователя.

--date=relative показывает даты относительно текущего времени, например, “2 часа назад”. Параметр -local не имеет эффекта для --date=relative.

--date=local — это псевдоним для --date=default-local.

--date=iso (или --date=iso8601) показывает временные метки в формате, подобном ISO 8601. Отличия от строгого формата ISO 8601:

  • пробел вместо разделителя даты/времени T

  • пробел между временем и часовым поясом

  • отсутствие двоеточия между часами и минутами часового пояса

--date=iso-strict (или --date=iso8601-strict) показывает временные метки в строгом формате ISO 8601.

--date=rfc (или --date=rfc2822) показывает временные метки в формате RFC 2822, часто встречающемся в сообщениях электронной почты.

--date=short показывает только дату, но не время, в формате ГГГГ-ММ-ДД.

--date=raw показывает дату как количество секунд с начала эпохи (1970-01-01 00:00:00 UTC), затем пробел, а затем часовой пояс как смещение от UTC (символ + или - с четырьмя цифрами; первые две — часы, вторые две — минуты). Т.е. как если бы временная метка была отформатирована с помощью strftime("%s %z")). Обратите внимание, что параметр -local не влияет на значение секунд с начала эпохи (которое всегда измеряется в UTC), но изменяет сопутствующее значение часового пояса.

--date=human показывает часовой пояс, если он не совпадает с текущим часовым поясом, и не печатает всю дату, если она совпадает (т.е. пропускает печать года для дат, которые «в этом году», а также пропускает всю дату, если она была в последние несколько дней, и можно просто сказать, какой это был день недели). Для более старых дат час и минута также опускаются.

--date=unix показывает дату как временную метку эпохи Unix (секунды с 1970 года). Как и в случае с --raw, это всегда в UTC, и поэтому -local не имеет эффекта.

--date=format:<формат> передаёт <формат> в вашу системную функцию strftime, за исключением %s, %z и %Z, которые обрабатываются внутри. Используйте --date=format:%c, чтобы показать дату в предпочтительном формате вашей системной локали. Полный список меток-заполнителей формата см. в руководстве strftime(3). При использовании -local правильный синтаксис: --date=format-local:<формат>.

--date=default — это формат по умолчанию, основанный на выводе ctime(3). Он показывает одну строку с трёхбуквенным днём недели, трёхбуквенным месяцем, днём месяца, временем в формате "ЧЧ:ММ:СС", за которым следует 4-значный год, плюс информация о часовом поясе, если не используется местный часовой пояс, например, Thu Jan 1 00:00:00 1970 +0000.

--header

Выводит содержимое коммита в необработанном формате; каждая запись разделяется символом NUL.

--no-commit-header

Подавляет строку заголовка, содержащую «commit» и идентификатор объекта, выводимую перед указанным форматом. Это не влияет на встроенные форматы; затрагиваются только пользовательские форматы.

--commit-header

Переопределяет предыдущий --no-commit-header.

--parents

Выводит также родителей коммита (в форме «commit parent…​»). Также включает перезапись родителей; см. «Упрощение истории» выше.

--children

Выводит также потомков коммита (в форме «commit child…​»). Также включает перезапись родителей; см. «Упрощение истории» выше.

--timestamp

Выводит необработанную временную метку коммита.

--left-right

Отмечает, с какой стороны симметрической разности достижим коммит. Коммиты с левой стороны имеют префикс <, а с правой — >. Если комбинируется с --boundary, эти коммиты имеют префикс -.

Например, если у вас такая топология:

	     y---b---b  branch B
	    / \ /
	   /   .
	  /   / \
	 o---x---a---a  branch A

вы получите вывод, подобный этому:

	$ git rev-list --left-right --boundary --pretty=oneline A...B

	>bbbbbbb... 3-й на b
	>bbbbbbb... 2-й на b
	<aaaaaaa... 3-й на a
	<aaaaaaa... 2-й на a
	-yyyyyyy... 1-й на b
	-xxxxxxx... 1-й на a
--graph

Рисует текстовое графическое представление истории коммитов в левой части вывода. Это может привести к печати дополнительных строк между коммитами, чтобы граф истории был нарисован правильно. Нельзя комбинировать с --no-walk.

Это включает перезапись родителей; см. «Упрощение истории» выше.

Это по умолчанию подразумевает параметр --topo-order, но также может быть указан параметр --date-order.

--show-linear-break[=<барьер>]

Когда --graph не используется, все ветки истории сглаживаются, что может затруднить понимание того, что два последовательных коммита не принадлежат линейной ветке. В этом случае этот параметр помещает между ними барьер. Если указан <барьер>, это строка, которая будет показана вместо строки по умолчанию.

--count

Вывести число, указывающее, сколько коммитов было бы перечислено, и подавить весь остальной вывод. При совместном использовании с --left-right вместо этого вывести количество коммитов слева и справа, разделённых табуляцией. При совместном использовании с --cherry-mark исключить эквивалентные по изменению (patch equivalent) коммиты из этих подсчётов и вывести количество эквивалентных коммитов, разделённых табуляцией.

СТРУКТУРИРОВАННЫЕ ФОРМАТЫ

Если коммит является слиянием и структурированный формат не является oneline, email или raw, перед строкой Author: вставляется дополнительная строка. Эта строка начинается с "Merge: " и содержит хеши родительских коммитов, разделённые пробелами. Обратите внимание, что перечисленные коммиты могут не обязательно быть списком прямых родительских коммитов, если вы ограничили свой обзор истории: например, если вас интересуют только изменения, связанные с определённым каталогом или файлом.

Существует несколько встроенных форматов, и вы можете определить дополнительные форматы, установив параметр конфигурации pretty.<имя> либо в другое имя формата, либо в строку format:, как описано ниже (см. git-config[1]). Вот подробности встроенных форматов:

oneline
<хеш> <строка-заголовка>

Этот формат задуман так, чтобы он был настолько компактным, насколько это возможно.

short
commit <хеш> Author: <автор>
_
    <строка-заголовка>_
medium
commit <хеш> Author: <автор> Date: <дата-автора>
_
    <строка-заголовка>

    <полное-сообщение-коммита>_
full
commit <хеш> Author: <автор> Commit: <коммиттер>
_
    <строка-заголовка>

    <полное-сообщение-коммита>_
fuller
commit <хеш> Author: <автор> AuthorDate: <дата-создания> Commit: <коммиттер> CommitDate: <дата-коммита>
_
     <строка-заголовка>

     <полное-сообщение-коммита>_
reference
<краткий-хеш> (<строка-заголовка>, <короткая-дата-создания>)

Этот формат используется для ссылки на другой коммит в сообщении коммита и совпадает с --pretty='format:%C(auto)%h (%s, %ad). По умолчанию дата форматируется с помощью --date=short, если явно не указан другой параметр --date. Как и в случае с любым format: с заполнителями формата, на его вывод не влияют другие опции, такие как --decorate и --walk-reflogs.

email
From <хеш> <дата> From: <автор> Date: <дата-создания> Subject: [PATCH] <строка-заголовка>
_
<полное-сообщение-коммита>_
mboxrd

Как и email, но строки в сообщении коммита, начинающиеся с "From " (перед которыми стоит ноль или более ">"), заключаются в кавычки с помощью ">", чтобы их нельзя было перепутать с началом нового коммита.

raw

Формат raw показывает весь коммит точно так, как он хранится в объекте коммита. Примечательно, что хеши отображаются полностью, независимо от того, используются ли --abbrev или --no-abbrev, и информация о родителях показывает истинные родительские коммиты, без учёта сращиваний или упрощения истории. Обратите внимание, что этот формат влияет на способ отображения коммитов, но не на способ показа разницы, например, с помощью git log --raw. Чтобы получить полные имена объектов в сыром формате разницы, используйте --no-abbrev.

format:<строка-формата>

Формат format:<строка-формата> позволяет указать, какую информацию вы хотите показать. Он работает немного похоже на формат printf, с тем важным исключением, что новая строка получается с помощью %n вместо \n.

Например, format:"Автором %h был %an, %ar%nЗаголовок >>%s<<%n" выведет что-то вроде:

Автором fe6e0ee был Junio C Hamano, 23 hours ago
Заголовок >>t4119: проверка автовычисления -p<n> для традиционного вывода diff.<<

Возможные метки-заполнители включают:

  • Метки-заполнители, которые раскрываются в один конкретный символ:

    %n

    перенос строки

    %%

    необработанный %

    %x00

    %x с последующими двумя шестнадцатеричными цифрами заменяется байтом со значением этих шестнадцатеричных цифр (в оставшейся части этого документа мы будем называть это "литеральным кодом форматирования").

  • Метки-заполнители, которые влияют на форматирование последующих меток-заполнителей:

    %Cred

    переключить цвет на красный

    %Cgreen

    переключить цвет на зелёный

    %Cblue

    переключить цвет на синий

    %Creset

    сбросить цвет на стандартный

    %C(<спецификация>)

    спецификация цвета, как описано в разделе Значения раздела "КОНФИГУРАЦИОННЫЙ ФАЙЛ" в git-config[1]. По умолчанию цвета показываются только когда они включены для вывода журнала (с помощью color.diff, color.ui или --color, и с учётом настроек auto первых, если вывод идёт на терминал). %C(auto,<спецификация>) принимается как исторический синоним для значения по умолчанию (например, %C(auto,red)). Указание %C(always,<спецификация>) будет показывать цвета, даже если они иначе не включены (хотя рассмотрите возможность просто использовать --color=always для включения цвета для всего вывода, включая этот формат и всё остальное, что git может раскрашивать). auto сам по себе (т.е. %C(auto)) включит автоматическую раскраску для следующих заполнителей, пока цвет не будет переключён снова.

    %m

    отметка, является ли коммит достижимым слева (<), справа (>) или является ли он граничным (-)

    %w([<w>[,<i1>[,<i2>]]])

    переключить перенос строк, как параметр -w в git-shortlog[1].

    %<(<n>[,(trunc|ltrunc|mtrunc)])

    заставляет следующий заполнитель занимать как минимум N колонок, добавляя пробелы справа при необходимости. При желании можно обрезать (с многоточием ..) слева (ltrunc) ..ft, посередине (mtrunc) mi..le или справа (trunc) rig.., если вывод длиннее <n> колонок. Примечание 1: обрезание корректно работает только с <n> >= 2. Примечание 2: пробелы вокруг значений <n> и <m> (см. ниже) необязательны. Примечание 3: эмодзи и другие широкие символы будут занимать две колонки отображения, что может выходить за границы колонок. Примечание 4: разложенные диакритические знаки могут быть смещены на границах заполнения.

    %<|(<m> )

    заставляет следующий заполнитель занимать как минимум до <m>-й колонки отображения, добавляя пробелы справа при необходимости. Используйте отрицательные значения <m> для позиций колонок, измеряемых от правого края окна терминала.

    %>(<n>)
    %>|(<m>)

    аналогично %<(<n>) и %<|(<m>) соответственно, но добавляет пробелы слева

    %>>(<n>)
    %>>|(<m>)

    аналогично %>(<n>) и %>|(<m>) соответственно, за исключением того, что если следующая метка-заполнитель занимает больше места, чем задано, и слева от него есть пробелы, используются эти пробелы

    %><(<n>)
    %><|(<m>)

    аналогично %<(<n>) и %<|(<m>) соответственно, но добавляет пробелы с обеих сторон (т.е. текст центрируется)

  • Метки-заполнители, которые раскрываются в информацию, извлекаемую из коммита:

    %H

    хеш коммита

    %h

    сокращённый хеш коммита

    %T

    хеш объекта дерева каталогов

    %t

    сокращённый хеш объекта дерева каталогов

    %P

    хеши родителей

    %p

    сокращённые хеши родителей

    %an

    имя автора

    %aN

    имя автора (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %ae

    email автора

    %aE

    email автора (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %al

    локальная часть эл. почты автора (часть до знака @)

    %aL

    локальная часть автора (см. %al) с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %ad

    дата создания (формат соответствует параметру --date=)

    %aD

    дата создания в формате RFC2822

    %ar

    дата создания, относительная

    %at

    дата создания, время UNIX

    %ai

    дата создания в формате подобном ISO 8601

    %aI

    дата создания в формате ISO 8601 (строго)

    %as

    дата создания, короткий формат (ГГГГ-ММ-ДД)

    %ah

    дата создания, в человеческом виде (как при указании параметра --date=human git-rev-list[1])

    %cn

    имя коммитера

    %cN

    имя коммитера (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %ce

    email коммитера

    %cE

    email коммитера (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %cl

    локальная часть эл. почты коммиттера (часть до знака @)

    %cL

    локальная часть коммиттера (см. %cl) с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %cd

    дата коммита (формат соответствует параметру --date=)

    %cD

    дата коммита в формате RFC2822

    %cr

    дата коммита, относительная

    %ct

    дата коммита, время UNIX

    %ci

    дата коммита в формате подобном ISO 8601

    %cI

    дата коммита в формате ISO 8601 (строго)

    %cs

    дата коммита, короткий формат (ГГГГ-ММ-ДД)

    %ch

    дата коммита, в человеческом виде (как при указании параметра --date=human git-rev-list[1])

    %d

    имена ссылок, как параметр --decorate команды git-log[1]

    %D

    имена ссылок, без скобок «(» и «)».

    %(count)

    номер патча в серии патчей. Используется только в --commit-list-format в format-patch

    %(total)

    общее количество патчей в серии патчей. Используется только в --commit-list-format в format-patch

    %(decorate[:<параметр>,...])

    имена ссылок с настраиваемыми декораторами. За строкой decorate может следовать двоеточие и ноль или более параметров, разделённых запятыми. Значения параметров могут содержать литералы, представленные в виде кода форматирования. Они должны, в частности, использоваться для запятых (%x2C) и закрывающих круглых скобок (%x29) из-за того, что они имеют собственную роль в синтаксисе списка параметров.

    prefix=<значение>

    Показывается перед списком имён ссылок. По умолчанию: " (".

    suffix=<значение>

    Показывается после списка имён ссылок. По умолчанию: ")".

    separator=<значение>

    Показывается между именами ссылок. По умолчанию: ", ".

    pointer=<значение>

    Показывается между HEAD и веткой, на которую он указывает, если таковая есть. По умолчанию: " → ".

    tag=<значение>

    Показывается перед именами меток. По умолчанию: "tag: ".

    Например, для создания декоратора, не завёрнутого ни в какие скобки, без аннотации меток и с пробелами в качестве разделителей:

        %(decorate:prefix=,suffix=,tag=,separator= )
    %(describe[:<параметр>,...])

    имя, предназначенное для чтения человеком, как в git-describe[1]; пустая строка для коммитов, для которых невозможно создать описание. После describe может идти двоеточие и ноль или более параметров, разделённых запятыми. Описания могут быть непоследовательными, когда одновременно с этим добавляются или удаляются метки.

    tags[=<логическое-значение>]

    Вместо учёта только аннотированных меток, учитывать также легковесные метки.

    abbrev=<число>

    Вместо использования стандартного количества шестнадцатеричных цифр (которое варьируется в зависимости от количества объектов в репозитории, по умолчанию 7) для сокращённого имени объекта, использовать <число> цифр или столько цифр, сколько необходимо для формирования уникального имени объекта.

    match=<шаблон>

    Учитывать только метки, соответствующие заданному шаблону glob(7) <шаблон>, исключая префикс refs/tags/.

    exclude=<шаблон>

    Не учитывать метки, соответствующие заданному шаблону glob(7) <шаблон>, исключая префикс refs/tags/.

    %S

    имя ссылки, указанное в командной строке, по которой был достигнут коммит (как в git log --source), работает только с git log

    %e

    кодировка

    %s

    заголовок коммита

    %f

    очищенный заголовок коммита, подходящий для использования в качестве имени файла

    %b

    тело

    %B

    сырое тело (без дополнительных переносов строк в заголовке коммита и его теле)

    %GG

    сырое сообщение проверки GPG-подписи для подписанного коммита

    %G?

    выводит «G» для хорошей (действительной) подписи, «B» для плохой подписи, «U» для хорошей подписи, но действительность ключа которой невозможно проверить, «X» для хорошей подписи с истёкшим сроком действия, «Y» для хорошей подписи, сделанной ключом с истёкшим сроком действия, «R» для хорошей подписи, сделанной отозванным ключом, «E», если подпись не может быть проверена (например если отсутствует ключ), и «N», если подписи нет

    %GS

    выводит имя подписавшего для подписанного коммита

    %GK

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

    %GF

    выводит отпечаток ключа, использованного для подписи подписанного коммита

    %GP

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

    %GT

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

    %gD

    селектор журнала ссылок (reflog), например, refs/stash@{1} или refs/stash@{2 minutes ago}; формат такой же, как тот, что описан для параметра -g. Часть перед @ — это имя ссылки, как указано в командной строке (поэтому git log -g refs/heads/master выдаст refs/heads/master@{0}).

    %gd

    сокращённый селектор журнала ссылок; то же, что и %gD, но та часть, которая является именем ссылки, сокращена для удобства чтения (поэтому refs/heads/master становится просто master).

    %gn

    имя, записанное в журнале ссылок

    %gN

    имя, записанное в журнале ссылок (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %ge

    email, записанный в журнале ссылок

    %gE

    email, записанный в журнале ссылок (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])

    %gs

    заголовок записи журнала ссылок

    %(trailers[:<параметр>,...])

    выводит завершители тела коммита, которые интерпретируются git-interpret-trailers[1]. После строки trailers может идти двоеточие и ноль или более параметров, разделёнными запятыми. Если какой-либо параметр указан несколько раз, используется его последнее вхождение.

    key=<ключ>

    показывать только завершители с указанным <ключом>. Сопоставление выполняется без учёта регистра, и завершающее двоеточие необязательно. Если параметр указан несколько раз, показываются строки завершителей, соответствующие любому из ключей. Этот параметр автоматически включает опцию only, поэтому строки, не являющиеся завершителями, в блоке завершителей скрываются. Если это нежелательно, это можно отключить с помощью only=false. Например, %(trailers:key=Reviewed-by) показывает строки завершителей с ключом Reviewed-by.

    only[=<логическое-значение>]

    выбирает, должны ли включаться строки из блока завершителей, не являющиеся завершителями.

    separator=<разделитель>

    указывает разделитель, вставляемый между строками завершителей. По умолчанию используется символ перевода строки. Строка <разделитель> может содержать литеральные коды форматирования, описанные выше. Чтобы использовать запятую в качестве разделителя, необходимо использовать %x2C, так как иначе она будет проанализирована как следующая опция. Например, %(trailers:key=Ticket,separator=%x2C ) показывает все строки завершителей с ключом "Ticket", разделённые запятой и пробелом.

    unfold[=<логическое-значение>]

    заставляет вести себя так, как если бы была указана опция interpret-trailer --unfold. Например, %(trailers:only,unfold=true) разворачивает и показывает все строки завершителей.

    keyonly[=<логическое-значение>]

    показывать только ключевую часть завершителя.

    valueonly[=<логическое-значение>]

    показывать только часть значения завершителя.

    key_value_separator=<разделитель>

    указывает разделитель, вставляемый между ключом и значением каждого завершителя. По умолчанию ": ". В остальном он имеет ту же семантику, что и separator=<разделитель> выше.

    Note
    Некоторые заполнители могут зависеть от других опций, переданных механизму обхода ревизий. Например, опции reflog %g* будут вставлять пустую строку, если только мы не обходим записи reflog (например, с помощью git log -g). Заполнители %d и %D будут использовать "short" формат украшения, если --decorate не был предоставлен в командной строке.

    Логические опции принимают необязательное значение [=<логическое-значение>]. Принимаются все значения, которые принимает --type=bool в git-config[1], такие как yes и off. Указание логической опции без =<значения> эквивалентно указанию её с =true.

    Если вы добавите + (знак плюса) после % в заполнителе, символ перевода строки вставляется непосредственно перед подстановкой, если и только если заполнитель расширяется до непустой строки.

    Если вы добавите - (знак минуса) после % в заполнителе, все непосредственно предшествующие подстановке символы перевода строки удаляются, если и только если заполнитель расширяется до пустой строки.

    Если вы добавите (пробел) после % в заполнителе, пробел вставляется непосредственно перед подстановкой, если и только если заполнитель расширяется до непустой строки.

tformat:

Формат tformat: работает точно так же, как format:, за исключением того, что он предоставляет семантику "терминатора" вместо семантики "разделителя". Другими словами, к каждому коммиту добавляется символ терминатора сообщения (обычно новая строка), а не разделитель, помещаемый между записями. Это означает, что последняя запись однострочного формата будет правильно завершена новой строкой, как это делает формат "oneline". Например:

$ git log -2 --pretty=format:%h 4da45bef \
  | perl -pe '$_ .= " -- НЕТ СИМВОЛА ПЕРЕВОДА СТРОКИ\n" unless /\n/'
4da45be
7134973 -- НЕТ СИМВОЛА ПЕРЕВОДА СТРОКИ

$ git log -2 --pretty=tformat:%h 4da45bef \
  | perl -pe '$_ .= " -- НЕТ СИМВОЛА ПЕРЕВОДА СТРОКИ\n" unless /\n/'
4da45be
7134973

Кроме того, любая нераспознанная строка, содержащая %, интерпретируется так, как если бы перед ней было tformat:. Например, эти два эквивалентны:

$ git log -2 --pretty=tformat:%h 4da45bef
$ git log -2 --pretty=%h 4da45bef

ПРИМЕРЫ

  • Вывести список коммитов достижимых из текущей ветки.

    git rev-list HEAD
  • Вывести список коммитов в этой ветке, отсутствующих в вышестоящей ветке.

    git rev-list @{вышестоящая}..HEAD
  • Форматировать коммиты с их автором и сообщением коммита (см. также высокоуровневый программный интерфейс git-log[1]).

    git rev-list --format=medium HEAD
  • Форматировать коммиты вместе с их различиями (см. также высокоуровневый программный интерфейс git-log[1], который может сделать это в одном процессе).

    git rev-list HEAD |
    git diff-tree --stdin --format=medium -p
  • Вывести список коммитов в текущей ветке, которые затронули любой файл в каталоге Documentation.

    git rev-list HEAD -- Documentation/
  • Вывести список коммитов, автором которых являетесь вы за последний год, в любой ветке, метке или другой ссылке.

    git rev-list --author=you@example.com --since=1.year.ago --all
  • Вывести список объектов, достижимых из текущей ветки (т.е. всех коммитов и содержащихся в них blob-объектов и деревьев).

    git rev-list --objects HEAD
  • Сравнить размер на диске всех достижимых объектов с объектами, достижимыми из журналов ссылок, и с общим упакованным размером. Это может сказать вам, может ли выполнение git repack -ad уменьшить размер репозитория (за счёт удаления недостижимых объектов) и может ли помочь истечение срока действия журналов ссылок.

    # достижимые объекты
    git rev-list --disk-usage --objects --all
    # плюс журналы ссылок
    git rev-list --disk-usage --objects --all --reflog
    # общий используемый размер на диске
    du -c .git/objects/pack/*.pack .git/objects/??/*
    # альтернатива du: сложить поля "size" и "size-pack"
    git count-objects -v
  • Сообщить размер на диске каждой ветки, не включая объекты, используемые текущей веткой. Это может найти выбросы, которые способствуют раздуванию размера репозитория (например, потому что кто-то случайно закоммитил большие артефакты сборки).

    git for-each-ref --format='%(refname)' |
    while read branch
    do
    	size=$(git rev-list --disk-usage --objects HEAD..$branch)
    	echo "$size $branch"
    done |
    sort -n
  • Сравнить размер на диске веток в одной группе ссылок, исключая другую. Если вы смешиваете объекты из нескольких внешних репозиториев в одном репозитории, это может показать, какие внешние репозитории вносят вклад в размер репозитория (принимая размер origin за базовый уровень).

    git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin

GIT

Является частью пакета git[1]