Spec-Zone.ru › Git

git-rev-list

Имя

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

Синтаксис

git rev-list [<options>] <commit>…​ [--] [<path>…​]

Описание

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

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

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

$ git rev-list foo bar ^baz

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

Специальную запись «<commit1>..<commit2>» можно использовать как сокращение для «^<commit1> <commit2>». Например, можно использовать любой из следующих вариантов:

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

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

$ 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=<date1> оставляет только коммиты новее <date1>, а его сочетание с --grep=<pattern> дополнительно оставляет только коммиты, в сообщении журнала которых есть строка, соответствующая <pattern>), если не указано иное.

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

-<number>
-n <number>
--max-count=<number>

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

--max-count-oldest=<number>

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

--skip=<number>

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

--since=<date>
--after=<date>

Показать коммиты, созданные позднее <date>. В особом случае today означает последние полночь.

--since-as-filter=<date>

Показать все коммиты, созданные позднее <date>. Будут просмотрены все коммиты в диапазоне, вместо того чтобы остановиться на первом коммите, созданном раньше <date>.

--until=<date>
--before=<date>

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

--max-age=<timestamp>
--min-age=<timestamp>

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

--author=<pattern>
--committer=<pattern>

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

--grep-reflog=<pattern>

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

--grep=<pattern>

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

--all-match

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

--invert-grep

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

-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=<number>
--max-parents=<number>
--no-min-parents
--no-max-parents

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

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

--first-parent

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

--exclude-first-parent-only

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

--maximal-only

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

--not

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

--all

Считать, что все ссылки в refs/, а также HEAD, указаны в командной строке как <commit>.

--branches[=<pattern>]

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

--tags[=<pattern>]

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

--remotes[=<pattern>]

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

--glob=<glob-pattern>

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

--exclude=<glob-pattern>

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

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

--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

Считать, что все объекты, упомянутые в reflog, указаны в командной строке как <commit>.

--alternate-refs

Считать, что все объекты, упомянутые в качестве вершин ссылок альтернативных репозиториев, указаны в командной строке. Альтернативным является любой репозиторий, каталог объектов которого указан в 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 Kib, 3.50 Mib).

--cherry-mark

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

--cherry-pick

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

Например, если есть две ветки, A и B, обычно для вывода коммитов, находящихся только в одной из них, используют --left-right (см. пример ниже в описании параметра --left-right). Однако команда покажет коммиты, перенесённые из другой ветки с помощью cherry-pick (например, «третий коммит в b» мог быть перенесён из ветки A). Этот параметр исключает такие пары коммитов из вывода.

--left-only
--right-only

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

Например, команда --cherry-pick --right-only A...B исключает из B коммиты, которые входят в A или эквивалентны по исправлению коммиту из 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 от самой новой к более старым. При использовании этого параметра нельзя указывать исключаемые коммиты (то есть нельзя использовать обозначения ^<commit>, <commit1>..<commit2> и <commit1>...<commit2>).

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

  1. Если начальная точка задана как ref@{<Nth>}, показывать индекс.

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

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

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

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

В режиме --pretty=reference это сведение не выводится.

--merge

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

--boundary

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

--use-bitmap-index

Попытаться ускорить обход с помощью битовой карты индекса pack (если она доступна). Обратите внимание: при обходе с параметром --objects связанные с деревьями и блобами пути не выводятся.

--progress=<header>

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

-z

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

<OID> NUL [<token>=<value> NUL]...

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

<OID> NUL
<OID> NUL path=<path> NUL
<OID> NUL boundary=yes NUL
<OID> NUL missing=yes NUL [<token>=<value> NUL]...

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

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

Иногда вас интересуют только отдельные части истории, например коммиты, изменяющие определённый <path>. Но у History Simplification есть две составляющие: одна — выбор коммитов, другая — способ его выполнения, поскольку существуют различные стратегии упрощения истории.

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

<paths>

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

--simplify-by-decoration

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

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

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

Default mode

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

--show-pulls

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

--full-history

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

--dense

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

--sparse

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

--simplify-merges

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

--ancestry-path[=<commit>]

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

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

Предположим, что в качестве <paths> вы указали foo. Будем называть коммиты, изменяющие foo, !TREESAME, а остальные — TREESAME. (В разностном выводе, отфильтрованном по 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).

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

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

Сравните с режимом --full-history без переписывания, рассмотренным выше. Обратите внимание: E был отсечён, поскольку он TREESAME, но список родителей P был переписан так, чтобы включить родителя E — I. То же самое произошло с 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[=<commit>]

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

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

            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 можно также использовать --ancestry-path=D: при применении к диапазону 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, показанный выше, скорее всего, не является тем коммитом слияния, который использовался для слияния в важную ветку. Вместо него для слияния R и X в важную ветку использовался коммит N. В сообщении этого коммита может содержаться объяснение, почему изменение X в итоге переопределило изменения из A и B.

