Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.54.0
2026-04-20
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.51.2 no changes
-
2.51.1
2025-10-15
-
2.51.0
2025-08-18
- 2.50.1 no changes
-
2.50.0
2025-06-16
- 2.49.1 no changes
-
2.49.0
2025-03-14
- 2.48.1 → 2.48.2 no changes
-
2.48.0
2025-01-10
- 2.45.1 → 2.47.3 no changes
-
2.45.0
2024-04-29
- 2.43.3 → 2.44.4 no changes
-
2.43.2
2024-02-13
- 2.43.1 no changes
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 no changes
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 no changes
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 no changes
-
2.40.0
2023-03-12
- 2.39.1 → 2.39.5 no changes
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 no changes
-
2.38.0
2022-10-02
- 2.37.1 → 2.37.7 no changes
-
2.37.0
2022-06-27
- 2.36.1 → 2.36.6 no changes
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 no changes
-
2.35.0
2022-01-24
- 2.33.3 → 2.34.8 no changes
-
2.33.2
2022-03-23
-
2.33.1
2021-10-12
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 no changes
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 no changes
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 no changes
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.28.1 no changes
-
2.28.0
2020-07-27
- 2.27.1 no changes
-
2.27.0
2020-06-01
- 2.26.1 → 2.26.3 no changes
-
2.26.0
2020-03-22
- 2.25.1 → 2.25.5 no changes
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 no changes
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 no changes
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 no changes
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.19.3 → 2.19.6 no changes
-
2.19.2
2018-11-21
- 2.17.1 → 2.19.1 no changes
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
ОПИСАНИЕ
Перечислить коммиты, достижимые при следовании по ссылкам parent (родитель) от указанного(ых) коммита(ов), но исключить коммиты, достижимые из того(ых), перед которыми указан ^. По умолчанию вывод выполняется в обратном хронологическом порядке.
Это можно представить как операцию над множествами. Коммиты, достижимые из любого из коммитов, указанных в командной строке, образуют множество, а затем коммиты, достижимые из любого из тех, перед которыми стоит ^, вычитаются из этого множества. Оставшиеся коммиты выводятся в результате работы команды. Различные другие параметры и параметры путей могут использоваться для дальнейшего ограничения результата.
Таким образом, следующая команда:
$ git rev-list foo bar ^baz
означает «перечислить все коммиты, достижимые из foo или bar, но не из baz».
Специальное обозначение "<коммит1>..<коммит2>" можно использовать как сокращение для "^<коммит1> <коммит2>". Например, любое из следующих может использоваться взаимозаменяемо:
$ git rev-list origin..HEAD $ git rev-list HEAD ^origin
Ещё одно специальное обозначение — "<коммит1>...<коммит2>", которое полезно для слияний. Результирующее множество коммитов представляет собой симметрическую разность двух операндов. Следующие две команды эквивалентны:
$ git rev-list A B --not $(git merge-base --all A B) $ git rev-list A...B
rev-list — это важная команда Git, поскольку она предоставляет возможность строить и обходить графы родословной коммитов. По этой причине она имеет много различных параметров, которые позволяют использовать её таким разным командам, как git bisect и git repack.
ПАРАМЕТРЫ
Ограничение коммитов
Помимо указания диапазона коммитов, который должен быть выведен с использованием специальных обозначений, описанных в описании, может быть применено дополнительное ограничение коммитов.
Использование большего количества параметров обычно дополнительно ограничивает вывод (например, --since=<дата1> ограничивает коммитами новее <дата1>, а использование его с --grep=<шаблон> дополнительно ограничивает коммитами, сообщение журнала которых содержит строку, соответствующую <шаблон>), если не указано иное.
Обратите внимание, что они применяются перед параметрами упорядочивания и форматирования коммитов, такими как --reverse.
-
-<число> -
-n<число> -
--max-count=<число> -
Ограничить вывод <числом> коммитов.
-
--skip=<число> -
Пропустить <число> коммитов перед началом показа вывода коммитов.
-
--since=<дата> -
--after=<дата> -
Показать коммиты новее <дата>.
-
--since-as-filter=<дата> -
Показать все коммиты новее <дата>. Это посещает все коммиты в диапазоне, а не останавливается на первом коммите, который старше <дата>.
-
--until=<дата> -
--before=<дата> -
Показать коммиты старше <дата>.
-
--max-age=<метка-времени> -
--min-age=<метка-времени> -
Ограничить вывод коммитов указанным временным диапазоном.
-
--author=<шаблон> -
--committer=<шаблон> -
Ограничить вывод коммитов теми, у которых строки заголовка автора/коммиттера соответствуют регулярному выражению <шаблон>. При наличии более одного
--author=<шаблон> выбираются коммиты, чей автор соответствует любому из <шаблон> (аналогично для нескольких--committer=<шаблон>). -
--grep-reflog=<шаблон> -
Ограничить вывод коммитов теми, у которых записи журнала ссылок (reflog) соответствуют регулярному выражению <шаблон>. При наличии более одного
--grep-reflogвыбираются коммиты, чьё сообщение в журнале ссылок соответствует любому из заданных шаблонов. Использование этого параметра является ошибкой, если не используется--walk-reflogs. -
--grep=<шаблон> -
Ограничить вывод коммитов теми, у которых сообщение журнала соответствует регулярному выражению <шаблон>. При наличии более одного
--grep=<шаблон> выбираются коммиты, чьё сообщение соответствует любому из <шаблон> (но см.--all-match). -
--all-match -
Ограничить вывод коммитов теми, которые соответствуют всем заданным
--grep, а не тем, которые соответствуют хотя бы одному. -
--invert-grep -
Ограничить вывод коммитов теми, у которых сообщение журнала не соответствует <шаблон>, указанному с помощью
--grep=<шаблон>. -
-i -
--regexp-ignore-case -
Сопоставлять шаблоны ограничения регулярных выражений без учёта регистра букв.
-
--basic-regexp -
Считать шаблоны ограничения базовыми регулярными выражениями; это значение по умолчанию.
-
-E -
--extended-regexp -
Считать шаблоны ограничения расширенными регулярными выражениями вместо базовых регулярных выражений по умолчанию.
-
-F -
--fixed-strings -
Считать шаблоны ограничения фиксированными строками (не интерпретировать шаблон как регулярное выражение).
-
-P -
--perl-regexp -
Считать шаблоны ограничения Perl-совместимыми регулярными выражениями.
Поддержка этих типов регулярных выражений является необязательной зависимостью на этапе компиляции. Если Git был скомпилирован без поддержки, передача этой опции приведёт к его аварийному завершению.
-
--remove-empty -
Остановиться, когда заданный путь исчезает из дерева.
-
--merges -
Печатать только коммиты слияния. Это точно то же самое, что и
--min-parents=2. -
--no-merges -
Не печатать коммиты с более чем одним родителем. Это точно то же самое, что и
--max-parents=1. -
--min-parents=<число> -
--max-parents=<число> -
--no-min-parents -
--no-max-parents -
Показывать только коммиты, которые имеют по крайней мере (или не более) указанное количество родительских коммитов. В частности,
--max-parents=1— то же самое, что--no-merges,--min-parents=2— то же самое, что--merges.--max-parents=0даёт все корневые коммиты, а--min-parents=3— все слияния octopus.--no-min-parentsи--no-max-parentsсбрасывают эти ограничения (снимают ограничения). Эквивалентными формами являются--min-parents=0(любой коммит имеет 0 или более родителей) и--max-parents=-1(отрицательные числа означают отсутствие верхнего предела). -
--first-parent -
При поиске коммитов для включения следовать только первому родительскому коммиту при обнаружении коммита слияния. Этот параметр может дать лучший обзор при просмотре эволюции конкретной тематической ветки, поскольку слияния в тематическую ветку, как правило, касаются только периодической подстройки под обновлённый вышестоящий (upstream) репозиторий, и этот параметр позволяет вам игнорировать отдельные коммиты, внесённые в вашу историю таким слиянием.
-
--exclude-first-parent-only -
При поиске коммитов для исключения (с ^) следовать только первому родительскому коммиту при обнаружении коммита слияния. Это можно использовать для поиска набора изменений в тематической ветке с точки, где она отделилась от внешней ветки, учитывая, что произвольные слияния могут быть допустимыми изменениями в тематической ветке.
-
--maximal-only -
Ограничить вывод коммитов теми, которые не достижимы из любых других коммитов в диапазоне редакций.
-
--not -
Инвертирует значение префикса ^ (или его отсутствие) для всех последующих спецификаторов редакций вплоть до следующего
--not. При использовании в командной строке перед --stdin редакции, переданные через stdin, не будут им затронуты. И наоборот, при передаче через стандартный ввод, редакции, переданные в командной строке, не будут им затронуты. -
--all -
Предполагать, как если бы все ссылки в
refs/, вместе сHEAD, были перечислены в командной строке как <коммит>. -
--branches[=<шаблон>] -
Предполагать, как если бы все ссылки в
refs/headsбыли перечислены в командной строке как <коммит>. Если задан <шаблон>, ограничить ветки теми, которые соответствуют заданному glob-шаблону оболочки. Если в <шаблоне> отсутствуют ?, * или [, подразумевается /* в конце. -
--tags[=<шаблон>] -
Предполагать, как если бы все ссылки в
refs/tagsбыли перечислены в командной строке как <коммит>. Если задан <шаблон>, ограничить метки теми, которые соответствуют заданному glob-шаблону оболочки. Если в шаблоне отсутствуют ?, * или [, подразумевается /* в конце. -
--remotes[=<шаблон>] -
Предполагать, как если бы все ссылки в
refs/remotesбыли перечислены в командной строке как <коммит>. Если задан <шаблон>, ограничить отслеживаемые внешние ветки теми, которые соответствуют заданному glob-шаблону оболочки. Если в шаблоне отсутствуют ?, * или [, подразумевается /* в конце. -
--glob=<шаблон-glob> -
Предполагать, как если бы все ссылки, соответствующие glob-шаблону оболочки <glob-шаблон>, были перечислены в командной строке как <коммит>. Ведущий refs/ автоматически добавляется, если отсутствует. Если в шаблоне отсутствуют ?, * или [, подразумевается /* в конце.
-
--exclude=<шаблон-glob> -
Не включать ссылки, соответствующие <glob-шаблон>, которые в противном случае были бы учтены следующим
--all,--branches,--tags,--remotesили--glob. Повторения этого параметра накапливают шаблоны исключения до следующего параметра--all,--branches,--tags,--remotesили--glob(другие параметры или аргументы не очищают накопленные шаблоны).Заданные шаблоны не должны начинаться с
refs/heads,refs/tagsилиrefs/remotesпри применении к--branches,--tagsили--remotesсоответственно, и они должны начинаться сrefs/при применении к--globили--all. Если подразумевается завершающий /*, он должен быть указан явно. -
Не включать ссылки, которые были бы скрыты
git-fetch,git-receive-packилиgit-upload-packпутём обращения к соответствующей конфигурацииfetch.hideRefs,receive.hideRefsилиuploadpack.hideRefsвместе сtransfer.hideRefs(см. git-config[1]). Этот параметр влияет на следующий параметр псевдоссылки--allили--globи очищается после их обработки. -
--reflog -
Предполагать, как если бы все объекты, упомянутые в журналах ссылок (reflogs), были перечислены в командной строке как <коммит>.
-
--alternate-refs -
Предполагать, как если бы все объекты, упомянутые как верхушки (tips) ссылок дополнительных репозиториев, были перечислены в командной строке. Дополнительный репозиторий — это любой репозиторий, чей каталог объектов указан в
objects/info/alternates. Набор включаемых объектов может быть изменён с помощьюcore.alternateRefsCommandи т.д. См. git-config[1]. -
--single-worktree -
По умолчанию следующие параметры будут проверять все рабочие каталоги, когда их больше одного (см. git-worktree[1]):
--all,--reflogи--indexed-objects. Этот параметр заставляет их проверять только текущий рабочий каталог. -
--ignore-missing -
При обнаружении недопустимого имени объекта во вводе предполагать, как если бы неправильный ввод не был дан.
-
--stdin -
В дополнение к получению аргументов из командной строки, также читать их из стандартного ввода. Это принимает коммиты и псевдопараметры, такие как
--allи--glob=. Когда встречается разделитель--, следующий ввод обрабатывается как пути и используется для ограничения результата. Флаги, такие как--not, которые читаются через стандартный ввод, учитываются только для аргументов, переданных таким же образом, и не будут влиять на последующие аргументы командной строки. -
--quiet -
Не печатать ничего в стандартный вывод. Эта форма в первую очередь предназначена для того, чтобы вызывающая сторона могла проверить код завершения, чтобы увидеть, полностью ли связан диапазон объектов (или нет). Это быстрее, чем перенаправление stdout в
/dev/null, поскольку вывод не нужно форматировать. -
--disk-usage -
--disk-usage=human -
Подавить обычный вывод; вместо этого вывести сумму байтов, используемых для хранения на диске выбранными коммитами или объектами. Это эквивалентно передаче вывода в
gitcat-file--batch-check='%(objectsize:disk), за исключением того, что это работает намного быстрее (особенно с--use-bitmap-index). Ограничения того, что означает «хранение на диске», см. в разделеCAVEATSв git-cat-file[1]. С необязательным значениемhumanразмер хранения на диске отображается в удобочитаемой строке (например, 12.24 КиБ, 3.50 МиБ). -
--cherry-mark -
Как
--cherry-pick(см. ниже), но помечает эквивалентные коммиты символом=, а не опускает их, а неэквивалентные — символом+. -
--cherry-pick -
Опускать любой коммит, который вносит то же изменение, что и другой коммит на «другой стороне», когда набор коммитов ограничен симметрической разностью.
Например, если у вас есть две ветки,
AиB, обычный способ перечислить все коммиты только на одной из них — использовать--left-right(см. пример ниже в описании параметра--left-right). Однако он показывает коммиты, которые были скопированы (cherry-picked) из другой ветки (например, «3rd on b» мог быть скопирован из ветки A). С этим параметром такие пары коммитов исключаются из вывода. -
--left-only -
--right-only -
Перечислять только коммиты на соответствующей стороне симметрической разности, т.е. только те, которые были бы помечены < или > параметром
--left-right.Например,
--cherry-pick--right-onlyA...Bопускает те коммиты изB, которые находятся вAили являются эквивалентными по изменению (patch-equivalent) коммиту вA. Другими словами, это перечисляет коммиты+изgitcherryAB. Более точно,--cherry-pick--right-only--no-mergesдаёт точный список. -
--cherry -
Синоним для
--right-only--cherry-mark--no-merges; полезен для ограничения вывода коммитами на нашей стороне и пометки тех, которые были применены к другой стороне разветвлённой истории, с помощьюgitlog--cherryupstream...mybranch, аналогичноgitcherryupstreammybranch. -
-g -
--walk-reflogs -
Вместо обхода цепочки предков коммитов обходить записи журнала ссылок (reflog) от самых последних к более старым. При использовании этого параметра вы не можете указывать коммиты для исключения (то есть обозначения
^<коммит>, <коммит1>..<коммит2> и <коммит1>...<коммит2> не могут использоваться).С форматом
--pretty, отличным отonelineиreference(по понятным причинам), это приводит к появлению в выводе двух дополнительных строк информации, взятой из журнала ссылок (reflog). Обозначение журнала ссылок в выводе может отображаться какref@{<N-й>}(где <N-й> — это обратный хронологический индекс в журнале ссылок) или какref@{<временная-метка>}(с <временной-меткой> для этой записи), в зависимости от нескольких правил:-
Если начальная точка указана как
ref@{<N-й>}, показывать формат индекса. -
Если начальная точка была указана как
ref@{now}, показывать формат временной метки. -
Если не использовалось ни то, ни другое, но
--dateбыл указан в командной строке, показывать временную метку в формате, запрошенном--date. -
В противном случае показывать формат индекса.
В режиме
--pretty=onelineсообщение коммита имеет префикс с этой информацией в той же строке. Этот параметр нельзя комбинировать с--reverse. См. также git-reflog[1].В режиме
--pretty=referenceэта информация вообще не будет отображаться. -
-
--merge -
Показывать коммиты, затрагивающие конфликтующие пути, в диапазоне
HEAD...<другое>, где <другое> — это первая существующая псевдоссылка вMERGE_HEAD,CHERRY_PICK_HEAD,REVERT_HEADилиREBASE_HEAD. Работает только тогда, когда в индексе есть неслитые (unmerged) записи. Этот параметр можно использовать для показа соответствующих коммитов при разрешении конфликтов из трёхстороннего слияния. -
--boundary -
Выводить исключённые граничные коммиты. Граничные коммиты имеют префикс
-. -
--use-bitmap-index -
Попытаться ускорить обход, используя индекс битовой карты пакета (pack bitmap index) (если он доступен). Обратите внимание, что при обходе с
--objectsпути, связанные с деревьями и blob-объектами, не будут выводиться. -
--progress=<заголовок> -
Показывать отчёты о ходе выполнения в stderr по мере обработки объектов. Текст <заголовок> будет выводиться с каждым обновлением хода выполнения.
-
-z -
Вместо разделения переводами строк, каждый выводимый объект и сопровождающие его метаданные разделяются с использованием байтов NUL. Вывод печатается в следующей форме:
<OID> NUL [<лексема>=<значение> NUL]...
Дополнительные метаданные объекта, такие как пути объектов или граничные объекты, выводятся с использованием формы <лексема>
=<значение>. Значения лексем выводятся как есть без какого-либо кодирования/усечения. Запись OID никогда не содержит символ = и поэтому используется для сигнализации о начале новой записи объекта. Примеры:<OID> NUL <OID> NUL path=<путь> NUL <OID> NUL boundary=yes NUL <OID> NUL missing=yes NUL [<лексема>=<значение> NUL]...
Этот режим совместим только с параметрами вывода
--objects,--boundaryи--missing.
Упрощение истории
Иногда вас интересуют только части истории, например, коммиты, изменяющие конкретный <путь>. Но в «Упрощении истории» есть две части: одна — выбор коммитов, а другая — как это сделать, поскольку существует множество стратегий упрощения истории.
Следующие параметры выбирают коммиты для отображения:
Обратите внимание, что для получения осмысленной истории могут отображаться дополнительные коммиты.
Следующие параметры влияют на способ выполнения упрощения:
- Режим по умолчанию
-
Упрощает историю до простейшей истории, объясняющей конечное состояние дерева. Простейшей, потому что она отсекает некоторые побочные ветки, если конечный результат одинаков (т.е. слияние веток с одинаковым содержимым)
-
--show-pulls -
Включает все коммиты из режима по умолчанию, а также любые коммиты слияния, которые не являются TREESAME для первого родителя, но являются TREESAME для последующего родителя. Этот режим полезен для отображения коммитов слияния, которые «первыми внесли» изменение в ветку.
-
--full-history -
То же, что и режим по умолчанию, но не отсекает некоторую историю.
-
--dense -
Показываются только выбранные коммиты плюс некоторые для осмысленности истории.
-
--sparse -
Показываются все коммиты в упрощённой истории.
-
--simplify-merges -
Дополнительный параметр к
--full-historyдля удаления некоторых ненужных слияний из результирующей истории, поскольку нет выбранных коммитов, вносящих вклад в это слияние. -
--ancestry-path[=<коммит>] -
При задании диапазона коммитов для отображения (например, <коммит1>
..<коммит2> или <коммит2>^<коммит1>) и коммита <коммит> в этом диапазоне, отображать только те коммиты в диапазоне, которые являются предками <коммит>, потомками <коммит> или самим <коммит>. Если коммит не указан, использовать <коммит1> (исключённую часть диапазона) в качестве <коммит>. Может быть передан несколько раз; если да, коммит включается, если он является любым из заданных коммитов или если он является предком или потомком одного из них.
Далее следует более подробное объяснение.
Предположим, вы указали foo в качестве <пути>. Будем называть коммиты, которые изменяют foo, !TREESAME, а остальные — TREESAME. (В разнице (diff), отфильтрованной по foo, они выглядят соответственно разными и одинаковыми.)
В дальнейшем мы всегда будем ссылаться на один и тот же пример истории, чтобы проиллюстрировать различия между настройками упрощения. Предположим, что вы фильтруете файл foo в этом графе коммитов:
.-A---M---N---O---P---Q / / / / / / I B C D E Y \ / / / / / `-------------' X
Горизонтальная линия истории A---Q считается первым родителем каждого слияния. Коммиты:
-
I— это начальный коммит, в которомfooсуществует с содержимымasdf, и файлquuxсуществует с содержимымquux. Начальные коммиты сравниваются с пустым деревом, поэтомуIявляется !TREESAME. -
В
Afooсодержит просто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ниже).Слияния всегда включаются. Однако их список родителей переписывается: вдоль каждого родителя отсекаются (prune) коммиты, которые сами не включены. Это приводит к
.-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[=<коммит>] -
Ограничить отображаемые коммиты теми, которые являются предком <коммит>, или которые являются потомком <коммит>, или самим <коммит>.
В качестве примера рассмотрим следующую историю коммитов:
D---E-------F / \ \ B---C---G---H---I---J / \ A-------K---------------L--M
Обычный D..M вычисляет набор коммитов, которые являются предками
M, но исключает те, которые являются предкамиD. Это полезно, чтобы увидеть, что произошло в истории, ведущей кM, начиная сD, в смысле «что есть вM, чего не было вD». Результатом в этом примере будут все коммиты, кромеAиB(и самогоD, конечно).Однако, когда мы хотим выяснить, какие коммиты в
Mзаражены ошибкой, внесённойD, и требуют исправления, мы можем захотеть просмотреть только подмножествоD..M, которое является фактическими потомкамиD, т.е. исключаяCиK. Это именно то, что делает параметр--ancestry-path. Применённый к диапазонуD..M, он даёт:E-------F \ \ G---H---I---J \ L--M
Мы также можем использовать
--ancestry-path=Dвместо--ancestry-path, что означает то же самое при применении к диапазонуD..M, но является более явным.Если вместо этого нас интересует определённая тема в этом диапазоне и все коммиты, затронутые этой темой, мы можем захотеть просмотреть только подмножество
D..M, которое содержит эту тему в своём пути предков. Так, например, использование--ancestry-path=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 выше, вероятно, не является коммитом слияния, который использовался для слияния с важной веткой. Вместо этого слияние N использовалось для слияния R и X в важную ветку. Этот коммит может содержать в своём сообщении информацию о том, почему изменение X переопределило изменения из A и B.
-
--show-pulls -
В дополнение к коммитам, показанным в истории по умолчанию, показывать каждый коммит слияния, который не является TREESAME для своего первого родителя, но является TREESAME для более позднего родителя.
Когда коммит слияния включается с помощью
--show-pulls, слияние рассматривается так, как если бы оно «извлекло» (pulled) изменение из другой ветки. При использовании--show-pullsв этом примере (и никаких других параметров) результирующий граф:I---X---R---N
Здесь коммиты слияния
RиNвключены, потому что они извлекли (pulled) коммитыXиRв базовую ветку соответственно. Эти слияния являются причиной того, что коммитыAиBне отображаются в истории по умолчанию.Когда
--show-pullsиспользуется вместе с--simplify-merges, граф включает всю необходимую информацию:.-A---M--. N / / \ / I B R \ / / \ / / `---X--'
Обратите внимание, что поскольку
Mдостижим изR, ребро отNкMбыло упрощено. ОднакоNпо-прежнему появляется в истории как важный коммит, потому что он «извлёк» (pulled) изменениеRв основную ветку.
Параметр --simplify-by-decoration позволяет просматривать только общую картину топологии истории, опуская коммиты, на которые нет ссылок из меток. Коммиты помечаются как !TREESAME (другими словами, сохраняются после правил упрощения истории, описанных выше), если (1) на них есть ссылки из меток или (2) они изменяют содержимое путей, указанных в командной строке. Все остальные коммиты помечаются как TREESAME (подлежат упрощению).
Вспомогательные средства двоичного поиска
-
--bisect -
Ограничить вывод одним объектом-коммитом, который находится примерно на полпути между включаемыми и исключаемыми коммитами. Обратите внимание, что плохая ссылка двоичного поиска
refs/bisect/badдобавляется к включаемым коммитам (если она существует), а хорошие ссылки двоичного поискаrefs/bisect/good-*добавляются к исключаемым коммитам (если они существуют). Таким образом, предполагая, что вrefs/bisect/нет ссылок, если$ git rev-list --bisect foo ^bar ^baz
выводит midpoint, результат двух команд
$ git rev-list foo ^midpoint $ git rev-list midpoint ^bar ^baz
будут примерно одинаковой длины. Таким образом, поиск изменения, которое вносит регрессию, сводится к двоичному поиску: многократно генерировать и тестировать новые «midpoint», пока цепочка коммитов не станет длиной в один.
-
--bisect-vars -
Это вычисляет то же самое, что и
--bisect, за исключением того, что ссылки вrefs/bisect/не используются, и за исключением того, что выводится текст, готовый к выполнению (eval) оболочкой. Эти строки присвоят имя средней редакции (midpoint) переменнойbisect_rev, ожидаемое количество коммитов для тестирования после тестированияbisect_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 -
Выводить коммиты, выбранные для отображения (см. раздел «Ограничение коммитов» выше), в обратном порядке. Нельзя комбинировать с
--walk-reflogs.
Обход объектов
Эти параметры в основном предназначены для упаковки репозиториев Git.
-
--objects -
Выводить идентификаторы объектов любого объекта, на который ссылаются перечисленные коммиты. Таким образом,
--objectsfoo^barозначает «отправь мне все идентификаторы объектов, которые мне нужно загрузить, если у меня есть объект-коммитbar, но нетfoo». См. также--object-namesниже. -
--in-commit-order -
Выводить идентификаторы деревьев и blob-объектов в порядке коммитов. Идентификаторы деревьев и blob-объектов выводятся после того, как на них впервые появится ссылка из коммита.
-
--objects-edge -
Аналогично
--objects, но также выводит идентификаторы исключённых коммитов с префиксом "-". Это используется git-pack-objects[1] для создания «тонкого» (thin) пакета, который записывает объекты в дельтифицированной форме на основе объектов, содержащихся в этих исключённых коммитах, для уменьшения сетевого трафика. -
--objects-edge-aggressive -
Аналогично
--objects-edge, но прилагает больше усилий для поиска исключённых коммитов ценой увеличения времени. Это используется вместо--objects-edgeдля создания «тонких» (thin) пакетов для частичных (shallow) репозиториев. -
--indexed-objects -
Предполагать, как если бы все деревья и blob-объекты, используемые индексом, были перечислены в командной строке. Обратите внимание, что вам, вероятно, также захочется использовать
--objects. -
--unpacked -
Полезно только с
--objects; выводить идентификаторы объектов, которые не находятся в пакетах. -
--object-names -
Полезно только с
--objects; выводить имена найденных идентификаторов объектов. Это поведение по умолчанию. Обратите внимание, что «имя» каждого объекта неоднозначно и в основном предназначено как подсказка для упаковки объектов. В частности: не делается различий между именами меток, деревьев и blob-объектов; имена путей могут быть изменены для удаления новых строк; и если объект появляется несколько раз с разными именами, показывается только одно имя. -
--no-object-names -
Полезно только с
--objects; не выводить имена найденных идентификаторов объектов. Это инвертирует--object-names. Этот флаг позволяет выводу легче анализироваться такими командами, как git-cat-file[1]. -
--filter=<спецификатор-фильтра> -
Полезно только с одним из
--objects*; опускает объекты (обычно blob-объекты) из списка выводимых объектов. <спецификатор-фильтра> может быть одним из следующих:Форма
--filter=blob:noneопускает все blob-объекты.Форма
--filter=blob:limit=<n>[kmg] опускает blob-объекты размером не менее <n> байт или единиц. <n> может быть нулём. Суффиксыk,mиgможно использовать для указания единиц в КиБ, МиБ или ГиБ. Например,blob:limit=1k— то же самое, что blob:limit=1024.Форма
--filter=object:type=(tag|commit|tree|blob) опускает все объекты, которые не относятся к запрошенному типу. Обратите внимание, что явно предоставленные объекты игнорируют фильтры и всегда выводятся, если также не указан--filter-provided-objects.Форма
--filter=sparse:oid=<blob-ish> использует спецификацию частичного переключения (sparse-checkout), содержащуюся в blob-объекте (или blob-выражении) <blob-ish>, чтобы опустить blob-объекты, которые не потребовались бы для частичного переключения на запрошенных ссылках.Форма
--filter=tree:<глубина> опускает все деревья и blob-объекты, чья глубина от корневого дерева >= <глубина> (минимальная глубина, если объект находится на нескольких глубинах в пройденных коммитах). <глубина>=0 не будет включать никакие деревья или blob-объекты, если они не включены явно в командной строке (или в стандартном вводе при использовании--stdin). <глубина>=1 будет включать только дерево и blob-объекты, на которые непосредственно ссылается коммит, достижимый из <коммит> или явно заданный объект. <глубина>=2 аналогична <глубина>=1, но также включает деревья и blob-объекты, удалённые на один уровень от явно заданного коммита или дерева.Обратите внимание, что форма
--filter=sparse:path=<путь>, которая хотела читать из произвольного пути в файловой системе, была удалена по соображениям безопасности.Можно указать несколько флагов
--filter=для объединения фильтров. Включаются только объекты, которые принимаются каждым фильтром.Форму
--filter=combine:<фильтр1>+<фильтр2>+...<фильтрN> также можно использовать для объединения нескольких фильтров, но это сложнее, чем просто повторять флаг--filter, и обычно не требуется. Фильтры соединяются с помощью +, а отдельные фильтры %-кодируются (т.е. URL-кодируются). Кроме символов + и %, следующие символы зарезервированы и также должны быть закодированы: ~!@#$^&*()[]{}\;",<>?'`, а также все символы с ASCII-кодом <=0x20, включая пробел и новую строку.Другие произвольные символы также могут быть закодированы. Например,
combine:tree:3+blob:noneиcombine:tree%3A3+blob%3Anoneэквивалентны. -
--no-filter -
Отключить любой предыдущий аргумент
--filter=. -
--filter-provided-objects -
Фильтровать список явно предоставленных объектов, которые в противном случае всегда выводились бы, даже если они не соответствуют ни одному из фильтров. Полезно только с
--filter=. -
--filter-print-omitted -
Полезно только с
--filter=; выводит список объектов, опущенных фильтром. Идентификаторы объектов имеют префикс в виде символа “~”. -
--missing=<действие-при-отсутствии> -
Параметр отладки, помогающий будущей разработке «частичного клонирования». Этот параметр определяет, как обрабатываются отсутствующие объекты.
Форма
--missing=errorтребует, чтобы rev-list остановился с ошибкой, если встретится отсутствующий объект. Это действие по умолчанию.Форма
--missing=allow-anyпозволяет продолжить обход объектов, если встретится отсутствующий объект. Отсутствующие объекты будут молча опущены в результатах.Форма
--missing=allow-promisorпохожа наallow-any, но позволяет продолжить обход объектов только для ОЖИДАЕМЫХ отсутствующих объектов-поручителей (promisor). Неожиданный отсутствующий объект вызовет ошибку.Форма
--missing=printпохожа наallow-any, но также выводит список отсутствующих объектов. Идентификаторы объектов имеют префикс в виде символа “?”.Форма
--missing=print-infoпохожа наprint, но также выводит дополнительную информацию об отсутствующем объекте, полученную из содержащего его объекта. Вся информация выводится в одной строке с идентификатором отсутствующего объекта в форме: ?<oid> [<лексема>=<значение>].... Пары <лексема>=<значение>, содержащие дополнительную информацию, отделяются друг от друга ПРОБЕЛОМ. Значение кодируется специфическим для лексемы образом, но ПРОБЕЛ или ПЕРЕВОД_СТРОКИ, содержащиеся в значении, всегда должны быть представлены таким образом, чтобы результирующее закодированное значение не содержало ни одного из этих двух проблемных байтов. Каждый <лексема>=<значение> может быть одним из следующих:-
path=<путь> показывает путь отсутствующего объекта, полученный из содержащего его объекта. Путь, содержащий ПРОБЕЛ или специальные символы, при необходимости заключается в двойные кавычки в стиле C. -
type=<тип> показывает тип отсутствующего объекта, полученный из содержащего его объекта.
Если некоторые верхушки (tips), переданные для обхода, отсутствуют, они также будут считаться отсутствующими, и обход проигнорирует их. Однако, если мы не можем получить их идентификатор объекта, будет вызвана ошибка.
-
-
--exclude-promisor-objects -
(Только для внутреннего использования.) Предварительная фильтрация обхода объектов на границе поручителя (promisor). Используется с частичным клонированием. Это сильнее, чем
--missing=allow-promisor, потому что это ограничивает обход, а не просто подавляет ошибки об отсутствующих объектах. -
--no-walk[=(sorted|unsorted)] -
Показывать только заданные коммиты, но не обходить их предков. Это не имеет эффекта, если указан диапазон. Если указан аргумент
unsorted, коммиты показываются в том порядке, в котором они были заданы в командной строке. В противном случае (если указанsortedили аргумент не указан) коммиты показываются в обратном хронологическом порядке по времени коммита. Нельзя комбинировать с--graph. -
--do-walk -
Переопределяет предыдущий
--no-walk.
Форматирование коммитов
Используя эти параметры, git-rev-list[1] будет действовать аналогично более специализированному семейству инструментов журнала коммитов: git-log[1], git-show[1], и git-whatchanged[1].
-
--pretty[=<формат>] -
--format=<формат> -
Вывести содержимое журналов коммитов в заданном структурированном формате, где <формат> может быть одним из:
oneline,short,medium,full,fuller,reference,email,raw,format:<строка> иtformat:<строка>. Если <формат> не является ни одним из вышеперечисленных и содержит%<заполнитель>, он действует так, как если бы был задан--pretty=tformat:<формат>.См. раздел "СТРУКТУРИРОВАННЫЕ ФОРМАТЫ" для получения дополнительных сведений о каждом формате. Если часть
=<формат> опущена, по умолчанию используетсяmedium.Noteвы можете указать структурированный формат по умолчанию в конфигурации репозитория (см. git-config[1]). -
--abbrev-commit -
Вместо отображения полного 40-байтового шестнадцатеричного имени объекта коммита показывать префикс, который однозначно именует объект. Параметр
--abbrev=<n> (которая также изменяет вывод diff, если он отображается) может быть использована для указания минимальной длины префикса.Это должно сделать
--pretty=onelineнамного более читаемым для людей, использующих терминалы с 80 колонками. -
--no-abbrev-commit -
Показать полное 40-байтовое шестнадцатеричное имя объекта коммита. Это отменяет
--abbrev-commit, как явный, так и подразумеваемый другими опциями, такими как--oneline. Также это переопределяет переменнуюlog.abbrevCommit. -
--oneline -
Это краткая форма для совместного использования
--pretty=oneline--abbrev-commit. -
--encoding=<кодировка> -
Объекты коммитов записывают кодировку символов, используемую для сообщения журнала, в своём заголовке encoding; этот параметр можно использовать, чтобы указать команде перекодировать сообщение журнала коммита в кодировку, предпочитаемую пользователем. Для команд не внутреннего интерфейса по умолчанию используется UTF-8. Обратите внимание, что если объект утверждает, что закодирован в
X, и мы выводим вX, мы будем выводить объект как есть; это означает, что недопустимые последовательности в исходном коммите могут быть скопированы в вывод. Аналогично, если iconv(3) не удаётся преобразовать коммит, мы будем молча выводить исходный объект как есть. -
--expand-tabs=<n> -
--expand-tabs -
--no-expand-tabs -
Выполнить раскрытие табуляции (заменить каждый таб достаточным количеством пробелов, чтобы заполнить до следующего столбца отображения, кратного <n>) в сообщении журнала перед его отображением в выводе.
--expand-tabs— это краткая форма для--expand-tabs=8, а--no-expand-tabs— краткая форма для--expand-tabs=0, которая отключает раскрытие табуляции.По умолчанию табуляция раскрывается в красивых форматах, которые делают отступ сообщения журнала в 4 пробела (т.е.
medium, который является форматом по умолчанию,fullиfuller). -
--show-signature -
Проверить действительность подписанного объекта коммита, передав подпись в
gpg--verify, и показать вывод.
-
--relative-date -
Синоним для
--date=relative. -
--date=<формат> -
Вступает в силу только для дат, отображаемых в удобочитаемом формате, например, при использовании
--pretty. Переменная конфигурацииlog.dateустанавливает значение по умолчанию для параметра--dateкоманды log. По умолчанию даты отображаются в исходном часовом поясе (либо коммиттера, либо автора). Если к формату добавлен-local(например,iso-local), вместо него используется местный часовой пояс пользователя.--date=relativeпоказывает даты относительно текущего времени, например, “2 часа назад”. Параметр-localне имеет эффекта для--date=relative.--date=local— это псевдоним для--date=default-local.--date=iso(или--date=iso8601) показывает временные метки в формате, подобном ISO 8601. Отличия от строгого формата ISO 8601:-
пробел вместо разделителя даты/времени
T -
пробел между временем и часовым поясом
-
отсутствие двоеточия между часами и минутами часового пояса
--date=iso-strict(или--date=iso8601-strict) показывает временные метки в строгом формате ISO 8601.--date=rfc(или--date=rfc2822) показывает временные метки в формате RFC 2822, часто встречающемся в сообщениях электронной почты.--date=shortпоказывает только дату, но не время, в формате ГГГГ-ММ-ДД.--date=rawпоказывает дату как количество секунд с начала эпохи (1970-01-01 00:00:00 UTC), затем пробел, а затем часовой пояс как смещение от UTC (символ+или-с четырьмя цифрами; первые две — часы, вторые две — минуты). Т.е. как если бы временная метка была отформатирована с помощьюstrftime("%s%z")). Обратите внимание, что параметр-localне влияет на значение секунд с начала эпохи (которое всегда измеряется в UTC), но изменяет сопутствующее значение часового пояса.--date=humanпоказывает часовой пояс, если он не совпадает с текущим часовым поясом, и не печатает всю дату, если она совпадает (т.е. пропускает печать года для дат, которые «в этом году», а также пропускает всю дату, если она была в последние несколько дней, и можно просто сказать, какой это был день недели). Для более старых дат час и минута также опускаются.--date=unixпоказывает дату как временную метку эпохи Unix (секунды с 1970 года). Как и в случае с--raw, это всегда в UTC, и поэтому-localне имеет эффекта.--date=format:<формат> передаёт <формат> в вашу системную функциюstrftime, за исключением%s,%zи%Z, которые обрабатываются внутри. Используйте--date=format:%c, чтобы показать дату в предпочтительном формате вашей системной локали. Полный список меток-заполнителей формата см. в руководствеstrftime(3). При использовании-localправильный синтаксис:--date=format-local:<формат>.--date=default— это формат по умолчанию, основанный на выводе ctime(3). Он показывает одну строку с трёхбуквенным днём недели, трёхбуквенным месяцем, днём месяца, временем в формате "ЧЧ:ММ:СС", за которым следует 4-значный год, плюс информация о часовом поясе, если не используется местный часовой пояс, например,ThuJan100:00:001970+0000. -
-
--header -
Выводит содержимое коммита в необработанном формате; каждая запись разделяется символом NUL.
-
--no-commit-header -
Подавляет строку заголовка, содержащую «commit» и идентификатор объекта, выводимую перед указанным форматом. Это не влияет на встроенные форматы; затрагиваются только пользовательские форматы.
-
--commit-header -
Переопределяет предыдущий
--no-commit-header. -
--parents -
Выводит также родителей коммита (в форме «commit parent…»). Также включает перезапись родителей; см. «Упрощение истории» выше.
-
--children -
Выводит также потомков коммита (в форме «commit child…»). Также включает перезапись родителей; см. «Упрощение истории» выше.
-
--timestamp -
Выводит необработанную временную метку коммита.
-
--left-right -
Отмечает, с какой стороны симметрической разности достижим коммит. Коммиты с левой стороны имеют префикс <, а с правой — >. Если комбинируется с
--boundary, эти коммиты имеют префикс-.Например, если у вас такая топология:
y---b---b branch B / \ / / . / / \ o---x---a---a branch A
вы получите вывод, подобный этому:
$ git rev-list --left-right --boundary --pretty=oneline A...B >bbbbbbb... 3-й на b >bbbbbbb... 2-й на b <aaaaaaa... 3-й на a <aaaaaaa... 2-й на a -yyyyyyy... 1-й на b -xxxxxxx... 1-й на a
-
--graph -
Рисует текстовое графическое представление истории коммитов в левой части вывода. Это может привести к печати дополнительных строк между коммитами, чтобы граф истории был нарисован правильно. Нельзя комбинировать с
--no-walk.Это включает перезапись родителей; см. «Упрощение истории» выше.
Это по умолчанию подразумевает параметр
--topo-order, но также может быть указан параметр--date-order. -
--show-linear-break[=<барьер>] -
Когда
--graphне используется, все ветки истории сглаживаются, что может затруднить понимание того, что два последовательных коммита не принадлежат линейной ветке. В этом случае этот параметр помещает между ними барьер. Если указан <барьер>, это строка, которая будет показана вместо строки по умолчанию. -
--count -
Вывести число, указывающее, сколько коммитов было бы перечислено, и подавить весь остальной вывод. При совместном использовании с
--left-rightвместо этого вывести количество коммитов слева и справа, разделённых табуляцией. При совместном использовании с--cherry-markисключить эквивалентные по изменению (patch equivalent) коммиты из этих подсчётов и вывести количество эквивалентных коммитов, разделённых табуляцией.
СТРУКТУРИРОВАННЫЕ ФОРМАТЫ
Если коммит является слиянием и структурированный формат не является oneline, email или raw, перед строкой Author: вставляется дополнительная строка. Эта строка начинается с "Merge: " и содержит хеши родительских коммитов, разделённые пробелами. Обратите внимание, что перечисленные коммиты могут не обязательно быть списком прямых родительских коммитов, если вы ограничили свой обзор истории: например, если вас интересуют только изменения, связанные с определённым каталогом или файлом.
Существует несколько встроенных форматов, и вы можете определить дополнительные форматы, установив параметр конфигурации pretty.<имя> либо в другое имя формата, либо в строку format:, как описано ниже (см. git-config[1]). Вот подробности встроенных форматов:
-
oneline -
<хеш> <строка-заголовка>
Этот формат задуман так, чтобы он был настолько компактным, насколько это возможно.
-
short -
commit <хеш> Author: <автор> _ <строка-заголовка>_ -
medium -
commit <хеш> Author: <автор> Date: <дата-автора> _ <строка-заголовка> <полное-сообщение-коммита>_ -
full -
commit <хеш> Author: <автор> Commit: <коммиттер> _ <строка-заголовка> <полное-сообщение-коммита>_ -
fuller -
commit <хеш> Author: <автор> AuthorDate: <дата-создания> Commit: <коммиттер> CommitDate: <дата-коммита> _ <строка-заголовка> <полное-сообщение-коммита>_ -
reference -
<краткий-хеш> (<строка-заголовка>,<короткая-дата-создания>)Этот формат используется для ссылки на другой коммит в сообщении коммита и совпадает с
--pretty='format:%C(auto)%h(%s,%ad). По умолчанию дата форматируется с помощью--date=short, если явно не указан другой параметр--date. Как и в случае с любымformat:с заполнителями формата, на его вывод не влияют другие опции, такие как--decorateи--walk-reflogs. -
email -
From <хеш> <дата> From: <автор> Date: <дата-создания> Subject: [PATCH] <строка-заголовка> _ <полное-сообщение-коммита>_
-
mboxrd -
Как и
email, но строки в сообщении коммита, начинающиеся с "From " (перед которыми стоит ноль или более ">"), заключаются в кавычки с помощью ">", чтобы их нельзя было перепутать с началом нового коммита. -
raw -
Формат
rawпоказывает весь коммит точно так, как он хранится в объекте коммита. Примечательно, что хеши отображаются полностью, независимо от того, используются ли--abbrevили--no-abbrev, и информация о родителях показывает истинные родительские коммиты, без учёта сращиваний или упрощения истории. Обратите внимание, что этот формат влияет на способ отображения коммитов, но не на способ показа разницы, например, с помощьюgitlog--raw. Чтобы получить полные имена объектов в сыром формате разницы, используйте--no-abbrev. -
format:<строка-формата> -
Формат
format:<строка-формата> позволяет указать, какую информацию вы хотите показать. Он работает немного похоже на формат printf, с тем важным исключением, что новая строка получается с помощью%nвместо \n.Например, format:"Автором %h был %an, %ar%nЗаголовок >>%s<<%n" выведет что-то вроде:
Автором fe6e0ee был Junio C Hamano, 23 hours ago Заголовок >>t4119: проверка автовычисления -p<n> для традиционного вывода diff.<<
Возможные метки-заполнители включают:
-
Метки-заполнители, которые раскрываются в один конкретный символ:
-
Метки-заполнители, которые влияют на форматирование последующих меток-заполнителей:
-
%Cred -
переключить цвет на красный
-
%Cgreen -
переключить цвет на зелёный
-
%Cblue -
переключить цвет на синий
-
%Creset -
сбросить цвет на стандартный
-
%C(<спецификация>) -
спецификация цвета, как описано в разделе Значения раздела "КОНФИГУРАЦИОННЫЙ ФАЙЛ" в git-config[1]. По умолчанию цвета показываются только когда они включены для вывода журнала (с помощью
color.diff,color.uiили--color, и с учётом настроекautoпервых, если вывод идёт на терминал).%C(auto,<спецификация>) принимается как исторический синоним для значения по умолчанию (например,%C(auto,red)). Указание%C(always,<спецификация>) будет показывать цвета, даже если они иначе не включены (хотя рассмотрите возможность просто использовать--color=alwaysдля включения цвета для всего вывода, включая этот формат и всё остальное, что git может раскрашивать).autoсам по себе (т.е.%C(auto)) включит автоматическую раскраску для следующих заполнителей, пока цвет не будет переключён снова. -
%m -
отметка, является ли коммит достижимым слева (<), справа (>) или является ли он граничным (
-) -
%w([<w>[,<i1>[,<i2>]]]) -
переключить перенос строк, как параметр
-wв git-shortlog[1]. - %<(<n>[
,(trunc|ltrunc|mtrunc)]) -
заставляет следующий заполнитель занимать как минимум N колонок, добавляя пробелы справа при необходимости. При желании можно обрезать (с многоточием
..) слева (ltrunc)..ft, посередине (mtrunc)mi..leили справа (trunc)rig.., если вывод длиннее <n> колонок. Примечание 1: обрезание корректно работает только с <n> >= 2. Примечание 2: пробелы вокруг значений <n> и <m> (см. ниже) необязательны. Примечание 3: эмодзи и другие широкие символы будут занимать две колонки отображения, что может выходить за границы колонок. Примечание 4: разложенные диакритические знаки могут быть смещены на границах заполнения. - %<|(<m> )
-
заставляет следующий заполнитель занимать как минимум до <m>-й колонки отображения, добавляя пробелы справа при необходимости. Используйте отрицательные значения <m> для позиций колонок, измеряемых от правого края окна терминала.
- %>(<n>)
- %>|(<m>)
-
аналогично %<(<n>) и %<|(<m>) соответственно, но добавляет пробелы слева
- %>>(<n>)
- %>>|(<m>)
-
аналогично %>(<n>) и %>|(<m>) соответственно, за исключением того, что если следующая метка-заполнитель занимает больше места, чем задано, и слева от него есть пробелы, используются эти пробелы
- %><(<n>)
- %><|(<m>)
-
аналогично %<(<n>) и %<|(<m>) соответственно, но добавляет пробелы с обеих сторон (т.е. текст центрируется)
-
-
Метки-заполнители, которые раскрываются в информацию, извлекаемую из коммита:
-
%H -
хеш коммита
-
%h -
сокращённый хеш коммита
-
%T -
хеш объекта дерева каталогов
-
%t -
сокращённый хеш объекта дерева каталогов
-
%P -
хеши родителей
-
%p -
сокращённые хеши родителей
-
%an -
имя автора
-
%aN -
имя автора (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%ae -
email автора
-
%aE -
email автора (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%al -
локальная часть эл. почты автора (часть до знака
@) -
%aL -
локальная часть автора (см.
%al) с учётом .mailmap, см. git-shortlog[1] или git-blame[1]) -
%ad -
дата создания (формат соответствует параметру --date=)
-
%aD -
дата создания в формате RFC2822
-
%ar -
дата создания, относительная
-
%at -
дата создания, время UNIX
-
%ai -
дата создания в формате подобном ISO 8601
-
%aI -
дата создания в формате ISO 8601 (строго)
-
%as -
дата создания, короткий формат (ГГГГ-ММ-ДД)
-
%ah -
дата создания, в человеческом виде (как при указании параметра
--date=humangit-rev-list[1]) -
%cn -
имя коммитера
-
%cN -
имя коммитера (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%ce -
email коммитера
-
%cE -
email коммитера (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%cl -
локальная часть эл. почты коммиттера (часть до знака
@) -
%cL -
локальная часть коммиттера (см.
%cl) с учётом .mailmap, см. git-shortlog[1] или git-blame[1]) -
%cd -
дата коммита (формат соответствует параметру --date=)
-
%cD -
дата коммита в формате RFC2822
-
%cr -
дата коммита, относительная
-
%ct -
дата коммита, время UNIX
-
%ci -
дата коммита в формате подобном ISO 8601
-
%cI -
дата коммита в формате ISO 8601 (строго)
-
%cs -
дата коммита, короткий формат (ГГГГ-ММ-ДД)
-
%ch -
дата коммита, в человеческом виде (как при указании параметра
--date=humangit-rev-list[1]) -
%d -
имена ссылок, как параметр --decorate команды git-log[1]
-
%D -
имена ссылок, без скобок «(» и «)».
-
%(count) -
номер патча в серии патчей. Используется только в
--commit-list-formatвformat-patch -
%(total) -
общее количество патчей в серии патчей. Используется только в
--commit-list-formatвformat-patch -
%(decorate[:<параметр>,...]) -
имена ссылок с настраиваемыми декораторами. За строкой
decorateможет следовать двоеточие и ноль или более параметров, разделённых запятыми. Значения параметров могут содержать литералы, представленные в виде кода форматирования. Они должны, в частности, использоваться для запятых (%x2C) и закрывающих круглых скобок (%x29) из-за того, что они имеют собственную роль в синтаксисе списка параметров.-
prefix=<значение> -
Показывается перед списком имён ссылок. По умолчанию: " (".
-
suffix=<значение> -
Показывается после списка имён ссылок. По умолчанию: ")".
-
separator=<значение> -
Показывается между именами ссылок. По умолчанию: "
,". -
pointer=<значение> -
Показывается между HEAD и веткой, на которую он указывает, если таковая есть. По умолчанию: " → ".
-
tag=<значение> -
Показывается перед именами меток. По умолчанию: "
tag:".
Например, для создания декоратора, не завёрнутого ни в какие скобки, без аннотации меток и с пробелами в качестве разделителей:
-
%(decorate:prefix=,suffix=,tag=,separator= )
-
%(describe[:<параметр>,...]) -
имя, предназначенное для чтения человеком, как в git-describe[1]; пустая строка для коммитов, для которых невозможно создать описание. После
describeможет идти двоеточие и ноль или более параметров, разделённых запятыми. Описания могут быть непоследовательными, когда одновременно с этим добавляются или удаляются метки.-
tags[=<логическое-значение>] -
Вместо учёта только аннотированных меток, учитывать также легковесные метки.
-
abbrev=<число> -
Вместо использования стандартного количества шестнадцатеричных цифр (которое варьируется в зависимости от количества объектов в репозитории, по умолчанию 7) для сокращённого имени объекта, использовать <число> цифр или столько цифр, сколько необходимо для формирования уникального имени объекта.
-
match=<шаблон> -
Учитывать только метки, соответствующие заданному шаблону
glob(7) <шаблон>, исключая префиксrefs/tags/. -
exclude=<шаблон> -
Не учитывать метки, соответствующие заданному шаблону
glob(7) <шаблон>, исключая префиксrefs/tags/.
-
-
%S -
имя ссылки, указанное в командной строке, по которой был достигнут коммит (как в
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 -
сокращённый селектор журнала ссылок; то же, что и
%gD, но та часть, которая является именем ссылки, сокращена для удобства чтения (поэтомуrefs/heads/masterстановится простоmaster). -
%gn -
имя, записанное в журнале ссылок
-
%gN -
имя, записанное в журнале ссылок (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%ge -
email, записанный в журнале ссылок
-
%gE -
email, записанный в журнале ссылок (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%gs -
заголовок записи журнала ссылок
-
%(trailers[:<параметр>,...]) -
выводит завершители тела коммита, которые интерпретируются git-interpret-trailers[1]. После строки
trailersможет идти двоеточие и ноль или более параметров, разделёнными запятыми. Если какой-либо параметр указан несколько раз, используется его последнее вхождение.-
key=<ключ> -
показывать только завершители с указанным <ключом>. Сопоставление выполняется без учёта регистра, и завершающее двоеточие необязательно. Если параметр указан несколько раз, показываются строки завершителей, соответствующие любому из ключей. Этот параметр автоматически включает опцию
only, поэтому строки, не являющиеся завершителями, в блоке завершителей скрываются. Если это нежелательно, это можно отключить с помощьюonly=false. Например,%(trailers:key=Reviewed-by) показывает строки завершителей с ключомReviewed-by. -
only[=<логическое-значение>] -
выбирает, должны ли включаться строки из блока завершителей, не являющиеся завершителями.
-
separator=<разделитель> -
указывает разделитель, вставляемый между строками завершителей. По умолчанию используется символ перевода строки. Строка <разделитель> может содержать литеральные коды форматирования, описанные выше. Чтобы использовать запятую в качестве разделителя, необходимо использовать
%x2C, так как иначе она будет проанализирована как следующая опция. Например,%(trailers:key=Ticket,separator=%x2C) показывает все строки завершителей с ключом "Ticket", разделённые запятой и пробелом. -
unfold[=<логическое-значение>] -
заставляет вести себя так, как если бы была указана опция interpret-trailer
--unfold. Например,%(trailers:only,unfold=true) разворачивает и показывает все строки завершителей. -
keyonly[=<логическое-значение>] -
показывать только ключевую часть завершителя.
-
valueonly[=<логическое-значение>] -
показывать только часть значения завершителя.
-
key_value_separator=<разделитель> -
указывает разделитель, вставляемый между ключом и значением каждого завершителя. По умолчанию ": ". В остальном он имеет ту же семантику, что и
separator=<разделитель> выше.
-
NoteНекоторые заполнители могут зависеть от других опций, переданных механизму обхода ревизий. Например, опции reflog %g*будут вставлять пустую строку, если только мы не обходим записи reflog (например, с помощьюgitlog-g). Заполнители%dи%Dбудут использовать "short" формат украшения, если--decorateне был предоставлен в командной строке.Логические опции принимают необязательное значение [
=<логическое-значение>]. Принимаются все значения, которые принимает--type=boolв git-config[1], такие какyesиoff. Указание логической опции без=<значения> эквивалентно указанию её с=true.Если вы добавите
+(знак плюса) после%в заполнителе, символ перевода строки вставляется непосредственно перед подстановкой, если и только если заполнитель расширяется до непустой строки.Если вы добавите
-(знак минуса) после%в заполнителе, все непосредственно предшествующие подстановке символы перевода строки удаляются, если и только если заполнитель расширяется до пустой строки.Если вы добавите (пробел) после
%в заполнителе, пробел вставляется непосредственно перед подстановкой, если и только если заполнитель расширяется до непустой строки. -
-
-
tformat: -
Формат
tformat:работает точно так же, какformat:, за исключением того, что он предоставляет семантику "терминатора" вместо семантики "разделителя". Другими словами, к каждому коммиту добавляется символ терминатора сообщения (обычно новая строка), а не разделитель, помещаемый между записями. Это означает, что последняя запись однострочного формата будет правильно завершена новой строкой, как это делает формат "oneline". Например:$ git log -2 --pretty=format:%h 4da45bef \ | perl -pe '$_ .= " -- НЕТ СИМВОЛА ПЕРЕВОДА СТРОКИ\n" unless /\n/' 4da45be 7134973 -- НЕТ СИМВОЛА ПЕРЕВОДА СТРОКИ $ git log -2 --pretty=tformat:%h 4da45bef \ | perl -pe '$_ .= " -- НЕТ СИМВОЛА ПЕРЕВОДА СТРОКИ\n" unless /\n/' 4da45be 7134973
Кроме того, любая нераспознанная строка, содержащая
%, интерпретируется так, как если бы перед ней былоtformat:. Например, эти два эквивалентны:$ git log -2 --pretty=tformat:%h 4da45bef $ git log -2 --pretty=%h 4da45bef
ПРИМЕРЫ
-
Вывести список коммитов достижимых из текущей ветки.
git rev-list HEAD
-
Вывести список коммитов в этой ветке, отсутствующих в вышестоящей ветке.
git rev-list @{вышестоящая}..HEAD -
Форматировать коммиты с их автором и сообщением коммита (см. также высокоуровневый программный интерфейс git-log[1]).
git rev-list --format=medium HEAD
-
Форматировать коммиты вместе с их различиями (см. также высокоуровневый программный интерфейс git-log[1], который может сделать это в одном процессе).
git rev-list HEAD | git diff-tree --stdin --format=medium -p
-
Вывести список коммитов в текущей ветке, которые затронули любой файл в каталоге
Documentation.git rev-list HEAD -- Documentation/
-
Вывести список коммитов, автором которых являетесь вы за последний год, в любой ветке, метке или другой ссылке.
git rev-list --author=you@example.com --since=1.year.ago --all
-
Вывести список объектов, достижимых из текущей ветки (т.е. всех коммитов и содержащихся в них blob-объектов и деревьев).
git rev-list --objects HEAD
-
Сравнить размер на диске всех достижимых объектов с объектами, достижимыми из журналов ссылок, и с общим упакованным размером. Это может сказать вам, может ли выполнение
gitrepack-adуменьшить размер репозитория (за счёт удаления недостижимых объектов) и может ли помочь истечение срока действия журналов ссылок.# достижимые объекты git rev-list --disk-usage --objects --all # плюс журналы ссылок git rev-list --disk-usage --objects --all --reflog # общий используемый размер на диске du -c .git/objects/pack/*.pack .git/objects/??/* # альтернатива du: сложить поля "size" и "size-pack" git count-objects -v
-
Сообщить размер на диске каждой ветки, не включая объекты, используемые текущей веткой. Это может найти выбросы, которые способствуют раздуванию размера репозитория (например, потому что кто-то случайно закоммитил большие артефакты сборки).
git for-each-ref --format='%(refname)' | while read branch do size=$(git rev-list --disk-usage --objects HEAD..$branch) echo "$size $branch" done | sort -n
-
Сравнить размер на диске веток в одной группе ссылок, исключая другую. Если вы смешиваете объекты из нескольких внешних репозиториев в одном репозитории, это может показать, какие внешние репозитории вносят вклад в размер репозитория (принимая размер
originза базовый уровень).git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin
GIT
Является частью пакета git[1]