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/. Если требуется завершающий/*, его нужно указать явно. -
Не включать ссылки, которые были бы скрыты параметрами
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 -
Подавить обычный вывод; вместо него вывести суммарное количество байтов, занимаемых на диске выбранными коммитами или объектами. Это эквивалентно передаче вывода в конвейер команде
gitcat-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-onlyA...Bисключает изBкоммиты, которые входят вAили эквивалентны по исправлению коммиту изA. Иными словами, она выводит коммиты+изgitcherryAB. Точнее говоря, точный список формирует команда--cherry-pick--right-only--no-merges. -
--cherry -
Синоним для
--right-only--cherry-mark--no-merges; полезен для ограничения вывода коммитами с нашей стороны и пометки символомgitlog--cherryupstream...mybranchтех из них, которые были применены на другой стороне разветвлённой истории. Это похоже наgitcherryupstreammybranch. -
-g -
--walk-reflogs -
Вместо обхода цепочки предков коммитов обходить записи reflog от самой новой к более старым. При использовании этого параметра нельзя указывать исключаемые коммиты (то есть нельзя использовать обозначения
^<commit>, <commit1>..<commit2> и <commit1>...<commit2>).Если формат
--prettyотличается отonelineиreference(по очевидным причинам), в вывод добавляются две строки сведений из reflog. Обозначение reflog в выводе может иметь видref@{<Nth>}(где<Nth>— индекс записи в reflog в обратном хронологическом порядке) илиref@{<timestamp>}(с<timestamp>этой записи) в зависимости от нескольких правил:-
Если начальная точка задана как
ref@{<Nth>}, показывать индекс. -
Если начальная точка задана как
ref@{now}, показывать временную метку. -
Если не использовано ни то ни другое, но в командной строке указан
--date, показывать временную метку в формате, заданном параметром--date. -
В противном случае показывать индекс.
В режиме
--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 -
Выбираются коммиты, на которые ссылается какая-либо ветка или тег.
Обратите внимание, что для получения содержательной истории могут отображаться дополнительные коммиты.
Следующие параметры влияют на способ упрощения:
-
Defaultmode -
Упрощает историю до простейшей истории, объясняющей конечное состояние дерева. Она простейшая, поскольку некоторые боковые ветви отсекаются, если конечный результат одинаков (то есть при слиянии ветвей с одинаковым содержимым).
-
--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объединяет строки вquuxxyzzy.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. -
В списке родителей коммита
QYбыл упрощён до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=HD..Mдаст следующий результат:E \ C---G---H---I---J \ L--MВ то время как
--ancestry-path=KD..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---где числа обозначают порядок временных меток коммитов,
gitrev-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 -
Выводить идентификаторы объектов всех объектов, на которые ссылаются перечисленные коммиты. Таким образом,
--objectsfoo^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», за которым следуют год из четырёх цифр и сведения о часовом поясе, если не используется местный часовой пояс. Например:ThuJan100:00:001970+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, например с помощьюgitlog--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 -
имя ссылки, указанное в командной строке, по которой был достигнут коммит (например,
gitlog--source); работает только сgitlog -
%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@{2minutesago}; формат соответствует правилам, описанным для параметра-g. Часть перед@— это имя ссылки, указанное в командной строке (поэтомуgitlog-grefs/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 (например, с помощьюgitlog-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, и общим размером упакованных объектов. Это поможет определить, может ли запуск
gitrepack-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