--show-pulls

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

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

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

Здесь включены коммиты слияния R и N, поскольку они соответственно подтянули коммиты X и R в основную ветку. Именно из-за этих слияний коммиты A и B не отображаются в истории по умолчанию.

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

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

Обратите внимание: поскольку M достижим из R, связь от N к M была упрощена и удалена. Однако N по-прежнему отображается в истории как важный коммит, поскольку он «подтянул» изменение 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

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

--bisect-vars

Вычисляет то же, что и --bisect, за исключением того, что ссылки в refs/bisect/ не используются, а также выводится текст, готовый для вычисления оболочкой. Эти строки присвоят имя ревизии средней точки переменной bisect_rev, ожидаемое количество коммитов для проверки после проверки bisect_rev — переменной bisect_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

Выводить выбранные для отображения коммиты (см. раздел Commit Limiting выше) в обратном порядке. Нельзя использовать вместе с --walk-reflogs.

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

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

--objects

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

--in-commit-order

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

--objects-edge

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

--objects-edge-aggressive

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

--indexed-objects

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

--unpacked

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

--object-names

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

--no-object-names

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

--filter=<filter-spec>

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

Форма --filter=blob:none исключает все блобы.

Форма --filter=blob:limit=<n>[kmg] исключает блобы размером не менее <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> использует спецификацию разреженного извлечения, содержащуюся в блобе (или выражении блоба) <blob-ish>, чтобы исключить блобы, которые не потребовались бы для разреженного извлечения указанных ссылок.

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

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

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

Форму --filter=combine:<filter1>+<filter2>+...<filterN> также можно использовать для объединения нескольких фильтров, но это сложнее, чем просто повторять флаг --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-action>

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

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

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

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

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

Форма --missing=print-info аналогична print, но также выводит дополнительные сведения об отсутствующем объекте, полученные из содержащего его объекта. Все сведения выводятся в одной строке с идентификатором отсутствующего объекта в формате: ?<oid> [<token>=<value>].... Пары <token>=<value>, содержащие дополнительные сведения, разделяются символом SP. Значение кодируется способом, зависящим от токена, но символы SP или LF, содержащиеся в значении, всегда должны быть представлены так, чтобы в результате кодирования не возникало ни одного из этих двух проблемных байтов. Каждая пара <token>=<value> может иметь один из следующих видов:

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

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

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

--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>]
--format=<format>

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

Дополнительные сведения о каждом формате см. в разделе «ФОРМАТЫ ВЫВОДА». Если часть =<format> опущена, по умолчанию используется medium.

