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.46.1 → 2.47.3 no changes
-
2.46.0
2024-07-29
- 2.45.4 no changes
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 no changes
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 no changes
-
2.44.0
2024-02-23
- 2.43.3 → 2.43.7 no changes
-
2.43.2
2024-02-13
- 2.43.1 no changes
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 no changes
-
2.42.1
2023-11-02
-
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.3 → 2.38.5 no changes
-
2.38.2
2022-12-11
- 2.38.1 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.2 → 2.25.5 no changes
-
2.25.1
2020-02-17
-
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.19.1 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 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 log foo bar ^baz
означает «перечислить все коммиты, достижимые из foo или bar, но не из baz».
Специальное обозначение "<коммит1>..<коммит2>" можно использовать как сокращение для "^<коммит1> <коммит2>". Например, любое из следующих может использоваться взаимозаменяемо:
$ git log origin..HEAD $ git log HEAD ^origin
Ещё одно специальное обозначение — "<коммит1>...<коммит2>", которое полезно для слияний. Результирующее множество коммитов представляет собой симметрическую разность двух операндов. Следующие две команды эквивалентны:
$ git log A B --not $(git merge-base --all A B) $ git log A...B
Команда принимает параметры, применимые к команде git-rev-list[1], чтобы управлять тем, что и как показывается, и параметры, применимые к команде git-diff[1], чтобы управлять тем, как показываются изменения, вносимые каждым коммитом.
ПАРАМЕТРЫ
-
--follow -
Продолжить отображение истории файла за пределами переименований (работает только для одного файла).
-
--no-decorate -
--decorate[=(short|full|auto|no)] -
Выводить имена ссылок любых показанных коммитов. Возможные значения:
`short`;; префиксы имён ссылок `refs/heads/`, `refs/tags/` и `refs/remotes/` не выводятся. `full`;; выводится полное имя ссылки (включая префикс). `auto`:: если вывод направляется в терминал, имена ссылок показываются так, как если бы был указан `short`, в противном случае имена ссылок не показываются.
Параметр
--decorateявляется краткой формой для--decorate=short. По умолчанию используется значение конфигурацииlog.decorate, если оно задано, в противном случае —auto. -
--decorate-refs=<шаблон> -
--decorate-refs-exclude=<шаблон> -
Для каждого кандидата в ссылки не использовать его для оформления, если он соответствует любому из параметров <шаблон>, переданных в
--decorate-refs-exclude, или если он не соответствует ни одному из параметров <шаблон>, переданных в--decorate-refs. Параметр конфигурацииlog.excludeDecorationпозволяет исключать ссылки из оформления, но явный шаблон--decorate-refsимеет приоритет над совпадением вlog.excludeDecoration.Если ни один из этих параметров или настроек конфигурации не задан, то ссылки используются для оформления, если они соответствуют
HEAD,refs/heads/,refs/remotes/,refs/stash/илиrefs/tags/. -
--clear-decorations -
При указании этот параметр очищает все предыдущие параметры
--decorate-refsили--decorate-refs-excludeи ослабляет фильтр оформления по умолчанию, включая все ссылки. Этот параметр подразумевается, если значение конфигурацииlog.initialDecorationSetустановлено вall. -
--source -
Выводить имя ссылки, указанное в командной строке, с помощью которой был достигнут каждый коммит.
-
--mailmap -
--no-mailmap -
--use-mailmap -
--no-use-mailmap -
Использовать файл mailmap для сопоставления имён и адресов электронной почты автора и коммиттера с каноническими реальными именами и адресами электронной почты. См. git-shortlog[1].
-
--full-diff -
Без этого флага
gitlog-p<путь>... показывает коммиты, которые затрагивают указанные пути, и различия для тех же указанных путей. С этим флагом для коммитов, затрагивающих указанные пути, показывается полное сравнение; это означает, что "<путь>..." ограничивает только коммиты и не ограничивает сравнение для этих коммитов.Обратите внимание, что это влияет на все типы вывода на основе сравнения, например, создаваемые
--statи т.д. -
--log-size -
Включать строку
logsize<число> в вывод для каждого коммита, где <число> — это длина сообщения этого коммита в байтах. Предназначено для ускорения инструментов, которые читают сообщения журнала из выводаgitlog, позволяя им заранее выделять место. -
-L<начало>,<конец>:<файл> -
-L:<имя-функции>:<файл> -
Отслеживает эволюцию диапазона строк, заданного <начало>
,<конец>, или регулярным выражением имени функции <имя-функции>, внутри <файл>. Вы не можете указывать ограничители спецификаторов пути. В настоящее время это ограничено обходом, начинающимся с одной редакции, т.е. вы можете указать только ноль или один положительный аргумент редакции, и <начало> и <конец> (или <имя-функции>) должны существовать в начальной редакции. Вы можете указать этот параметр более одного раза. Подразумевает--patch. Вывод изменений может быть подавлен с помощью--no-patch, но другие форматы списка изменений (а именно--raw,--numstat,--shortstat,--dirstat,--summary,--name-only,--name-status,--check) в настоящее время не реализованы.<начало> и <конец> могут принимать одну из этих форм:
-
<число>
Если <начало> или <конец> является числом, оно указывает абсолютный номер строки (строки считаются с 1).
-
/<регулярное-выражение>/Эта форма будет использовать первую строку, соответствующую заданному <регулярному-выражению> POSIX. Если <начало> является регулярным выражением, поиск будет производиться с конца предыдущего диапазона
-L, если таковой имеется, в противном случае — с начала файла. Если <начало> имеет вид^/<регулярное-выражение>/, поиск будет производиться с начала файла. Если <конец> является регулярным выражением, поиск будет начинаться со строки, заданной <началом>. -
+<смещение> или-<смещение>Это допустимо только для <конца> и указывает количество строк до или после строки, заданной <началом>.
Если вместо <начало> и <конца> указано
:<имя-функции>, это регулярное выражение, обозначающее диапазон от первой строки с именем функции, соответствующей <имя-функции>, до следующей строки с именем функции.:<имя-функции> ищет с конца предыдущего диапазона-L, если таковой имеется, в противном случае — с начала файла.^:<имя-функции> ищет с начала файла. Имена функций определяются так же, какgitdiffопределяет заголовки фрагментов патча (см. раздел Определение пользовательского заголовка фрагмента в gitattributes[5]). -
- <диапазон-редакций>
-
Показывать только коммиты в указанном диапазоне редакций. Если <диапазон-редакций> не указан, по умолчанию используется
HEAD(т.е. вся история, ведущая к текущему коммиту).origin..HEADуказывает все коммиты, достижимые из текущего коммита (т.е.HEAD), но не изorigin. Полный список способов указания <диапазона-редакций> см. в разделе Указание диапазонов в gitrevisions[7]. - [
--] <путь>... -
Показывать только коммиты, достаточные для объяснения того, как появились файлы, соответствующие указанным путям. Подробности и другие режимы упрощения см. в разделе Упрощение истории ниже.
Пути может потребоваться предварить
--, чтобы отделить их от параметров или диапазона редакций, когда возникает путаница.
Ограничение коммитов
Помимо указания диапазона коммитов, который должен быть выведен с использованием специальных обозначений, описанных в описании, может быть применено дополнительное ограничение коммитов.
Использование большего количества параметров обычно дополнительно ограничивает вывод (например, --since=<дата1> ограничивает коммитами новее <дата1>, а использование его с --grep=<шаблон> дополнительно ограничивает коммитами, сообщение журнала которых содержит строку, соответствующую <шаблон>), если не указано иное.
Обратите внимание, что они применяются перед параметрами упорядочивания и форматирования коммитов, такими как --reverse.
-
-<число> -
-n<число> -
--max-count=<число> -
Ограничить вывод <числом> коммитов.
-
--skip=<число> -
Пропустить <число> коммитов перед началом показа вывода коммитов.
-
--since=<дата> -
--after=<дата> -
Показать коммиты новее <дата>.
-
--since-as-filter=<дата> -
Показать все коммиты новее <дата>. Это посещает все коммиты в диапазоне, а не останавливается на первом коммите, который старше <дата>.
-
--until=<дата> -
--before=<дата> -
Показать коммиты старше <дата>.
-
--author=<шаблон> -
--committer=<шаблон> -
Ограничить вывод коммитов теми, у которых строки заголовка автора/коммиттера соответствуют регулярному выражению <шаблон>. При наличии более одного
--author=<шаблон> выбираются коммиты, чей автор соответствует любому из <шаблон> (аналогично для нескольких--committer=<шаблон>). -
--grep-reflog=<шаблон> -
Ограничить вывод коммитов теми, у которых записи журнала ссылок (reflog) соответствуют регулярному выражению <шаблон>. При наличии более одного
--grep-reflogвыбираются коммиты, чьё сообщение в журнале ссылок соответствует любому из заданных шаблонов. Использование этого параметра является ошибкой, если не используется--walk-reflogs. -
--grep=<шаблон> -
Ограничить вывод коммитов теми, у которых сообщение журнала соответствует регулярному выражению <шаблон>. При наличии более одного
--grep=<шаблон> выбираются коммиты, чьё сообщение соответствует любому из <шаблон> (но см.--all-match).Когда действует
--notes, сообщение из заметок сопоставляется так, как если бы оно было частью сообщения журнала. -
--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) репозиторий, и этот параметр позволяет вам игнорировать отдельные коммиты, внесённые в вашу историю таким слиянием.
Этот параметр также изменяет формат вывода разницы (diff) по умолчанию для коммитов слияния на
first-parent; подробности см. в--diff-merges=first-parent. -
--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 -
При обнаружении недопустимого имени объекта во вводе предполагать, как если бы неправильный ввод не был дан.
-
--bisect -
Предполагать, как если бы в командной строке была указана плохая ссылка двоичного поиска
refs/bisect/bad, за которой следовали--notи хорошие ссылки двоичного поискаrefs/bisect/good-*. -
--stdin -
В дополнение к получению аргументов из командной строки, также читать их из стандартного ввода. Это принимает коммиты и псевдопараметры, такие как
--allи--glob=. Когда встречается разделитель--, следующий ввод обрабатывается как пути и используется для ограничения результата. Флаги, такие как--not, которые читаются через стандартный ввод, учитываются только для аргументов, переданных таким же образом, и не будут влиять на последующие аргументы командной строки. -
--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 -
Выводить исключённые граничные коммиты. Граничные коммиты имеют префикс
-.
Упрощение истории
Иногда вас интересуют только части истории, например, коммиты, изменяющие конкретный <путь>. Но в «Упрощении истории» есть две части: одна — выбор коммитов, а другая — как это сделать, поскольку существует множество стратегий упрощения истории.
Следующие параметры выбирают коммиты для отображения:
Обратите внимание, что для получения осмысленной истории могут отображаться дополнительные коммиты.
Следующие параметры влияют на способ выполнения упрощения:
- Режим по умолчанию
-
Упрощает историю до простейшей истории, объясняющей конечное состояние дерева. Простейшей, потому что она отсекает некоторые побочные ветки, если конечный результат одинаков (т.е. слияние веток с одинаковым содержимым)
-
--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 (подлежат упрощению).
Упорядочивание коммитов
По умолчанию коммиты отображаются в обратном хронологическом порядке.
-
--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.
-
--no-walk[=(sorted|unsorted)] -
Показывать только заданные коммиты, но не обходить их предков. Это не имеет эффекта, если указан диапазон. Если указан аргумент
unsorted, коммиты показываются в том порядке, в котором они были заданы в командной строке. В противном случае (если указанsortedили аргумент не указан) коммиты показываются в обратном хронологическом порядке по времени коммита. Нельзя комбинировать с--graph. -
--do-walk -
Переопределяет предыдущий
--no-walk.
Форматирование коммитов
-
--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). -
--notes[=<ссылка>] -
Показывать заметки (см. git-notes[1]), которые аннотируют коммит, при показе сообщения журнала коммита. Это значение по умолчанию для команд
gitlog,gitshowиgitwhatchanged, когда в командной строке не указаны параметры--pretty,--formatили--oneline.По умолчанию показываемые заметки берутся из ссылок на заметки, перечисленных в переменных
core.notesRefиnotes.displayRef(или соответствующих переопределениях среды). Дополнительные сведения см. в git-config[1].С необязательным аргументом <ссылка> использует ссылку для поиска заметок для отображения. Ссылка может указывать полное имя ссылки, когда она начинается с
refs/notes/; когда она начинается сnotes/, добавляетсяrefs/, иначеrefs/notes/добавляется в начало для формирования полного имени ссылки.Несколько параметров
--notesможно комбинировать для управления тем, какие заметки отображаются. Примеры: "--notes=foo" покажет только заметки изrefs/notes/foo; "--notes=foo--notes" покажет заметки как из "refs/notes/foo", так и из ссылок на заметки по умолчанию. -
--no-notes -
Не показывать заметки. Это отменяет действие вышеуказанного параметра
--notesпутём сброса списка ссылок на заметки, из которых показываются заметки. Параметры анализируются в порядке, указанном в командной строке, поэтому, например, "--notes--notes=foo--no-notes--notes=bar" покажет только заметки изrefs/notes/bar. -
--show-notes-by-default -
Показывать заметки по умолчанию, если не указаны параметры для отображения конкретных заметок.
-
--show-notes[=<ссылка>] -
--standard-notes -
--no-standard-notes -
Эти параметры устарели. Вместо них используйте вышеуказанные параметры
--notes/--no-notes. -
--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. -
-
--parents -
Выводит также родителей коммита (в форме «commit parent…»). Также включает перезапись родителей; см. «Упрощение истории» выше.
-
--children -
Выводит также потомков коммита (в форме «commit child…»). Также включает перезапись родителей; см. «Упрощение истории» выше.
-
--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не используется, все ветки истории сглаживаются, что может затруднить понимание того, что два последовательных коммита не принадлежат линейной ветке. В этом случае этот параметр помещает между ними барьер. Если указан <барьер>, это строка, которая будет показана вместо строки по умолчанию.
СТРУКТУРИРОВАННЫЕ ФОРМАТЫ
Если коммит является слиянием и структурированный формат не является 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 -
сырое тело (без дополнительных переносов строк в заголовке коммита и его теле)
-
%N -
заметки к коммиту
-
%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 log не создаёт никакого вывода сравнения. Следующие параметры можно использовать для отображения изменений, внесённых каждым коммитом.
Обратите внимание, что если явно не указан один из вариантов --diff-merges (включая краткие параметры -m, -c, --cc и --dd), коммиты слияния не будут показывать сравнение, даже если выбран такой формат сравнения, как --patch, и они не будут соответствовать параметрам поиска, таким как -S. Исключение составляет случай, когда используется --first-parent, в этом случае first-parent является форматом по умолчанию для коммитов слияния.
-
-p -
-u -
--patch -
Сгенерировать патч (см. Создание патчей с помощью -p).
-
-s -
--no-patch -
Подавлять весь вывод от утилиты сравнения (включая в частности собственно список изменений). Полезно для команд, вроде
gitshow, чтобы подавить вывод патча, который иначе показывается по умолчанию; или чтобы отменить эффект таких параметров, как--patch, или--stat, указанных ранее в командной строке (например для команды сокращения (alias)). -
-m -
Показывать список изменений для коммитов слияния в формате по умолчанию. Этот параметр похож на
--diff-merges=on, за исключением того, что с-mне будет собственно выводить патч, если с ним вместе не указан также и параметр-p. -
-c -
Выводить список изменений для коммитов слияния в комбинированном формате. Краткая версия для
--diff-merges=combined-p. -
--cc -
Выводить список изменений для коммитов слияния в уплотнённом комбинированном формате. Краткая версия для
--diff-merges=dense-combined-p. -
--dd -
И для обычных коммитов и для коммитов слияния выводить список изменений относительно только первого родителя. Краткая версия для
--diff-merges=first-parent-p. -
--remerge-diff -
Выводить список изменений для коммитов слияния результата относительно переслитого коммита. Краткая версия для
--diff-merges=remerge-p. -
--no-diff-merges -
Синоним для
--diff-merges=off. -
--diff-merges=<формат> -
Задаёт формат diff, который будет использоваться для коммитов слияния. По умолчанию используется `off`, если только не задан параметр
--first-parent, в таком случае по умолчанию используетсяfirst-parent.Поддерживаются следующие форматы:
-
off -
none -
Отключать вывод списков изменений для коммитов слияния. Полезно если параметр
--diff-merges=<формат> подразумевается другим параметром. -
on -
m -
Выводить список изменений для коммитов слияния в формате по умолчанию. Формат по умолчанию можно изменить с помощью переменной конфигурации
log.diffMerges; её значение по умолчанию:separate. -
first-parent -
1 -
Показывать полный список изменений относительно первого родителя. Этот формат такой же, как тот что выводит
--patchдля коммитов не являющихся коммитами слияния. -
separate -
Показывать полный список изменений относительно каждого из родителей. Отдельные списки изменений с их сообщениями коммитов создаются для каждого родителя.
-
combined -
c -
Показывать отличия каждого из родителей от результата слияния одновременно, а не отдельные попарные списки изменений между каждым родителем и результатом. Кроме того, будут показаны только те файлы, которые отличаются от всех своих родителей.
-
dense-combined -
cc -
Ещё сильнее уплотнить вывод, получаемый с ключом
--diff-merges=combined, пропуская неинтересные блоки, для которых в родительских коммитах есть только две версии, а результат слияния просто выбирает одну из них, не изменяя её. -
remerge -
r -
Заново слить коммиты слияния, у которых ровно два родителя, чтобы создать временный объект-дерево — потенциально содержащий файлы с маркерами конфликтов и т. п., а затем показать разницу между этим временным деревом и фактическим коммитом слияния.
Вывод при использовании этого параметра, может быть изменён, также как и его взаимодействие с другими параметрами (если иное не документировано явно).
-
-
--combined-all-paths -
Для комбинированных списков изменений (те которые используются для коммитов слияния) перечислять имена файла изо всех родителей. Это имеет эффект только при использовании совместно с
--diff-merges=[dense-]combinedи, вероятно, полезно только если будут обнаружены изменения имён файлов (т.е. когда включено обнаружение переименований или копирований). -
-U<n> -
--unified=<n> -
Создавать сравнения с <число> строками контекста. Количество строк контекста по умолчанию равно
diff.contextили 3, если переменная конфигурации не установлена. (-Uбез <числа> молча принимается как синоним-pиз-за исторической случайности). Подразумевает--patch. -
--output=<файл> -
Выводить в указанный файл вместо стандартного вывода.
-
--output-indicator-new=<символ> -
--output-indicator-old=<символ> -
--output-indicator-context=<символ> -
Задаёт символ, используемый для обозначения новых, старых или контекстных строк в сгенерированном патче. Обычно это
+,-и ` ` соответственно. -
--raw -
Для каждого коммита показывать сводку изменений, используя сырой формат. См. раздел «СЫРОЙ ФОРМАТ ВЫВОДА» в git-diff[1]. Это не то же самое, что вывод журнала в сыром формате, который используется при передаче параметра
--format=raw. -
--patch-with-raw -
Синоним для
-p--raw. -
-t -
Показывать объекты дерева при выводе списка изменений.
-
--indent-heuristic -
Применять эвристику, которая сдвигает границы блоков списков изменений, дабы сделать патчи более удобными для чтения. Это поведение включено по умолчанию.
-
--no-indent-heuristic -
Не применять эвристику сдвига границ блоков.
-
--minimal -
Потратить дополнительное время, чтобы гарантировать, что будет сгенерирован минимально возможный список изменений.
-
--patience -
Генерировать списки изменений с помощью «терпеливого» алгоритма (patience diff).
-
--histogram -
Генерировать списки изменений с помощью «гистограммного» алгоритма (histogram diff).
-
--anchored=<текст> -
Генерировать списки изменений с помощью алгоритма поиска различий «с якорем» (anchored diff).
Этот параметр может быть указана несколько раз.
Если строка существует как в источнике, так и в назначении, встречается только один раз и начинается с <текста>, этот алгоритм пытается не допустить, чтобы эта строка была обозначена в выводе как удаляемая или добавляемая. Для собственно поиска отличий используется «терпеливый» алгоритм.
-
--diff-algorithm=(patience|minimal|histogram|myers) -
Выберите алгоритм для получения списка изменений. Доступны следующие варианты:
-
default -
myers -
Базовый жадный алгоритм, используемый в стандартной утилите сравнения (
diff). В настоящее время это значение по умолчанию. -
minimal -
Потратить дополнительное время, чтобы гарантировать, что будет сгенерирован минимально возможный список изменений.
-
patience -
Используйте «терпеливый» алгоритм сравнения (patience diff) для генерации патчей.
-
histogram -
Этот алгоритм расширяет «терпеливый» алгоритм так, что он «поддерживает общие элементы с низкой частотой встречаемости».
В частности, если вы настроили переменную
diff.algorithmна нестандартное значение и хотите использовать стандартный алгоритм, то следует задать параметр--diff-algorithm=default. -
-
--stat[=<ширина>[,<ширина-имени>[,<число>]]] -
Генерировать статистику изменений diffstat. По умолчанию для имени файла используется столько места, сколько необходимо, а остаток — для графика. Максимальная <ширина> по умолчанию равна ширине терминала или 80 столбцам, если вывод производится не на терминал. Ширину части, отводящейся под имя файла, можно ограничить, указав <ширину-имени> после запятой или установив переменную конфигурации
diff.statNameWidth=<ширина-имени>. Ширина части, отводящейся под график также можно ограничить с помощью--stat-graph-width=<ширина-графика> или переменной конфигурацииdiff.statGraphWidth=<ширина-графика>. Все команды, генерирующие статистические графики принимают параметры--statили--stat-graph-width, а установка переменныхdiff.statNameWidthилиdiff.statGraphWidthвлияет на все команды кромеgitformat-patch. При указании третьей части аргумента вывод ограничивается указанным <числом> строк, а при его превышении вместо оставшихся строк будет выведено ....Эти параметры также могут быть установлены в индивидуальном порядке с помощью
--stat-width=<ширина>,--stat-name-width=<ширина-имени> и--stat-count=<число>. -
--compact-summary -
Выводить в статистике diffstat краткую выжимку информации, содержащейся в расширенном заголовке, в частности, был ли файл создан или удалён («new» или «gone», и возможно с «
+l», если это символическая ссылка) и был ли изменён режим доступа к нему (+xили-xдля добавления или удаления исполняемого бита соответственно). Эта информация помещается между имени файла и графиком. Подразумевает--stat. -
--numstat -
Аналогичен
--stat, но показывает количество добавленных и удалённых строк в десятичном формате и полный путь к файлу без сокращения, что делает его более удобным для машинной обработки. Для бинарных файлов выводит две чёрточки-вместо00. -
--shortstat -
Выводить только последнюю строку, выводимую
--stat, содержащую общее количество изменённых файлов, а также количество добавленных и удалённых строк. -
-X[<аргумент>,...] -
--dirstat[=<аргумент>,...] -
Вывести распределение относительного количества изменений для каждого подкаталога (т.е. какой процент от общего числа изменений приходится на каждый конкретный каталог). Поведение
--dirstatможно модифицировать, передавая ему список аргументов, разделённых запятыми. Аргументы по умолчанию контролируются переменной конфигурации diff.dirstat (см. git-config[1]). Доступные аргументы:-
changes -
Подсчитывать количество строк, которые были удалены или добавлены. Этот алгоритм игнорирует чистые перемещения кода внутри файла. Другими словами, строки перемещённые внутри файла без изменений не учитываются в отличии от других правок. Это поведение по умолчанию, когда аргумент не указан.
-
lines -
Подсчитывает количество строк с использованием обычного алгоритма поиска изменений, основываясь на строках и суммируя количество удалённых/добавленных строк. (Для бинарных файлов подсчитываются 64-байтовые блоки, так как у них нет естественного понятия «строк»). Это более затратный алгоритм работы
--dirstat, чемchanges, но он учитывает переставленные строки внутри файла так же, как и другие изменения. Вывод с этим алгоритмом лучше согласуется с теми данными, которые вы получаете от других параметров--*stat. -
files -
Подсчитывает количество изменённых файлов. При анализе каждый изменённый файл учитывается в равной степени. Это наиболее экономичный алгоритм
--dirstat, так как он не требует просмотра содержимого файлов. -
cumulative -
Для родительского каталога также учитывает изменения в дочерних подкаталогах. Обратите внимание, что при использовании
cumulativeсумма процентов может превышать 100%. Поведение по умолчанию (некумулятивное) можно задать с помощью аргументаnoncumulative. - <предел>
-
При использовании целочисленного значения в качестве аргумента, оно задаёт пороговое значение (по умолчанию 3%). Каталоги, изменения в которых составляют меньшую часть от общего числа изменений, чем указанный процент, не отображаются в выводе.
Пример: Следующая команда будет подсчитывать какую долю составляют файлы, которые были изменены в каждом конкретном каталоге, при этом игнорируя каталоги, на которые приходится менее 10% изменённых файлов и считая изменения в дочерних каталогов, как часть изменений в родительских:
--dirstat=files,10,cumulative. -
-
--cumulative -
Синоним для
--dirstat=cumulative. -
--dirstat-by-file[=<аргумент>,...] -
Синоним для
--dirstat=files,<аргумент>,.... -
--summary -
Вывести краткую сводку из информации, содержащейся в расширенных заголовках списков изменений. В частности, информацию о создании, переименовании и изменении режима доступа к файлу.
-
--patch-with-stat -
Синоним для
-p--stat. -
-z -
Разделять коммиты NUL-символами вместо переводов строк.
Также, когда заданы параметры
--rawили--numstat, не вносить ни какие изменения в пути файлов и использовать NUL-символ в качестве разделителя полей вывода.Без данного параметра пути с «необычными» символами берутся в кавычки, как это описано для переменной конфигурации
core.quotePath(см. git-config[1]). -
--name-only -
Выводить только имена изменённых файлов в результирующем дереве. Имена файлов обычно используют кодировку UTF-8. Для более подробной информации о кодировках см. обсуждение на справочной странице git-log[1].
-
--name-status -
Показывать только имя/имена и статус каждого изменённого файла. См., что означают буквы статуса, в описании параметра
--diff-filter. Как и для--name-only, имена файлов обычно используют кодировку UTF-8. -
--submodule[=<формат>] -
Задаёт, как должны отображаться различия в подмодулях. При указании
--submodule=short, используется форматshort. Этот формат показывает только имена коммитов в начале и конце диапазона. При указании--submoduleили--submodule=logиспользуется форматlog. Этот формат перечисляет все коммиты в диапазоне, как это делает git-submodule[1]summary. При указании--submodule=diffиспользуется форматdiff. Этот формат показывает различия в содержимом подмодуля между началом и концом диапазона в виде списка изменений, встроенного в основной. По умолчанию используется формат указанный в переменной конфигурацииdiff.submoduleилиshort, если переменная не установлена. -
--color[=<когда>] -
Выводить список изменений в цвете.
--color(т.е. без аргумента=<когда>) эквивалентно--color=always. <когда> может быть одним из:always,neverилиauto. -
--no-color -
Отключить выделение цветом при выводе списка изменений. Эквивалентно
--color=never. -
--color-moved[=<режим>] -
Перемещённые строки кода выделяются другим цветом. Если параметр не задан, то <режим> по умолчанию:
no; если задан, но без явного указания <режима> — тоzebra. Значение <режима> может быть одним из:-
no -
Перемещённые строки ни как не выделяются.
-
default -
Синоним для
zebra. В будущем это может измениться, если появится режим получше. -
plain -
Любая строка, добавленная в одном месте и удалённая в другом, будет окрашена с помощью
color.diff.newMoved. Аналогичноcolor.diff.oldMovedбудет использоваться для удалённых строк, которые добавлены в каком-то другом месте. Этот режим подсвечивает все перемещённые строки, но при рецензировании кода знать был ли блок перемещён и при этом без какой-либо информации о перестановках не так уж и полезно. -
blocks -
Для поиска блоков перемещённого текста (из не мене чем 20-и алфавитно-цифровых символов) используется жадный алгоритм. Найденные блоки окрашиваются с помощью
color.diff.(old|new)Moved. Возможности различить смежные блоки нет. -
zebra -
Поиск блоков перемещённого текста происходит так же, как и в режиме
blocks. Блоки окрашиваются с помощьюcolor.diff.(old|new)Movedилиcolor.diff.(old|new)MovedAlternative. Изменение цвета с одного на другой указывает на то, что был найден новый блок. -
dimmed-zebra -
Аналогично
zebra, но также выполняется дополнительное затемнение «неинтересных» частей перемещённого кода. Интересными считаются пограничные строки двух соседних блоков, остальное — неинтересным.dimmed_zebra— устаревший синоним.
-
-
--no-color-moved -
Отключить поиск перемещений. Этот параметр можно использовать для переопределения настроек, заданных переменными конфигурации. Эквивалентно
--color-moved=no. -
--color-moved-ws=<режим>,... -
Задаёт должны ли игнорироваться пробелы при поиске перемещений для
--color-moved. Следующие режимы могут быть указаны через запятую:-
no -
Не игнорировать пробелы при поиске перемещений.
-
ignore-space-at-eol -
Игнорировать изменения пробелов на концах строк.
-
ignore-space-change -
Игнорировать изменения количества пробелов. Этот режим игнорирует пробелы на концах строк и считает все остальные последовательности одного или более пробельных символов эквивалентными.
-
ignore-all-space -
Игнорировать все пробелы при сравнении строк. Это игнорирует различия даже если в одной строке пробелы есть там, где в другой их нет.
-
allow-indentation-change -
Сначала игнорировать любые пробелы при обнаружении перемещений, а затем группировать перемещённые блоки кода в один только, если изменение пробелов одинаково для каждой строки блока. Этот режим несовместим с остальными.
-
-
--no-color-moved-ws -
Не игнорировать пробелы при поиске перемещений. Этот параметр можно использовать для переопределения настроек, заданных переменными конфигурации. Эквивалентно
--color-moved-ws=no. -
--word-diff[=<режим>] -
По умолчанию слова разделены пробелами; см.
--word-diff-regexниже. Аргумент <режим> по умолчанию равенplain, и должен быть одним из:-
color -
Выделять изменённые слова только цветом. Подразумевает
--color. -
plain -
Отображать слова как [-удалено-] и {добавлено}. Этот нежим не пытается экранировать разделители, если они появляются во входных данных, поэтому вывод может быть неоднозначным.
-
porcelain -
Использовать специальный построчный формат, предназначенный для программной обработки сценариями. Добавленные/удалённые/неизменённые участки строк исходных документах выводятся в виде обычного унифицированного списка изменений: каждый участок записывается на отдельной строке, начинающейся, соответственно, с символов
+/-/` ` и продолжается до конца строки. А собственно переводы строк во входных данных представляются в виде тильды~на отдельной строке. -
none -
Отключить сравнение слов; снова.
Обратите внимание, что несмотря на название первого режима, цвет используется для выделения изменённых частей во всех режимах, если он включён.
-
-
--word-diff-regex=<регулярное-выражение> -
Использовать <регулярное_выражение> для определения того, что является словом, вместо того, чтобы считать словом любую последовательность непробельных символов. Также подразумевает параметр
--word-diff, если он не было указан до этого.Каждая подстрока, не перекрывающаяся с другими и сопоставленная <регулярному_выражению> считается словом. Всё, что находится между ними, считается пробелами и игнорируется(!) при поиске различий. Возможно, вам понадобиться добавить |[
^[:space:]] к вашему регулярному выражению, чтобы быть уверенным, что оно будет сопоставлено с любой непробельным символом. Сопоставленная подстрока, содержащая перевод строки, по-тихому обрезается(!) на символе перевода строки.Например,
--word-diff-regex=.будет обращаться с каждым символом как со словом и, соответственно, показывать различия символ к символу.Это регулярное выражение также можно задать через драйвер пользовательской утилиты сравнения или переменные конфигурации; см. gitattributes[5] или git-config[1]. Явное указание этого параметра переопределяет любое значение, заданное в драйвере или переменной конфигурации. Кроме того, драйверы переопределяют значения, заданные в переменных конфигурации.
-
--color-words[=<регулярное-выражение>] -
Эквивалентно
--word-diff=colorплюс (если указано регулярное выражение)--word-diff-regex=<регулярное_выражение>. -
--no-renames -
Отключить обнаружение переименований, даже если в файле конфигурации оно включено по умолчанию.
-
--rename-empty -
--no-rename-empty -
Определяет, рассматривать ли пустые бинарные объекты, как возможные источники переименований.
-
--check -
Предупреждать, если изменения включают маркеры конфликтов или ошибки расстановки пробелов. Что именно считается ошибками расстановки пробелов, настраивается с помощью переменной конфигурации
core.whitespace. По умолчанию такими ошибками считаются пробелы в конце строк (включая строки, состоящие только из пробелов), а также пробел внутри начального отступа строки, непосредственно за котором следует табуляция. Программа завершится с ненулевым статусом, если такие проблемы будут обнаружены. Не совместимо с--exit-code. -
--ws-error-highlight=<тип> -
Выделять цветом ошибки расстановки пробелов в строках
context(контекстных),old(старых) илиnew(новых) в списке изменений. Допустимо несколько значений, разделённых запятой;noneсбрасывает предыдущие значения,defaultсбрасывает список доnew, аall— это сокращение дляold,new,context. Если этот параметр не указан, и переменная конфигурацииdiff.wsErrorHighlightне установлена, то ошибки расстановки пробелов будут выделятся только в новых строках. Для выделения используется цвет, указанный в переменной конфигурацииcolor.diff.whitespace. -
--full-index -
Вместо первых нескольких символов показывать полные имена blob-объектов в строке «index» при выводе патча.
-
--binary -
Выводить список изменений в бинарных файлах, который может быть применён с помощью
git-apply. Также подразумевает--full-index. Подразумевает--patch. -
--abbrev[=<n>] -
Вместо вывода полных 40-байтовых шестнадцатеричных имён объектов в списках изменений в сыром формате, а также в строках заголовков diff-tree, выводить их минимальный префикс, который имеет как минимум <n> шестнадцатеричных цифр и уникально идентифицирует объект. Однако, при выводе списка изменений в виде патча параметр
--full-indexимеет приоритет, т.е. если задан параметр--full-index, будут выведены полные имена блоков, независимо от того, задан ли--abbrev. Количество выводимых цифр отличное от значения по умолчанию можно задать с помощью--abbrev=<n>. -
-B[<n>][/<m>] -
--break-rewrites[=[<n>][/<m>]] -
Разбивать изменения, которые полностью переписывают файл на пары удаления и создания. Этот параметр служит двум целям:
Влияет на то, как правка, которая по сути представляет собой полное переписывание файла, отображается в списке изменений не как серия удалений и вставок, смешанных с несколькими строками «контекста», которые оказались таковыми лишь по случайному стечению обстоятельств, а как одно единое удаление старого файла целиком, за которым следует создание нового файла. Число <m>(по умолчанию 60%) в аргументе параметра
-Bзадаёт, какая часть файла должна быть изменена, чтобы он считался полностью переписанным. Например,-B/70%указывает, что, чтобы Git считал файл полностью переписанным, в нём должно оставаться нетронутым менее 30% исходного содержимого (т.е. в случае, если нетронутыми будут больше 30% объёма файла, полученный патч будет серией удалений и вставок, смешанных с контекстными строками, как при обычном выводе).При использовании совместно с
-M, полностью переписанный файл также рассматривается как возможный источник переименований (обычно-Mрассматривает в качестве таковых только файлы, которые были удалены). Число <n>(по умолчанию 50%) в аргументе параметра-Bзадаёт, какая часть файла должна быть изменена, чтобы он рассматривался как возможный источник переименований. Например, при указании-B20%для того, чтобы файл рассматривался в качестве такового, изменения в нём (включая добавления и удаления строк) должны составлять более 20% файла. -
-M[<n>] -
--find-renames[=<n>] -
При генерации списка изменений, обнаруживать переименования и сообщать о них для каждого коммита. Для того чтобы прослеживать файлы через их переименования во время обхода истории см. параметр
--follow. Если указан аргумент <n>, то это значение является пороговым коэффициентом сходства (т.е. количеством добавлений/удалений по отношению к размеру файла). Например,-M90%означает, что Git должен считать пару файлов удалённый/добавленый переименованием, если более 90% файла не изменилось. Без знака процента%это число рассматривается как дробная часть десятичной дроби (т.е. с нулём и десятичной точкой перед числом). Так например,-M5рассматривается «0.5» и таким образом эквивалентно-M50%. Аналогично,-M05эквивалентно-M5%. Чтобы ограничиться обнаружением только переименований без изменений, используйте-M100%. По умолчанию коэффициент сходства равен 50%. -
-C[<n>] -
--find-copies[=<n>] -
Обнаруживать копии наряду с переименованиями. См. также
--find-copies-harder. Аргумент <n>, если указан, имеет то же значение, что и в-M<n>. -
--find-copies-harder -
По соображениям производительности, по умолчанию параметр
-Cрассматривает в качестве исходных файлов копий только те файлы, которые были изменены в том же наборе изменений. Этот флаг заставляет команду рассматривать в качестве кандидатов на роль источника копии также и неизмененные файлы. Для больших проектов это очень дорогая операция, поэтому используйте её с осторожностью. Передача параметра-Cболее одного раза имеет тот же эффект. -
-D -
--irreversible-delete -
Опускать исходное содержимое файла при его удалении, т.е. выводить только заголовок, но не «различия» между удаляемым файлом и
/dev/null. Полученный патч не предназначен для применения с помощьюpatchилиgitapply, а исключительно для тех людей, кто хочет сосредоточиться на рецензировании или просмотре различий после внесения изменений. Кроме того, с таким патчем, очевидно, не будет возможности обратить изменения, даже вручную; отсюда и название параметра: «irreversible» — необратимый.При использовании совместно с
-B, опускается также и содержимое удаляемой части в паре «удаление/создание». -
-l<число> -
Выполнение поиска для параметров
-Mи-Cпроисходит в два этапа: сначала производится некоторый предварительные шаги, которые позволяют дёшево обнаружить лишь часть переименований/копирований, а затем следует исчерпывающая часть поиска, на которой все оставшиеся назначения для которых не было найдено пары сравниваются со всеми подходящими для них источниками. (Для переименований подходящими считаются только те источники, которым ещё не были найдены пары; для копирований — все исходные источники.) Для N возможных файлов источников и назначений эта исчерпывающая проверка имеет сложность O(N^2). Данный параметр предотвращает запуск исчерпывающей части поиск переименований/копирований, если количество файлов источников/назначений превышает указанное <число> (по умолчанию:diff.renameLimit). Обратите внимание, что значение0означает, что это количество файлов неограниченно. -
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]] -
Выбирать только файлы, которые были добавлены (
A, Added), скопированы (C, Copied), удалены (D, Deleted), изменены (M, Modified), переименованы (R, Renamed), чей тип (т.е. обычный файл, символическая ссылка, подмодуль, …) был изменён (T, Type), не слиты (U, Unmerged), неизвестны (X) или имеют сломанную связь (B, Broken). Может быть задано любое подмножество символов фильтра (включая пустое). При добавлении*(всё или ничего) к аргументам, то или выбираются все пути, если существует хотя бы один файл, соответствующий остальным критериям, или ничего, если такого файла нет.Также если вместо этих прописных букв задать их строчные версии, то соответствующие этому критерию файлы будут наоборот исключены. Например,
--diff-filter=adисключает добавленные и удалённые пути.Обратите внимание, что не все списки изменений могут обеспечить доступ ко всем типам изменений. В частности, записи о переименованиях и копированиях не будут доступны, если обнаружение для этих типов не было включено.
-
-S<строка> -
Искать различия, которые изменяют количество вхождений указанной <строки> в файле (т.е. её добавления/удаления, но не изменения/перемещения). Предназначено для использования в скриптах.
Это полезно, если вы ищете точный блок кода (например, структуру), и хотите знать историю этого блока с момента его появления: вызывайте эту функцию последовательно несколько раз, передавая полученный на очередном шаге интересующий вас блок обратно в
-S, и продолжайте так до тех пор, пока не получите самую первую версию этого блока.Поиск происходит также и в бинарных файлах.
-
-G<регулярное-выражение> -
Искать списки изменений, текст патча которых содержит добавление/удаление строк, соответствующих <регулярному_выражению>.
Чтобы проиллюстрировать разницу между
-S<регулярное_выражение>--pickaxe-regexи-G<регулярное_выражение>, рассмотрим коммит со следующими различиями в одном и том же файле:+ return frotz(nitfol, two->ptr, 1, 0); ... - hit = frotz(nitfol, mf2.ptr, 1, 0);
В то время как команда git log -G"frotznitfol"` выведет этот коммит, `git log -S"frotznitfol" --pickaxe-regex — не выведет (потому что количество вхождений этой строки не изменилось).
Если не указан параметр
--textи для данного типа файлов нет фильтра textconv, изменения вносимые патчами в бинарные файлы будут проигнорированы.См. раздел pickaxe в gitdiffcore[7] для более подробной информации.
-
--find-object=<id-объекта> -
Искать различия, которые меняют количество вхождений указанного объекта. Аналогично
-S, но в качестве аргумента вместо конкретной строки для поиска передаётся идентификатор конкретного объекта.Объект может быть blob-объектом или коммитом в подмодуле. Этот параметр также подразумевает
-tвgit-log, для поиска деревьев. -
--pickaxe-all -
Когда поиске с помощью параметров
-Sили-Gнаходит изменения, показывать все изменения в данном наборе, а не только в тех файлах, которые содержат изменения в заданной <строке>. -
--pickaxe-regex -
Обрабатывать <строку>, переданную в
-S, как расширенное регулярное выражение POSIX с котором должно производится сопоставление. -
-O<файл-порядка> -
Контролирует порядок, в котором файлы появляются в выводе. Этот параметр переопределяет значение указанное в переменной конфигурации
diff.orderFile(см. git-config[1]). Чтобы отменить использование файла указанного вdiff.orderFile, используйте-O/dev/null.Порядок вывода определяется порядком glob-шаблонов в <файле-порядка>. Первыми выводятся все файлы, пути которых соответствуют первому шаблону, затем файлы, соответствующие второму шаблону (но не первому), и так далее. Все файлы, которые не соответствуют ни одному из шаблонов, выводятся в конце, как если бы в конце файла был неявно задан шаблон, который сопоставляется всем путям. Пути одного ранка (которые соответствуют какому-либо одному шаблону, но не одному из предыдущих) относительно друг друга выводятся в нормальном порядке.
Синтаксис <файла-порядка> следующий:
-
Пустые строки игнорируются, так что их можно использовать для улучшения читаемости.
-
Строки, начинающиеся с символа решётки («
#»), игнорируются, их можно использовать для комментариев. Если шаблон начинается с решётки, добавьте обратный слэш («\») перед ней. -
Все остальные строки являются шаблонами; по одному на строку.
Синтаксис и семантика у этих шаблонов те же, что и у шаблонов, используемых для
fnmatch(3) без флагаFNM_PATHNAME, за исключением того, что путь к файлу также сопоставляются шаблону; при этом в качестве пути к файлу сопоставляется путь к его родительскому каталогу любого уровня. Например, шаблону «foo*bar» будет соответствовать какfooasdfbar, так и «foo/bar/baz/asdf», но не «foobarx». -
-
--skip-to=<файл> -
--rotate-to=<файл> -
Пропускать в выводе файлы до указанного <файла> (со
--skip-to), или вывести их в конец (с--rotate-to). Эти параметры были добавлены в первую очередь для использования в командеgitdifftoolи, вероятно, от них будет не так много пользы в других командах. -
-R -
Поменять местами два входных файла; т.е. показывать, какие изменения произошли бы при переходя от версии файла в индексе или на диске к той, что содержится в дереве коммита.
-
--relative[=<путь>] -
--no-relative -
При запуске из одного из подкаталогов проекта этот параметр позволяет исключить изменения за пределами этого каталога и отображать пути относительно него. Если вы не находитесь в каком-либо подкаталоге (например, в голом репозитории), можно указать подкаталог, относительно которого будет производиться вывод, передав <путь> в качестве аргумента. Параметр
--no-relativeможно использовать как для отмены эффекта от переменной конфигурацииdiff.relative, так и предшествующего параметра--relative. -
-a -
--text -
Обрабатывать все файлы как текстовые.
-
--ignore-cr-at-eol -
Игнорировать символы возврата каретки в конце строк при сравнении.
-
--ignore-space-at-eol -
Игнорировать изменения пробелов на концах строк.
-
-b -
--ignore-space-change -
Игнорировать изменения количества пробелов. Этот режим игнорирует пробелы на концах строк и считает все остальные последовательности одного или более пробельных символов эквивалентными.
-
-w -
--ignore-all-space -
Игнорировать все пробелы при сравнении строк. Это игнорирует различия даже если в одной строке пробелы есть там, где в другой их нет.
-
--ignore-blank-lines -
Игнорировать изменения, в которых все строки пустые.
-
-I<регулярное-выражение> -
--ignore-matching-lines=<регулярное-выражение> -
Игнорировать изменения, в которых все строки сопоставляются <регулярному-выражению>. Этот параметр может быть указан несколько раз.
-
--inter-hunk-context=<число> -
Выводить в качестве контекста между блоками изменений до <n> строк, тем самым объединяя близкие блоки изменений. По умолчанию равно значению переменной конфигурации
diff.interHunkContextили 0, если она не установлена. -
-W -
--function-context -
Показывать всю функцию в качестве контекста для каждого изменения. Для определения имён функций используется тот же механизм, что и для определения заголовков блоков изменений командой
gitdiff(см. «Определение пользовательского заголовка блока» в gitattributes[5]). -
--ext-diff -
Разрешить выполнение вспомогательных сторонних утилит сравнения. Если вы настроили драйвер сторонней утилиты сравнения с помощью gitattributes[5], то вам нужно будет использовать этот параметр с командой git-log[1] и другими подобными.
-
--no-ext-diff -
Запретить драйверы сторонних утилит сравнения.
-
--textconv -
--no-textconv -
Разрешить (или запретить) преобразование бинарных файлов в текст с помощью внешних фильтров при их сравнении. См. подробности в gitattributes[5]. Полученный вывод подходит для восприятия человеком, но поскольку фильтры
textconvобычно представляют из себя одностороннее преобразование, полученный патч нельзя будет применить. По этой причине фильтрыtextconvпо умолчанию включены только для git-diff[1] и git-log[1], но не для git-format-patch[1] или низкоуровневых команд сравнения. -
--ignore-submodules[=(none|untracked|dirty|all)] -
Игнорировать изменения в подмодулях при создании вывода. Значением по умолчанию является
all. При использовании значенияnoneбудет считаться, что подмодуль изменён, если он содержит неотслеживаемые или изменённые файлы или если егоHEADотличается от коммита, зафиксированного в надпроекте и может быть использовано для переопределения любых переменных конфигурации сignoreв git-config[1] или gitmodules[5]. При использованииuntrackedподмодули не считаются грязными только из-за того, что они содержат неотслеживаемые файлы (но они всё равно проверяются на наличие изменений в содержимом). При использованииdirtyигнорируются все изменения в рабочих каталогах подмодулей и показываются только изменения коммитов, хранящихся в надпроекте (таким было поведение до версии 1.7.0). При использованииallвсе изменения в подмодулях скрываются. -
--src-prefix=<префикс> -
Использовать указанный <префикс> для источника вместо «a/».
-
--dst-prefix=<префикс> -
Использовать указанный <префикс> для назначения вместо «b/».
-
--no-prefix -
Не выводить ни префикс источника, ни назначения.
-
--default-prefix -
Использовать стандартные префиксы источника и назначения ("a/" и "b/"). Это переопределяет такие переменные конфигурации, как
diff.noprefix,diff.srcPrefix,diff.dstPrefixиdiff.mnemonicPrefix(см. git-config[1]). -
--line-prefix=<префикс> -
Добавить дополнительный <префикс> к каждой строке вывода.
-
--ita-invisible-in-index -
По умолчанию записи, добавленные командой
gitadd-N, отображаются в выводеgitdiffкак существующий пустой файл, а в выводе git diff --cached` — как новый файл. Этот параметр делает так, что такие записи отображаются как новый файл в выводеgitdiffи отсутствовать в выводеgitdiff--cached. Этот параметр может быть переопределён с помощью--ita-visible-in-index. Оба эти параметра являются экспериментальными и могут быть удалены в будущем. - --max-depth=<глубина>
-
Для каждого заданного в командной строке спецификатора пути спускаться не более чем на указанную <глубину> по дереву каталогов. Значение
-1означает «без ограничений». Нельзя использовать, если в спецификаторах пути есть символы-джокеры. Так для дерева, содержащегоfoo/bar/baz, каждый из вариантов аргумента даст следующий результат:-
--max-depth=0--foo:foo -
--max-depth=1--foo:foo/bar -
--max-depth=1--foo/bar:foo/bar/baz -
--max-depth=1--foofoo/bar:foo/bar/baz -
--max-depth=2--foo:foo/bar/baz
Если пути не указаны, глубина измеряется так, как если бы были указаны все элементы верхнего уровня. Обратите внимание, что это отличается от измерения от корня, так как
--max-depth=0всё равно вернётfoo. Это позволяет вам всё ещё ограничивать глубину, запрашивая подмножество элементов верхнего уровня.Обратите внимание, что этот параметр поддерживается только для сравнений между объектами дерева, а не с индексом или рабочим деревом.
-
См. gitdiffcore[7] для более подробного описания этих общих параметров.
Создание патчей с помощью -p
Запуск команд git-diff[1], git-log[1], git-show[1], git-diff-index[1], git-diff-tree[1], или git-diff-files[1] с параметром -p выдаёт текст патча. Вы можете изменить некоторые аспекты этого создаваемого текста с помощью переменных окружения GIT_EXTERNAL_DIFF и GIT_DIFF_OPTS (см. git[1]), а также атрибута diff (см. gitattributes[5]).
Тот текст, которые получается на выходе при запуске с параметром -p, немного отличается от традиционного формата списка изменений:
-
В начале идёт заголовок «git diff», который выглядит следующим образом:
diff --git a/файл1 b/файл2
Имена файлов
a/иb/одинаковы, если изменения не связаны с переименованием или копированием. В частности, даже для создания или удаления вместо имён файловa/илиb/не используется/dev/null.Когда же изменения являются переименование или копирование,
file1иfile2отображают имена исходного файла и того, который получается в результате переименования/копирования, соответственно. -
Далее следуют одна или несколько строк расширенного заголовка:
oldmode<режим>newmode<режим>deletedfilemode<режим>newfilemode<режим>copyfrom<путь>copyto<путь>renamefrom<путь>renameto<путь>similarityindex<число>dissimilarityindex<число>index<хеш>..<хеш> <режим>Режимы файлов `<режим>` печатаются как 6-значные восьмеричные числа, включающие тип файла и биты разрешений.
Пути в расширенных заголовках не включают префиксы
a/иb/.Индекс сходства — это процент не изменённых строк, а индекс различия — процент изменённых. Он представляет собой округлённое вниз целое число, за которым следует знак процента. Индекс сходства в 100% зарезервирован для двух абсолютно одинаковых файлов, а 100% различий означает, что ни одна строка из старого файла не вошла в новый.
Строка индекса включает имена бинарных объектов до и после изменения. Строка <режима> добавляется, если режим файла не был изменён; в противном случае старый и новый режимы приводятся в отдельных строках.
-
Путей с «необычными» символами берутся в кавычки, как это описано для переменной конфигурации
core.quotePath(см. git-config[1]). -
Все файлы файл1 в выводе относятся к файлам до коммита, а все файлы файл2 — к файлам после коммита. Неправильно было бы применять каждое изменение к каждому файлу последовательно. Например, следующий патч поменяет местами
aиb:diff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
-
Заголовки отдельных блоков изменений упоминают имя функции, к которой применяется этот блок. См. подробности, о том, как это можно адаптировать для конкретного языка программирования в разделе «Определение пользовательского заголовка блока» в gitattributes[5].
Комбинированный формат списков изменений
Любая команда, выводящая список изменений, принимает параметры -c или --cc, которые приводят к созданию списка изменений для слияний в «комбинированном» формате («combined diff»). Это формат по умолчанию при выводе слияний с помощью git-diff[1] или git-show[1]. Также обратите внимание, что для того, чтобы заставить эти команды выводить списки изменений в каком-либо другом формате, можно использовать параметр --diff-merges с соответствующими аргументами.
Комбинированный формат списков изменений выглядит следующим образом:
diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
}
- static void describe(char *arg)
-static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
{
+ unsigned char sha1[20];
+ struct commit *cmit;
struct commit_list *list;
static int initialized = 0;
struct commit_name *n;
+ if (get_sha1(arg, sha1) < 0)
+ usage(describe_usage);
+ cmit = lookup_commit_reference(sha1);
+ if (!cmit)
+ usage(describe_usage);
+
if (!initialized) {
initialized = 1;
for_each_ref(get_name);
-
В начале идёт заголовок «git diff», который выглядит следующим образом (при использовании параметра
-c):diff --combined файл
или следующим (при использовании параметра
--cc):diff --cc файл
-
Далее следуют одна или несколько строк расширенного заголовка (в данном примере показано слияние с двумя родителями):
index<хеш>,<хеш>..<хеш>mode<режим>,<режим>..<режим>newfilemode<режим>deletedfilemode<режим>,<режим>Строка
mode<режим>,<режим>..<режим> присутствует только если хотя бы один из <режимов> отличается от остальных. Расширенные заголовки с информацией о найденных перемещениях содержимого (обнаруженных переименованиях и копированиях) предназначены для работы только со списком изменений строго двух <указателей-дерева> и не используются в комбинированном формате. -
Далее следуют две строки заголовка, с указанием исходного и целевого файлов (из-файла/в-файл):
--- a/файл +++ b/файл
Аналогично тому как это делается и в традиционном формате объединённого («unified») списка изменений,
/dev/nullиспользуется для обозначения созданных или удалённых файлов.Однако, если задан параметр
--combined-all-paths, то вместо этих двух строк заголовка с из-файла/в-файл, вы получите расширенный заголовок из N+1 строки, где N — это количество родителей в коммите слияния:--- a/файл --- a/файл --- a/файл +++ b/файл
Этот расширенный формат может быть полезен, если у вас включено обнаружение переименований и копирований, так как это позволяет увидеть, как назывался файл в разных родителях до слияния.
-
Формат заголовка блока списка изменений был специально модифицирован, чтобы предотвратить случайное применение его с помощью
patch-p1. Комбинированный формат списков изменений был создан для рецензирования изменений в коммитах слияния и не предназначен для прямого применения в виде патчей. Эти модификации аналогичны тем, что были сделаны в расширенном заголовкеindex:@@@ <исходный-диапазон> <исходный-диапазон> <результирующий-диапазон> @@@
В заголовке блока для комбинированного формата (количество родителей + 1) символов
@.
В отличие традиционном объединённого («unified») формата списка изменений, который показывает разницу между двумя файлами А и Б с одной колонкой, в которой содержится или - (минус — строка есть в А, но удалена в Б), или + (плюс — нет в А, но добавлена в Б), или " " (пробел — без изменений), этот формат сравнивает два или более файла файл1, файл2,… с одним файлом Х и показывает, чем Х отличается от каждого из файлов файлN. Так что по одному столбцу для каждого из файлов файлN добавляется в начало строк вывода, чтобы дать понять, как строки в Х отличается от строк в этих файлах.
Символ - в столбце N означает, что строка была в файле файлN, но ей нет в итоговом документе. Символ + в столбце N — что строка есть в итоговом документе, но её нет в файле файлN (т.е. с точки зрения этого родителя строка была добавлена).
В примере выше сигнатура функции была изменена в обоих файлах (следовательно, в примере два удаления из каждого из файлов файл1 и файл2, кроме того ++ означает что была добавлена одна строка, которая не появляется ни в файл1, ни в файл1). Также из файла файл1 были взяты восемь других строк, которых не было в файле файл2 (так что они помечены плюсом +).
Когда этот формат выводится командой git diff-tree -c, она сравнивает родителей коммита слияния с результатом слияния (т.е. файл1..файлN — это родители). А в выводе команды git diff-files -c сравниваются файлы в двух родителях неразрешённого слияния с файлом в рабочем каталоге (т.е. файл1 — это индекс 2, или «наша версия», файл2 — это индекс 3, или «их версия»).
ПРИМЕРЫ
-
gitlog--no-merges -
Показать всю историю коммитов, но пропустить любые слияния
-
gitlogv2.6.12..include/scsidrivers/scsi -
Показать все коммиты начиная с версии v2.6.12, которые изменили любой файл в подкаталогах
include/scsiилиdrivers/scsi - git log --since="2 недели назад" -- gitk
-
Показать изменения за последние две недели в файле
gitk.--необходим, чтобы избежать путаницы с веткой с именемgitk -
gitlog--name-statusrelease..test -
Показать коммиты, которые находятся в ветке "
test", но ещё не в ветке "release", вместе со списком путей, которые изменяет каждый коммит. -
gitlog--followbuiltin/rev-list.c -
Показывает коммиты, которые изменили
builtin/rev-list.c, включая те коммиты, которые произошли до того, как файл получил своё текущее имя. -
gitlog--branches--not--remotes=origin -
Показывает все коммиты, которые находятся в любой из локальных веток, но не в отслеживаемых внешних ветках для
origin(то, что есть у вас, но чего нет в origin). -
gitlogmaster--not--remotes=*/master -
Показывает все коммиты, которые находятся в локальной ветке master, но не в ветках master ни одного внешнего репозитория.
-
gitlog-p-m--first-parent -
Показывает историю, включая различия изменений, но только с точки зрения “основной ветки”, пропуская коммиты из слитых веток и показывая полные различия изменений, внесённых слияниями. Это имеет смысл только при соблюдении строгой политики слияния всех тематических веток при нахождении на одной интеграционной ветке.
-
gitlog-L/intmain/',/^}/:main.c -
Показывает, как функция
main() в файлеmain.cразвивалась во времени. -
gitlog-3 -
Ограничивает количество показываемых коммитов до 3.
ОБСУЖДЕНИЕ
Git до некоторой степени агностичен в отношении кодировок символов.
-
Содержимое blob-объектов — простая последовательность байтов, которая ни как не интерпретируется особым образом. На уровне ядра Git ни какая перекодировка не производится.
-
Пути кодируются в UTF-8 в форме нормализации C. Это относится к объектам-деревьям, файлу индекса, именам ссылок, а также к путям в аргументах командной строки, переменных среды и файлах конфигурации (
.git/config(см. git-config[1]), gitignore[5], gitattributes[5] и gitmodules[5]).Обратите внимание, что Git на базовом уровне рассматривает имена путей просто как последовательности ненулевых байтов, ни каких перекодировок путей не происходит (за исключением Mac и Windows). Таким образом, использование путей, содержащих не-ASCII символы, будет по большей части работать даже на платформах и файловых системах, использующих устаревшие расширенные ASCII-кодировки. Однако репозитории, созданные на таких системах, не будут корректно работать на системах с UTF-8 (например, Linux, Mac, Windows) и наоборот. Кроме того, многие инструменты, основанные на Git, предполагают, что пути передаются в UTF-8, и не умеют корректно отображать другие кодировки.
-
Сообщения коммитов, как правило, кодируются в UTF-8, но другие расширенные ASCII-кодировки также поддерживаются, в частности это включает: ISO-8859-x, CP125x и многие другие, но не включает UTF-16/32, EBCDIC и многобайтовые кодировки CJK (GBK, Shift-JIS, Big5, EUC-x, CP9xx и т.д.).
Хотя мы и поощряем, использование UTF-8 в качестве кодировки сообщений коммитов, но и ядро Git, и высокоуровневые пользовательские программны разработаны так, чтобы не принуждать к обязательному использованию UTF-8 в проектах. Если все участники конкретного проекта считают более удобным использовать устаревшие кодировки, Git не запрещает это. Однако есть несколько моментов, которые стоит иметь в виду.
-
gitcommitиgitcommit-treeбудут выдавать предупреждение, если переданное ему сообщение коммита не похоже на корректную строку UTF-8, если только вы явно не объявили, что ваш проект использует устаревшую кодировку. Это можно сделать, добавив переменную конфигурацииi18n.commitEncodingв файл.git/config, например:[i18n] commitEncoding = ISO-8859-1
Объекты-коммиты, которые будут созданные пока включена приведённая выше настройка, будут записывать значение
i18n.commitEncodingв своём заголовкеencoding. Это поможет другим людям, которые будут просматривать их позже. Отсутствие этого заголовка означает, что сообщение коммита использует кодировку в UTF-8. -
gitlog,gitshow,gitblameи другие подобные команды смотрят на заголовокencodingобъекта-коммита, и пытаются перекодировать сообщение журнала в UTF-8, если не указано иное. Вы можете указать нужную кодировку вывода с помощьюi18n.logOutputEncodingв файле.git/config, например:[i18n] logOutputEncoding = ISO-8859-1
Если эта переменная конфигурации у вас не установлена, то вместо ней используется значение
i18n.commitEncoding.
Заметьте, что мы сознательно решили не перекодировать сообщения коммитов прямо во время создания коммита (т.е. не принуждать к использованию UTF-8 на уровне объектов-коммитов), потому что перекодировка в UTF-8 не обязательно является обратимой операцией.
КОНФИГУРАЦИЯ
См. git-config[1] для основных переменных и git-diff[1] для настроек, связанных с созданием сравнений.
Дальнейшее содержание этого раздела (в отличие от того, что было описано до данной строки), повторяет то, что может быть найдено в git-config[1]:
-
log.abbrevCommit -
Если
true, заставить git-log[1], git-show[1] и git-whatchanged[1] подразумевать--abbrev-commit. Вы можете переопределить эту опцию с помощью--no-abbrev-commit. -
log.date -
Установить режим даты-времени по умолчанию для команды
log. Установка значения для log.date аналогична использованию опции--dateвgitlog. Подробности см. в git-log[1].Если для формата установлено значение "auto:foo" и используется пейджер, для формата даты будет использоваться формат "foo". В противном случае будет использоваться "default".
-
log.decorate -
Выводить имена ссылок любых коммитов, показываемых командой log. Возможные значения:
Это то же самое, что и параметр
--decorateвgitlog. -
log.initialDecorationSet -
По умолчанию
gitlogпоказывает оформление только для определённых известных пространств имён ссылок. Если указано all, то показывать все ссылки как оформление. -
log.excludeDecoration -
Исключить указанные шаблоны из украшений журнала. Это похоже на опцию командной строки
--decorate-refs-exclude, но опция конфигурации может быть переопределена опцией--decorate-refs. -
log.diffMerges -
Устанавливает формат сравнения, используемый при указании
--diff-merges=on; подробности см. в--diff-mergesв git-log[1]. По умолчаниюseparate. -
log.follow -
Если
true,gitlogбудет вести себя так, как если бы была использована опция--follow, когда указан один <путь>. Это имеет те же ограничения, что и--follow, т.е. его нельзя использовать для отслеживания нескольких файлов, и он плохо работает с нелинейной историей. -
log.graphColors -
Список цветов, разделённых запятыми, которые можно использовать для рисования линий истории в
gitlog--graph. -
log.showRoot -
Если true, начальный коммит будет показан как большое событие создания. Это эквивалентно сравнению с пустым деревом. Инструменты, такие как git-log[1] или git-whatchanged[1], которые обычно скрывают корневой коммит, теперь будут его показывать. По умолчанию true.
-
log.showSignature -
Если true, заставляет git-log[1], git-show[1] и git-whatchanged[1] подразумевать
--show-signature. -
log.mailmap -
Если true, заставляет git-log[1], git-show[1] и git-whatchanged[1] подразумевать
--use-mailmap, в противном случае подразумевать--no-use-mailmap. По умолчанию true.
-
notes.mergeStrategy -
Какую стратегию слияния выбирать по умолчанию при разрешении конфликтов заметок. Должна быть одной из
manual,ours,theirs,unionилиcat_sort_uniq. По умолчаниюmanual. Дополнительную информацию о каждой стратегии см. в разделе «СТРАТЕГИИ СЛИЯНИЯ ЗАМЕТОК» в git-notes[1].Этот параметр можно переопределить, передав опцию
--strategyв git-notes[1]. -
notes.<имя>.mergeStrategy -
Какую стратегию слияния выбрать при выполнении слияния заметок в
refs/notes/<имя>. Это переопределяет более общуюnotes.mergeStrategy. Дополнительную информацию о доступных стратегиях см. в разделе «СТРАТЕГИИ СЛИЯНИЯ ЗАМЕТОК» в git-notes[1]. -
notes.displayRef -
Какая ссылка (или ссылки, если это glob-шаблон или указано более одного раза), в дополнение к умолчанию, заданному
core.notesRefилиGIT_NOTES_REF, должна использоваться для чтения заметок при показе сообщений коммитов с помощью семейства командgitlog.Этот параметр можно переопределить с помощью переменной среды
GIT_NOTES_DISPLAY_REF, которая должна представлять собой разделённый двоеточиями список ссылок или glob-шаблонов.Для несуществующих ссылок будет выдано предупреждение, но glob-шаблон, не соответствующий ни одной ссылке, будет молча проигнорирован.
Этот параметр можно отключить с помощью опции
--no-notesдля семейства команд git-log[1] или с помощью опции--notes=<ссылка>, принимаемой этими командами.Эффективное значение
core.notesRef(возможно, переопределённоеGIT_NOTES_REF) также неявно добавляется в список отображаемых ссылок. -
notes.rewrite.<команда> -
При перезаписи коммитов с помощью <команда> (в настоящее время
amendилиrebase), если эта переменная имеет значениеfalse, git не будет копировать заметки из исходного коммита в перезаписанный. По умолчаниюtrue. См. такжеnotes.rewriteRefниже.Этот параметр можно переопределить с помощью переменной среды
GIT_NOTES_REWRITE_REF, которая должна представлять собой разделённый двоеточиями список ссылок или glob-шаблонов. -
notes.rewriteMode -
При копировании заметок во время перезаписи (см. параметр
notes.rewrite.<команда>) определяет, что делать, если у целевого коммита уже есть заметка. Должно быть одним изoverwrite,concatenate,cat_sort_uniqилиignore. По умолчаниюconcatenate.Этот параметр можно переопределить с помощью переменной окружения
GIT_NOTES_REWRITE_MODE. -
notes.rewriteRef -
При копировании заметок во время перезаписи указывает (полностью квалифицированную) ссылку, чьи заметки следует копировать. Может быть glob-шаблоном, и в этом случае заметки во всех соответствующих ссылках будут скопированы. Вы также можете указать эту конфигурацию несколько раз.
Не имеет значения по умолчанию; вы должны настроить эту переменную, чтобы включить перезапись заметок. Установите её в
refs/notes/commits, чтобы включить перезапись для заметок коммитов по умолчанию.Может быть переопределена с помощью переменной среды
GIT_NOTES_REWRITE_REF. См.notes.rewrite.<команда> выше для дальнейшего описания её формата.
GIT
Является частью пакета git[1]