Примечание
формат вывода по умолчанию можно задать в конфигурации репозитория (см. 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>

В объектах коммитов в заголовке 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=<format>

Влияет только на даты, отображаемые в удобочитаемом формате, например при использовании --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 отображает только дату, без времени, в формате YYYY-MM-DD.

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

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

--date=unix отображает дату как метку времени Unix epoch (число секунд с 1970 года). Как и в случае с --raw, значение всегда задаётся по UTC, поэтому -local не влияет на результат.

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

--date=default — формат по умолчанию, основанный на выводе ctime(3). Он отображает одну строку: трёхбуквенное сокращение дня недели, трёхбуквенное сокращение месяца, день месяца, время в формате «HH:MM:SS», за которым следуют год из четырёх цифр и сведения о часовом поясе, если не используется местный часовой пояс. Например: Thu Jan 1 00:00:00 1970 +0000.

--header

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

--no-commit-header

Не выводить строку заголовка с надписью «commit» и идентификатором объекта, которая предшествует указанному формату. Не влияет на встроенные форматы; учитывается только для пользовательских форматов.

--commit-header

Переопределяет ранее заданный --no-commit-header.

--parents

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

--children

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

--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... 3rd on b
        >bbbbbbb... 2nd on b
        <aaaaaaa... 3rd on a
        <aaaaaaa... 2nd on a
        -yyyyyyy... 1st on b
        -xxxxxxx... 1st on a
--graph

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

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

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

--show-linear-break[=<barrier>]

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

--graph-lane-limit=<n>

При использовании --graph ограничить количество отображаемых дорожек графа. Дорожки сверх лимита заменяются маркером усечения ~. По умолчанию значение равно 0 (без ограничений); нулевые и отрицательные значения игнорируются и трактуются как отсутствие ограничений.

--count

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

Форматы вывода

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

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

oneline
<hash> <title-line>

Этот формат разработан как можно более компактным.

short
commit <hash>
Author: <author>
_
    <title-line>_
medium
commit <hash>
Author: <author>
Date:   <author-date>
_
    <title-line>

    <full-commit-message>_
full
commit <hash>
Author: <author>
Commit: <committer>
_
    <title-line>

    <full-commit-message>_
fuller
commit <hash>
Author:     <author>
AuthorDate: <author-date>
Commit:     <committer>
CommitDate: <committer-date>
_
     <title-line>

     <full-commit-message>_
reference
<abbrev-hash> (<title-line>, <short-author-date>)

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

email
From <hash> <date>
From: <author>
Date: <author-date>
Subject: [PATCH] <title-line>
_
<full-commit-message>_
mboxrd

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

raw

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

format:<format-string>

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

Например, format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" выведет примерно следующее:

The author of fe6e0ee was Junio C Hamano, 23 hours ago
The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

Подстановки:

  • Подстановки, раскрывающиеся в один литеральный символ:

    %n

    символ новой строки

    %%

    необработанный символ %

    %x00

    За %x следуют две шестнадцатеричные цифры; эта последовательность заменяется байтом со значением, заданным этими цифрами (далее в этом документе мы будем называть её «кодом литерального форматирования»).

  • Подстановки, влияющие на форматирование последующих подстановок:

    %Cred

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

    %Cgreen

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

    %Cblue

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

    %Creset

    сбросить цвет

    %C(<spec>)

    описание цвета, приведённое в разделе «CONFIGURATION FILE» документации git-config[1]. По умолчанию цвета отображаются, только если они включены для вывода журнала (параметрами color.diff, color.ui или --color, с учётом настройки auto последнего параметра, если вывод направляется в терминал). %C(auto,<spec>) принимается как устаревший синоним значения по умолчанию (например, %C(auto,red)). Указание %C(always,<spec>) включает цвета, даже если в остальных случаях они отключены (однако для включения цветов во всём выводе, включая этот формат и любые другие элементы, которые Git может раскрашивать, лучше использовать --color=always). Самостоятельный параметр auto (то есть %C(auto)) включает автоматическое окрашивание следующих подстановок до очередного переключения цвета.

    %m

    маркер левой (<), правой (>) стороны или границы (-)

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

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

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

    задать для следующей подстановки ширину не менее N столбцов, при необходимости добавив справа пробелы. Если вывод длиннее <n> столбцов, можно обрезать его (с многоточием ..) слева (ltrunc) ..ft, посередине (mtrunc) mi..le или в конце (trunc) rig... Примечание 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

    адрес электронной почты автора

    %aE

    адрес электронной почты автора (с учётом .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

    дата автора в кратком формате (YYYY-MM-DD)

    %ah

    дата автора в удобочитаемом формате (как параметр --date=human команды git-rev-list[1])

    %cn

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

    %cN

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

    %ce

    адрес электронной почты коммитера

    %cE

    адрес электронной почты коммитера (с учётом .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

    дата коммитера в кратком формате (YYYY-MM-DD)

    %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[:<option>,...])

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

    prefix=<value>

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

    suffix=<value>

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

    separator=<value>

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

    pointer=<value>

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

    tag=<value>

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

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

        %(decorate:prefix=,suffix=,tag=,separator= )
    %(describe[:<option>,...])

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

    tags[=<bool-value>]

    Учитывать не только аннотированные теги, но и облегчённые теги.

    abbrev=<number>

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

    match=<pattern>

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

    exclude=<pattern>

    Не учитывать теги, соответствующие заданному glob(7) <pattern>, без префикса 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

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

    %gn

    имя пользователя reflog

    %gN

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

    %ge

    адрес электронной почты пользователя reflog

    %gE

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

    %gs

    тема записи reflog

    %(trailers[:<option>,...])

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

    key=<key>

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

    only[=<bool>]

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

    separator=<sep>

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

    unfold[=<bool>]

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

    keyonly[=<bool>]

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

    valueonly[=<bool>]

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

    key_value_separator=<sep>

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

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

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

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

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

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

tformat:

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

$ git log -2 --pretty=format:%h 4da45bef \
  | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
4da45be
7134973 -- NO NEWLINE

$ git log -2 --pretty=tformat:%h 4da45bef \
  | perl -pe '$_ .= " -- NO NEWLINE\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 @{upstream}..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
  • Вывести список объектов, достижимых из текущей ветки (то есть все коммиты, а также содержащиеся в них блобы и деревья).

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

    # reachable objects
    git rev-list --disk-usage --objects --all
    # plus reflogs
    git rev-list --disk-usage --objects --all --reflog
    # total disk size used
    du -c .git/objects/pack/*.pack .git/objects/??/*
    # alternative to du: add up "size" and "size-pack" fields
    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

rev-list

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-rev-list

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API