Spec-Zone.ru › Git

git-log

Название

git-log — показ журналов коммитов

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

git log [<options>] [<revision-range>] [[--] <path>…​]

Описание

Показывает журналы коммитов.

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

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

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

$ git log foo bar ^baz

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

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

$ git log origin..HEAD
$ git log HEAD ^origin

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

$ 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=<pattern>
--decorate-refs-exclude=<pattern>

Для каждой подходящей ссылки не использовать её для декорирования, если она соответствует любому из параметров <pattern>, переданных --decorate-refs-exclude, или не соответствует ни одному из параметров <pattern>, переданных --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

Без этого флага git log -p <path>... показывает коммиты, затрагивающие указанные пути, и различия только для этих же путей. С этим флагом для коммитов, затрагивающих указанные пути, показывается полное сравнение; это означает, что «<path>...» ограничивает только список коммитов, но не вывод различий для этих коммитов.

Обратите внимание, что это влияет на все типы вывода, основанные на различиях, например создаваемые с помощью --stat и т. д.

--log-size

Для каждого коммита включать в вывод строку log size <number>, где <number> — длина сообщения этого коммита в байтах. Предназначено для ускорения работы инструментов, считывающих сообщения журнала из вывода git log, позволяя им заранее выделять память.

-L<start>,<end>:<file>
-L:<funcname>:<file>

Отслеживать историю заданного диапазона строк <start>,<end> или имени функции, заданного регулярным выражением <funcname>, в файле <file>. Указывать ограничители pathspec нельзя. В настоящее время поддерживается только обход, начинающийся с одной ревизии: можно указать ноль или один положительный аргумент-ревизию, а <start> и <end> (или <funcname>) должны существовать в начальной ревизии. Этот параметр можно указывать несколько раз. Подразумевает --patch. Вывод патчей можно отключить с помощью --no-patch. Поддерживаются форматы diff без патчей: --raw, --name-only, --name-status и --summary. Форматы статистики diff (--stat, --numstat, --shortstat, --dirstat) пока не реализованы.

Поддерживаются параметры форматирования патчей, такие как --word-diff, --color-moved, --no-prefix, и параметры обработки пробелов (-w, -b), а также параметры pickaxe (-S, -G) и --diff-filter.

<start> и <end> могут иметь один из следующих форматов:

  • <number>

    Если <start> или <end> — число, оно задаёт абсолютный номер строки (нумерация строк начинается с 1).

  • /<regex>/

    В этом формате будет найдена первая строка, соответствующая указанному POSIX <regex>. Если <start> — регулярное выражение, поиск выполняется от конца предыдущего диапазона -L, если он есть, иначе — от начала файла. Если <start> имеет вид ^/<regex>/, поиск выполняется от начала файла. Если <end> — регулярное выражение, поиск начинается со строки, заданной <start>.

  • +<offset> или -<offset>

    Этот формат допустим только для <end> и задаёт количество строк до или после строки, указанной в <start>.

Если вместо <start> и <end> указан :<funcname>, это регулярное выражение, задающее диапазон от первой строки с именем функции, соответствующей <funcname>, до следующей строки с именем функции. Поиск по :<funcname> выполняется от конца предыдущего диапазона -L, если он есть, иначе — от начала файла. Поиск по ^:<funcname> выполняется от начала файла. Имена функций определяются так же, как при формировании заголовков фрагментов патча с помощью git diff (см. Defining a custom hunk-header в gitattributes[5]).

<revision-range>

Показывать только коммиты из указанного диапазона ревизий. Если <revision-range> не задан, по умолчанию используется HEAD (то есть вся история, ведущая к текущему коммиту). origin..HEAD задаёт все коммиты, достижимые от текущего коммита (то есть HEAD), но не от origin. Полный список способов записи <revision-range> см. в разделе Specifying Ranges страницы gitrevisions[7].

[--] <path>...

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

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

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

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

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

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

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

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

--max-count-oldest=<number>

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

--skip=<number>

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

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

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

--since-as-filter=<date>

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

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

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

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

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

--grep-reflog=<pattern>

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

--grep=<pattern>

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

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

--all-match

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

--invert-grep

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

-i
--regexp-ignore-case

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

--basic-regexp

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

-E
--extended-regexp

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

-F
--fixed-strings

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

-P
--perl-regexp

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

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

--remove-empty

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

--merges

Выводить только коммиты слияния. Это полностью аналогично --min-parents=2.

--no-merges

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

--min-parents=<number>
--max-parents=<number>
--no-min-parents
--no-max-parents

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

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

--first-parent

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

Этот параметр также меняет формат diff по умолчанию для коммитов слияния на first-parent; подробности см. в описании --diff-merges=first-parent.

--exclude-first-parent-only

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

--maximal-only

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

--not

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

--all

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

--branches[=<pattern>]

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

--tags[=<pattern>]

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

--remotes[=<pattern>]

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

--glob=<glob-pattern>

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

--exclude=<glob-pattern>

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

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

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

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

--reflog

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

--alternate-refs

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

--single-worktree

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

--ignore-missing

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

--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-pick из другой ветки (например, «третий коммит в b» мог быть перенесён с помощью cherry-pick из ветки A). С этим параметром такие пары коммитов исключаются из вывода.

--left-only
--right-only

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

Например, --cherry-pick --right-only A...B исключает из B коммиты, которые есть в A или эквивалентны по патчу коммиту в A. Иными словами, эта команда выводит коммиты + из git cherry A B. Точнее, --cherry-pick --right-only --no-merges выводит точный список.

--cherry

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

-g
--walk-reflogs

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

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

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

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

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

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

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

При использовании --pretty=reference эта информация не отображается.

--merge

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

--boundary

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

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

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

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

<paths>

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

--simplify-by-decoration

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

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

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

Default mode

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

--show-pulls

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

--full-history

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

--dense

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

--sparse

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

--simplify-merges

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

--ancestry-path[=<commit>]

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

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

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

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

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

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

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

  • В A файл foo содержит только foo.

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

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

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

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

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

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

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

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

В результате получается:

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

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

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

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

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

        I  A  B  N  D  O  P  Q

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

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

--full-history с переписыванием родителей

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

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

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

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

Помимо перечисленных настроек можно изменить, влияет ли TREESAME на включение коммитов:

--dense

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

--sparse

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

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

--simplify-merges

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

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

  • Задать для C' значение C.

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

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

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

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

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

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

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

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

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

--ancestry-path[=<commit>]

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

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

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

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

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

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

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

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

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

А --ancestry-path=K D..M даст следующий результат:

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

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

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

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

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

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

        I---X

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

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

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

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

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

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

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

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

--show-pulls

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

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

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

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

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

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

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

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

Порядок коммитов

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

--date-order

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

--author-date-order

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

--topo-order

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

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

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

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

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

--reverse

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

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

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

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

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

--do-walk

Отменяет ранее заданный параметр --no-walk.

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

--pretty[=<format>]
--format=<format>

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

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

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

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

Это должно сделать --pretty=oneline гораздо более удобным для чтения в терминалах шириной 80 столбцов.

--no-abbrev-commit

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

--oneline

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

--encoding=<encoding>

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

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

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

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

--notes[=<ref>]

Показывать заметки (см. git-notes[1]), аннотированные к коммиту, при выводе сообщения журнала коммита. По умолчанию этот параметр используется командами git log, git show и git whatchanged, если в командной строке не заданы параметры --pretty, --format или --oneline.

По умолчанию показываются заметки из ссылок notes, перечисленных в переменных core.notesRef и notes.displayRef (или в соответствующих переопределениях окружения). Дополнительные сведения см. в git-config[1].

Если указан необязательный аргумент <ref>, ссылка используется для поиска заметок, которые нужно показать. Ссылка может задавать полное имя ссылки, если начинается с refs/notes/; если она начинается с notes/, добавляется префикс refs/, а в остальных случаях — refs/notes/, чтобы получить полное имя ссылки.

Можно объединить несколько параметров --notes, чтобы управлять отображаемыми заметками. Примеры: «--notes=foo» покажет только заметки из refs/notes/foo; «--notes=foo --notes» покажет заметки как из «refs/notes/foo», так и из ссылок notes по умолчанию.

--no-notes

Не показывать заметки. Этот параметр отменяет действие приведённого выше параметра --notes, сбрасывая список ссылок notes, заметки из которых отображаются. Параметры обрабатываются в порядке, заданном в командной строке; например, «--notes --notes=foo --no-notes --notes=bar» покажет заметки только из refs/notes/bar.

--show-notes-by-default

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

--show-notes[=<ref>]
--standard-notes
--no-standard-notes

Эти параметры устарели. Вместо них используйте приведённые выше параметры --notes/--no-notes.

--show-signature

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

--relative-date

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

--date=<format>

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

--date=relative отображает даты относительно текущего времени, например «2 часа назад». Параметр -local не влияет на --date=relative.

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

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

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

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

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

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

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

--date=short отображает только дату, без времени, в формате YYYY-MM-DD.

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

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

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

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

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

--parents

Также выводить родителей коммита (в формате «коммит родитель…​»). Кроме того, включает переписывание родителей; см. выше History Simplification.

--children

Также выводить потомков коммита (в формате «коммит потомок…​»). Кроме того, включает переписывание родителей; см. выше History Simplification.

--left-right

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

Например, при такой топологии:

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

вы получите примерно такой вывод:

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

        >bbbbbbb... 3rd on b
        >bbbbbbb... 2nd on b
        <aaaaaaa... 3rd on a
        <aaaaaaa... 2nd on a
        -yyyyyyy... 1st on b
        -xxxxxxx... 1st on a
--graph

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

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

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

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

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

--graph-lane-limit=<n>

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

Форматы pretty

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

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

oneline
<hash> <title-line>

Этот формат разработан таким образом, чтобы быть максимально компактным.

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

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

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

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

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

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

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

raw

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

format:<format-string>

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

Например, format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" выведет что-то вроде этого:

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

Заполнители:

  • Заполнители, которые разворачиваются в один буквальный символ:

    %n

    перевод строки

    %%

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

    %x00

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

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

    %Cred

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

    %Cgreen

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

    %Cblue

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

    %Creset

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

    %C(<spec>)

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

    %m

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

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

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

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

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

    %<|(<m> )

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

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

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

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

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

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

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

  • Подстановочные элементы, раскрывающиеся в сведения, извлечённые из коммита:

    %H

    хеш коммита

    %h

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

    %T

    хеш дерева

    %t

    сокращённый хеш дерева

    %P

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

    %p

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

    %an

    имя автора

    %aN

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

    %ae

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

    %aE

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

    %al

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

    %aL

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

    %ad

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

    %aD

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

    %ar

    относительная дата автора

    %at

    дата автора в виде временной метки UNIX

    %ai

    дата автора в формате, похожем на ISO 8601

    %aI

    дата автора в строгом формате ISO 8601

    %as

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

    %ah

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

    %cn

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

    %cN

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

    %ce

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

    %cE

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

    %cl

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

    %cL

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

    %cd

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

    %cD

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

    %cr

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

    %ct

    дата коммитера в виде временной метки UNIX

    %ci

    дата коммитера в формате, похожем на ISO 8601

    %cI

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

    %cs

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

    %ch

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

    %d

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

    %D

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

    %(count)

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

    %(total)

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

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

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

    prefix=<value>

    Отображается перед списком имён ссылок. По умолчанию — « (».

    suffix=<value>

    Отображается после списка имён ссылок. По умолчанию — «)».

    separator=<value>

    Отображается между именами ссылок. По умолчанию — «, ».

    pointer=<value>

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

    tag=<value>

    Отображается перед именами тегов. По умолчанию — «tag: ».

    Например, чтобы выводить оформление без обрамления и аннотаций тегов, разделяя элементы пробелами:

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

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

    tags[=<bool-value>]

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

    abbrev=<number>

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

    match=<pattern>

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

    exclude=<pattern>

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

    %S

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

    %e

    кодировка

    %s

    тема

    %f

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

    %b

    тело

    %B

    необработанное тело (тема и тело без переноса строк)

    %N

    заметки к коммиту

    %GG

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

    %G?

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

    %GS

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

    %GK

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

    %GF

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

    %GP

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

    %GT

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

    %gD

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

    %gd

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

    %gn

    имя идентификатора reflog

    %gN

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

    %ge

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

    %gE

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

    %gs

    тема reflog

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

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

    key=<key>

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

    only[=<bool>]

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

    separator=<sep>

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

    unfold[=<bool>]

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

    keyonly[=<bool>]

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

    valueonly[=<bool>]

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

    key_value_separator=<sep>

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

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

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

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

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

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

tformat:

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

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

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

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

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

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

По умолчанию git log не выводит diff. Параметры ниже можно использовать, чтобы показать изменения, внесённые каждым коммитом.

Обратите внимание: если явно не указан один из вариантов --diff-merges (включая краткие варианты -m, -c, --cc и --dd), для коммитов слияния diff не выводится, даже если выбран формат diff, например --patch; такие коммиты также не будут соответствовать параметрам поиска, например -S. Исключение составляет случай, когда используется --first-parent; в этом случае для коммитов слияния по умолчанию используется формат first-parent.

-p
-u
--patch

Создать патч (см. раздел Создание текста патча с помощью -p).

-s
--no-patch

Подавить весь вывод механизмов diff. Полезно для подавления вывода таких команд, как git show, которые по умолчанию показывают патч, или для отмены действия таких параметров, как --patch, --stat, указанных ранее в командной строке в псевдониме.

-m

Показывать различия для коммитов слияния в формате по умолчанию. Это похоже на --diff-merges=on, за исключением того, что -m не выведет ничего, если также не указан параметр -p.

-c

Вывести объединённый diff для коммитов слияния. Сокращение для --diff-merges=combined -p.

--cc

Вывести плотный объединённый diff для коммитов слияния. Сокращение для --diff-merges=dense-combined -p.

--dd

Вывести diff относительно первого родителя как для коммитов слияния, так и для обычных коммитов. Сокращение для --diff-merges=first-parent -p.

--remerge-diff

Вывести remerge-diff для коммитов слияния. Сокращение для --diff-merges=remerge -p.

--no-diff-merges

Синоним для --diff-merges=off.

--diff-merges=<format>

Указать формат diff для коммитов слияния. По умолчанию используется `off`, если не применяется --first-parent; в этом случае по умолчанию используется first-parent.

Поддерживаются следующие форматы:

off
none

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

on
m

Показывать diff для коммитов слияния в формате по умолчанию. Формат по умолчанию можно изменить с помощью переменной конфигурации log.diffMerges, значением по умолчанию для которой является separate.

first-parent
1

Показывать полный diff относительно первого родителя. Это тот же формат, который --patch выводит для коммитов, не являющихся слияниями.

separate

Показывать полный diff относительно каждого из родителей. Для каждого родителя создаётся отдельная запись журнала и diff.

combined
c

Одновременно показывать различия между каждым из родителей и результатом слияния, вместо попарного вывода diff между родителем и результатом по очереди. Кроме того, выводятся только файлы, изменённые относительно всех родителей.

dense-combined
cc

Дополнительно сжать вывод, создаваемый --diff-merges=combined, опустив не представляющие интереса фрагменты, содержимое которых у родителей имеет только два варианта, а результат слияния без изменений выбирает один из них.

remerge
r

Повторно выполнить слияние двухродительских коммитов слияния, создав временный объект дерева, который может содержать файлы с маркерами конфликтов и тому подобное. Затем показывается diff между этим временным деревом и фактическим коммитом слияния.

Вывод, создаваемый при использовании этого параметра, может измениться; это также относится к его взаимодействию с другими параметрами (если иное не задокументировано явно).

--combined-all-paths

Заставить объединённые diff (используемые для коммитов слияния) перечислять имена файлов из всех родителей. Поэтому параметр действует только при использовании --diff-merges=[dense-]combined и, вероятно, полезен только при обнаружении изменений имён файлов (то есть, когда запрошено обнаружение переименований или копирований).

-U<n>
--unified=<n>

Создать diff с <n> строками контекста. Число строк контекста по умолчанию равно diff.context или 3, если переменная конфигурации не задана. (-U без <n> принимается без предупреждения как синоним -p из-за исторической случайности.) Подразумевает --patch.

--output=<file>

Выводить данные в указанный файл, а не в stdout.

--output-indicator-new=<char>
--output-indicator-old=<char>
--output-indicator-context=<char>

Указать символы, используемые для обозначения новых, старых строк и строк контекста в создаваемом патче. Обычно это +, - и ' ' соответственно.

--raw

Для каждого коммита показывать сводку изменений в формате raw diff. См. раздел «RAW OUTPUT FORMAT» в git-diff[1]. Это отличается от вывода самого журнала в формате raw, который можно получить с помощью --format=raw.

--patch-with-raw

Синоним для -p --raw.

-t

Показывать объекты дерева в выводе diff.

--indent-heuristic

Включить эвристику, которая сдвигает границы фрагментов diff, чтобы патчи было легче читать. Используется по умолчанию.

--no-indent-heuristic

Отключить эвристику отступов.

--minimal

Затратить дополнительное время, чтобы гарантировать создание diff минимально возможного размера.

--patience

Создать diff с помощью алгоритма «patience diff».

--histogram

Создать diff с помощью алгоритма «histogram diff».

--anchored=<text>

Создать diff с помощью алгоритма «anchored diff».

Этот параметр можно указывать несколько раз.

Если строка присутствует и в источнике, и в назначении, встречается только один раз и начинается с <text>, этот алгоритм пытается не допустить её отображения в выводе как удалённой или добавленной. Внутри он использует алгоритм «patience diff».

--diff-algorithm=(patience|minimal|histogram|myers)

Выбрать алгоритм diff. Доступны следующие варианты:

default
myers

Базовый жадный алгоритм diff. В настоящее время используется по умолчанию.

minimal

Затратить дополнительное время, чтобы гарантировать создание diff минимально возможного размера.

patience

При создании патчей использовать алгоритм «patience diff».

histogram

Этот алгоритм расширяет алгоритм patience, чтобы «поддерживать редко встречающиеся общие элементы».

Например, если для переменной diff.algorithm задано значение, отличное от значения по умолчанию, и нужно использовать значение по умолчанию, следует воспользоваться параметром --diff-algorithm=default.

--stat[=<width>[,<name-width>[,<count>]]]

Создать diffstat. По умолчанию для части с именем файла используется столько места, сколько необходимо, а оставшееся отводится для графической части. Максимальная ширина по умолчанию равна ширине терминала или 80 столбцам, если терминал не подключён; её можно переопределить с помощью <width>. Ширину части с именем файла можно ограничить, указав после запятой другую ширину <name-width>, или задав diff.statNameWidth=<name-width>. Ширину графической части можно ограничить с помощью --stat-graph-width=<graph-width> или задав diff.statGraphWidth=<graph-width>. Использование --stat или --stat-graph-width влияет на все команды, создающие статистический график, тогда как задание diff.statNameWidth или diff.statGraphWidth не влияет на git format-patch. Указав третий параметр <count>, можно ограничить вывод первыми <count> строками; если строк больше, за ними следует ....

Эти параметры также можно задавать по отдельности с помощью --stat-width=<width>, --stat-name-width=<name-width> и --stat-count=<count>.

--compact-summary

Вывести сжатую сводку расширенной информации заголовка, такой как создание или удаление файлов («new» или «gone», при необходимости с +l, если это символическая ссылка) и изменение режима (+x или -x при добавлении или удалении бита исполняемости соответственно) в diffstat. Эта информация помещается между частью с именами файлов и графической частью. Подразумевает --stat.

--numstat

Похоже на --stat, но показывает число добавленных и удалённых строк в десятичном формате и полный путь без сокращений, что удобнее для машинной обработки. Для двоичных файлов выводит два значения - вместо строки 0 0.

--shortstat

Вывести только последнюю строку формата --stat, содержащую общее число изменённых файлов, а также число добавленных и удалённых строк.

-X [<param>,...]
--dirstat[=<param>,...]

Вывести распределение относительного объёма изменений по подкаталогам. Поведение --dirstat можно настроить, передав ему список параметров, разделённых запятыми. Значения по умолчанию задаются переменной конфигурации diff.dirstat (см. git-config[1]). Доступны следующие параметры:

changes

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

lines

Вычислять значения dirstat, выполняя обычный построчный анализ diff и суммируя число удалённых и добавленных строк. (Для двоичных файлов вместо этого подсчитываются блоки по 64 байта, поскольку в двоичных файлах нет естественного понятия строк.) Это более затратное с точки зрения вычислений поведение --dirstat, чем поведение changes, но оно учитывает переставленные строки внутри файла так же, как и другие изменения. Результат согласуется с выводом других параметров --*stat.

files

Вычислять значения dirstat, подсчитывая число изменённых файлов. В анализе dirstat каждый изменённый файл имеет одинаковый вес. Это наименее затратное с вычислительной точки зрения поведение --dirstat, поскольку оно вообще не анализирует содержимое файлов.

cumulative

Также учитывать изменения в дочернем каталоге для родительского каталога. Обратите внимание: при использовании cumulative сумма выведенных процентов может превышать 100%. Поведение по умолчанию (без накопления) можно указать параметром noncumulative.

<limit>

Целочисленный параметр задаёт пороговый процент (по умолчанию 3%). Каталоги, на которые приходится меньше этого процента изменений, не выводятся.

Пример: следующая команда подсчитает изменённые файлы, не учитывая каталоги, на которые приходится менее 10% от общего числа изменённых файлов, и накапливая число изменений в дочерних каталогах для родительских каталогов: --dirstat=files,10,cumulative.

--cumulative

Синоним для --dirstat=cumulative.

--dirstat-by-file[=<param>,...]

Синоним для --dirstat=files,<param>,....

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

Указать, как показывать различия в подмодулях. При указании --submodule=short используется формат short. В этом формате показываются только имена коммитов в начале и конце диапазона. Если указан --submodule или --submodule=log, используется формат log. В этом формате перечисляются коммиты в диапазоне, как это делает git-submodule[1] summary. Если указан --submodule=diff, используется формат diff. В этом формате показывается встроенный diff изменений содержимого подмодуля между коммитами диапазона. По умолчанию используется diff.submodule или формат short, если параметр конфигурации не задан.

--color[=<when>]

Показывать diff цветным. --color (то есть без =<when>) означает то же, что и --color=always. Значением <when> может быть always, never или auto.

--no-color

Отключить цветной diff. Это то же самое, что --color=never.

--color-moved[=<mode>]

Перемещённые строки кода выделяются другим цветом. Если параметр не указан, <mode> по умолчанию равен no, а если параметр указан без режима — zebra. Режим должен быть одним из следующих:

no

Перемещённые строки не подсвечиваются.

default

Синоним для zebra. В будущем этот режим может быть заменён более подходящим.

plain

Любая строка, добавленная в одном месте и удалённая в другом, будет окрашена в цвет color.diff.newMoved. Аналогично, для удалённых строк, добавленных где-либо ещё в diff, будет использоваться 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=<mode>,...

Этот параметр задаёт, как игнорируются пробелы при обнаружении перемещений для --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[=<mode>]

По умолчанию слова разделяются пробелами; см. описание --word-diff-regex ниже. По умолчанию <mode> имеет значение plain и должно быть одним из следующих:

color

Подсвечивать изменённые слова только с помощью цветов. Подразумевает --color.

plain

Показывать слова в виде [-removed-] и {added}. Не предпринимаются попытки экранировать разделители, если они встречаются во входных данных, поэтому результат может быть неоднозначным.

porcelain

Использовать специальный построчный формат, предназначенный для обработки скриптами. Добавленные/удалённые/неизменённые фрагменты выводятся в обычном формате унифицированного diff, начиная с символа +/-/` ` в начале строки и до её конца. Символы новой строки во входных данных представлены тильдой ~ на отдельной строке.

none

Снова отключить сравнение на уровне слов.

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

Параметр --word-diff работает так: берётся тот же построчный diff, который формируется без этого параметра, и внутри каждого фрагмента вычисляются изменения на уровне слов. В результате diff может оказаться больше, чем при использовании специализированного инструмента для сравнения слов. Если в будущем Git получит другую реализацию, результат может измениться. Обратите внимание, что это похоже на параметр --diff-algorithm, который также может изменить результат.

--word-diff-regex=<regex>

Использовать <regex> для определения слова вместо того, чтобы считать словом последовательность непробельных символов. Также подразумевает --word-diff, если этот параметр ещё не включён.

Каждое неперекрывающееся совпадение с <regex> считается словом. Всё, что находится между этими совпадениями, считается пробелами и игнорируется(!) при поиске различий. Можно добавить |[^[:space:]] в конец регулярного выражения, чтобы оно соответствовало всем непробельным символам. Совпадение, содержащее символ новой строки, незаметно обрезается(!) на этом символе.

Например, --word-diff-regex=. будет считать каждый символ отдельным словом и, соответственно, показывать различия посимвольно.

Регулярное выражение также можно задать с помощью драйвера diff или параметра конфигурации; см. gitattributes[5] или git-config[1]. Явно заданное значение переопределяет настройки драйвера diff и конфигурации. Настройки драйверов diff имеют приоритет над параметрами конфигурации.

--color-words[=<regex>]

Эквивалентно --word-diff=color плюс (если указано регулярное выражение) --word-diff-regex=<regex>.

--no-renames

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

--rename-empty
--no-rename-empty

Использовать ли пустые блобы в качестве источника переименования.

--check

Предупреждать, если изменения добавляют маркеры конфликтов или ошибки в пробелах. Понятие ошибок в пробелах определяется настройкой core.whitespace. По умолчанию ошибками считаются пробелы в конце строк (включая строки, состоящие только из пробелов), а также пробел, за которым непосредственно следует символ табуляции в начальном отступе строки. Если обнаружены проблемы, команда завершается с ненулевым кодом возврата. Несовместимо с --exit-code.

--ws-error-highlight=<kind>

Подсвечивать ошибки в пробелах в строках diff context, old или new. Несколько значений разделяются запятыми, none сбрасывает предыдущие значения, default сбрасывает список до значения new, а all является сокращением для old,new,context. Если этот параметр не задан и переменная конфигурации diff.wsErrorHighlight не установлена, ошибки в пробелах подсвечиваются только в строках new. Ошибки в пробелах окрашиваются цветом color.diff.whitespace.

--full-index

При создании результата в формате patch вместо первых нескольких символов показывать полные имена объектов-блобов до и после изменения в строке "index".

--binary

В дополнение к --full-index выводить двоичный diff, который можно применить с помощью git-apply. Подразумевает --patch.

--abbrev[=<n>]

Вместо полного 40-байтового шестнадцатеричного имени объекта в выводе diff-raw и заголовках diff-tree показывать кратчайший префикс длиной не менее <n> шестнадцатеричных цифр, который однозначно указывает на объект. В формате вывода diff-patch параметр --full-index имеет более высокий приоритет: если указан --full-index, будут показаны полные имена блобов независимо от --abbrev. Нестандартное количество цифр можно задать с помощью --abbrev=<n>.

-B[<n>][/<m>]
--break-rewrites[=[<n>][/<m>]]

Разбивать полные переписывания на пары удаления и создания. Это служит двум целям:

Параметр влияет на то, будет ли изменение, представляющее собой полное переписывание файла, отображаться как последовательность перемешанных удалений и вставок с несколькими строками, случайно совпавшими текстуально и использованными в качестве контекста, или как единое удаление всего старого содержимого с последующей единой вставкой всего нового. Число <m> управляет этим аспектом параметра -B (по умолчанию — 60%). -B/70% означает, что в результате должно сохраниться менее 30% исходного файла, чтобы Git счёл его полностью переписанным (иначе результирующий patch будет представлять собой последовательность перемешанных удалений и вставок со строками контекста).

При использовании вместе с -M полностью переписанный файл также считается источником переименования (обычно -M считает источником переименования только исчезнувший файл), а число <n> управляет этим аспектом параметра -B (по умолчанию — 50%). -B20% означает, что изменение, при котором объём добавлений и удалений составляет не менее 20% размера файла, может быть выбрано в качестве возможного источника переименования в другой файл.

-M[<n>]
--find-renames[=<n>]

При создании diff обнаруживать и показывать переименования для каждого коммита. Чтобы отслеживать файлы при обходе истории с учётом переименований, см. --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

Не выводить исходное содержимое для удалений, то есть печатать только заголовок, но не diff между исходным содержимым и /dev/null. Полученный patch не предназначен для применения с помощью patch или git apply; этот параметр предназначен только для тех, кто хочет сосредоточиться на проверке текста после изменения. Кроме того, в выводе явно недостаточно информации для применения такого patch в обратном направлении, даже вручную, отсюда и название параметра.

При использовании вместе с -B исходное содержимое также не выводится в части удаления пары «удаление/создание».

-l<num>

Параметры -M и -C включают предварительные этапы, позволяющие с небольшими затратами обнаружить некоторые переименования/копирования, после которых выполняется исчерпывающий поиск: все оставшиеся несопоставленные файлы назначения сравниваются со всеми подходящими источниками. (Для переименований подходят только оставшиеся несопоставленные источники; для копирований подходят все исходные источники.) Для N источников и назначений эта исчерпывающая проверка имеет сложность O(N^2). Этот параметр запрещает запуск исчерпывающей части обнаружения переименований/копирований, если количество участвующих файлов-источников/назначений превышает заданное число. По умолчанию используется значение diff.renameLimit. Обратите внимание: значение 0 означает отсутствие ограничений.

--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]

Выбирать только добавленные файлы (A), скопированные файлы (C), удалённые файлы (D), изменённые файлы (M), переименованные файлы (R), файлы с изменившимся типом (например, обычный файл, символическая ссылка, подмодуль и т. д.) (T), неслитые файлы (U), файлы с неизвестным состоянием (X) или файлы с нарушенной парой (B). Можно использовать любую комбинацию символов фильтра (включая пустую). Если к комбинации добавлено * (All-or-none), выбираются все пути, если в сравнении есть хотя бы один файл, соответствующий остальным критериям; если ни один файл не соответствует остальным критериям, ничего не выбирается.

Кроме того, эти заглавные буквы можно записывать в нижнем регистре, чтобы исключить соответствующие файлы. Например, --diff-filter=ad исключает добавленные и удалённые пути.

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

-S<string>

Искать различия, изменяющие количество вхождений указанной <string> (то есть добавления/удаления) в файле. Предназначено для использования в скриптах.

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

Поиск выполняется также в двоичных файлах.

-G<regex>

Искать различия, в тексте patch которых есть добавленные/удалённые строки, соответствующие <regex>.

Чтобы показать различие между -S<regex> --pickaxe-regex и -G<regex>, рассмотрим коммит со следующим diff в одном и том же файле:

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

Команда git log -G"frotz\(nitfol" покажет этот коммит, а команда git log -S"frotz\(nitfol" --pickaxe-regex — нет (поскольку количество вхождений этой строки не изменилось).

Если не указан параметр --text, patch двоичных файлов без фильтра textconv игнорируются.

Дополнительные сведения см. в разделе pickaxe на странице gitdiffcore[7].

--find-object=<object-id>

Искать различия, изменяющие количество вхождений указанного объекта. Параметр похож на -S, но вместо конкретной строки в качестве аргумента используется идентификатор объекта.

Объектом может быть блоб или коммит подмодуля. Параметр подразумевает -t в git-log, чтобы также находить деревья.

--pickaxe-all

Если -S или -G обнаруживает изменение, показывать все изменения в этом наборе изменений, а не только файлы, содержащие изменение в <string>.

--pickaxe-regex

Считать <string>, переданный параметру -S, расширенным регулярным выражением POSIX для поиска совпадений.

-O<orderfile>

Управлять порядком отображения файлов в выводе. Этот параметр переопределяет переменную конфигурации diff.orderFile (см. git-config[1]). Чтобы отменить действие diff.orderFile, используйте -O/dev/null.

Порядок вывода определяется порядком шаблонов glob в <orderfile>. Сначала выводятся все файлы, пути которых соответствуют первому шаблону; затем — все файлы, пути которых соответствуют второму шаблону (но не первому), и так далее. Все файлы, пути которых не соответствуют ни одному шаблону, выводятся последними, как если бы в конце файла находился неявный шаблон, соответствующий всему. Если несколько путей имеют одинаковый ранг (соответствуют одному и тому же шаблону, но не более ранним шаблонам), их относительный порядок в выводе определяется обычным образом.

Файл <orderfile> обрабатывается следующим образом:

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

  • Строки, начинающиеся с решётки ("#"), игнорируются, поэтому их можно использовать для комментариев. Если шаблон начинается с решётки, добавьте в его начало обратную косую черту ("\").

  • Каждая другая строка содержит один шаблон.

Синтаксис и семантика шаблонов такие же, как у шаблонов для fnmatch(3) без флага FNM_PATHNAME, за исключением того, что путь также соответствует шаблону, если после удаления любого количества конечных компонентов пути он соответствует этому шаблону. Например, шаблон "foo*bar" соответствует "fooasdfbar" и "foo/bar/baz/asdf", но не "foobarx".

--skip-to=<file>
--rotate-to=<file>

Исключать из вывода файлы, расположенные перед указанным <file> (то есть использовать skip to), или перемещать их в конец вывода (то есть использовать rotate to). Эти параметры были разработаны главным образом для команды git difftool и могут быть мало полезны в других случаях.

-R

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

--relative[=<path>]
--no-relative

Если команда запущена из подкаталога проекта, этот параметр позволяет исключить изменения за пределами каталога и показывать пути относительно него. Если вы находитесь не в подкаталоге (например, в bare-репозитории), можно указать подкаталог, относительно которого нужно формировать вывод, передав <path> в качестве аргумента. Параметр --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<regex>
--ignore-matching-lines=<regex>

Игнорировать изменения, все строки которых соответствуют <regex>. Этот параметр можно указать несколько раз.

--inter-hunk-context=<number>

Показывать контекст между фрагментами diff в пределах указанного <number> строк, объединяя близко расположенные фрагменты. По умолчанию используется значение diff.interHunkContext или 0, если параметр конфигурации не задан.

-W
--function-context

Показывать всю функцию в качестве строк контекста для каждого изменения. Имена функций определяются так же, как команда git diff формирует заголовки фрагментов patch (см. раздел "Определение собственного заголовка фрагмента" в gitattributes[5]).

--ext-diff

Разрешить запуск внешнего помощника diff. Если вы настроили внешний драйвер diff с помощью gitattributes[5], этот параметр необходимо использовать вместе с git-log[1] и родственными командами.

--no-ext-diff

Запретить использование внешних драйверов diff.

--textconv
--no-textconv

Разрешить (или запретить) запуск внешних фильтров преобразования текста при сравнении двоичных файлов. Подробности см. в gitattributes[5]. Поскольку фильтры textconv обычно выполняют преобразование только в одном направлении, полученный diff подходит для чтения человеком, но не может быть применён. Поэтому фильтры textconv по умолчанию включены только для git-diff[1] и git-log[1], но не для git-format-patch[1] или низкоуровневых команд diff.

--ignore-submodules[=(none|untracked|dirty|all)]

Игнорировать изменения подмодулей при создании diff. all используется по умолчанию. При использовании none подмодуль считается изменённым, если он содержит неотслеживаемые или изменённые файлы либо его HEAD отличается от коммита, записанного в суперпроекте; этот параметр можно использовать для переопределения любых настроек параметра ignore в git-config[1] или gitmodules[5]. При использовании untracked подмодули не считаются изменёнными, если содержат только неотслеживаемые данные (но проверка на наличие изменённых данных всё равно выполняется). При использовании dirty игнорируются все изменения рабочего дерева подмодулей, отображаются только изменения коммитов, сохранённых в суперпроекте (такое поведение использовалось до версии 1.7.0). При использовании all скрываются все изменения подмодулей.

--src-prefix=<prefix>

Показывать указанный префикс источника <prefix> вместо «a/».

--dst-prefix=<prefix>

Показывать указанный префикс назначения <prefix> вместо «b/».

--no-prefix

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

--default-prefix

Использовать префиксы источника и назначения по умолчанию («a/» и «b/»). Переопределяет такие переменные конфигурации, как diff.noprefix, diff.srcPrefix, diff.dstPrefix и diff.mnemonicPrefix (см. git-config[1]).

--line-prefix=<prefix>

Добавлять указанный префикс <prefix> в начало каждой строки вывода.

--ita-invisible-in-index

По умолчанию записи, добавленные командой git add -N, отображаются как существующий пустой файл в git diff и как новый файл в git diff --cached. Этот параметр отображает запись как новый файл в git diff и как отсутствующий файл в git diff --cached. Это поведение можно отменить с помощью --ita-visible-in-index. Оба параметра являются экспериментальными и могут быть удалены в будущем.

--max-depth=<depth>

Для каждого шаблона пути, заданного в командной строке, спускаться не более чем на <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 -- foo foo/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 немного отличается от традиционного формата diff:

  1. Перед ним располагается заголовок «git diff» следующего вида:

    diff --git a/file1 b/file2

    Имена файлов a/ и b/ совпадают, если не выполняется переименование или копирование. В частности, даже при создании или удалении файла /dev/null not используется вместо имён файлов a/ или b/.

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

  2. За ним следуют одна или несколько строк расширенного заголовка:

    old mode <mode>
    new mode <mode>
    deleted file mode <mode>
    new file mode <mode>
    copy from <path>
    copy to <path>
    rename from <path>
    rename to <path>
    similarity index <number>
    dissimilarity index <number>
    index <hash>..<hash> <mode>

    Режимы файлов <mode> выводятся как шестизначные восьмеричные числа, включающие тип файла и биты прав доступа.

    В расширенных заголовках имена путей не содержат префиксов a/ и b/.

    Индекс сходства — это процент неизменённых строк, а индекс различия — процент изменённых строк. Значение округляется вниз до целого числа, за которым следует знак процента. Поэтому значение индекса сходства 100% зарезервировано для двух одинаковых файлов, а 100% различия означает, что ни одна строка из старого файла не попала в новый.

    Строка индекса содержит имена объектов blob до и после изменения. <mode> включается, если режим файла не меняется; в противном случае старый и новый режимы указываются в отдельных строках.

  3. Имена путей с «необычными» символами заключаются в кавычки, как описано для переменной конфигурации core.quotePath (см. git-config[1]).

  4. Все файлы file1 в выводе относятся к файлам до коммита, а все файлы file2 — к файлам после коммита. Нельзя последовательно применять каждое изменение к каждому файлу. Например, этот патч поменяет местами 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
  5. В заголовках блоков diff указывается имя функции, к которой относится блок. Подробные сведения о настройке этого поведения для конкретных языков см. в разделе «Определение пользовательского заголовка блока» в gitattributes[5].

Формат объединённого diff

Любая команда создания diff может принимать параметр -c или --cc, чтобы при отображении слияния создать combined diff. Это формат по умолчанию при отображении слияний с помощью git-diff[1] или git-show[1]. Обратите внимание, что любой из этих команд можно передать подходящий параметр --diff-merges, чтобы принудительно создать diff в определённом формате.

Формат «объединённого diff» выглядит следующим образом:

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);
  1. Перед ним располагается заголовок «git diff» следующего вида (при использовании параметра -c):

    diff --combined file

    или следующего вида (при использовании параметра --cc):

    diff --cc file
  2. За ним следуют одна или несколько строк расширенного заголовка (в этом примере показано слияние с двумя родителями):

    index <hash>,<hash>..<hash>
    mode <mode>,<mode>..<mode>
    new file mode <mode>
    deleted file mode <mode>,<mode>

    Строка mode <mode>,<mode>..<mode> появляется, только если хотя бы одно значение <mode> отличается от остальных. Расширенные заголовки со сведениями об обнаруженном перемещении содержимого (переименования и обнаружение копирования) предназначены для работы с diff двух <tree-ish> и не используются в формате объединённого diff.

  3. Далее следует двухстрочный заголовок исходного и целевого файлов:

    --- a/file
    +++ b/file

    Как и в двухстрочном заголовке традиционного формата diff unified, /dev/null используется для обозначения созданных или удалённых файлов.

    Однако, если указан параметр --combined-all-paths, вместо двухстрочного заголовка исходного и целевого файлов выводится заголовок из N+1 строк, где N — количество родителей коммита слияния:

    --- a/file
    --- a/file
    --- a/file
    +++ b/file

    Этот расширенный формат может быть полезен при активном обнаружении переименований или копирования: он позволяет увидеть исходное имя файла у разных родителей.

  4. Формат заголовка блока изменён, чтобы не допустить случайной передачи такого вывода команде patch -p1. Формат объединённого diff создан для анализа изменений коммита слияния и не предназначен для применения. Изменение аналогично изменению расширенного заголовка index:

    @@@ <from-file-range> <from-file-range> <to-file-range> @@@

    В заголовке блока объединённого diff содержится (количество родителей + 1) символов @.

В отличие от традиционного формата diff unified, который показывает два файла A и B в одном столбце с префиксом - (минус — строка есть в A, но удалена из B), + (плюс — строки нет в A, но она добавлена в B) или " " (пробел — строка не изменена), этот формат сравнивает два или более файлов file1, file2,…​ с одним файлом X и показывает, чем X отличается от каждого fileN. В начало выходной строки добавляется по одному столбцу для каждого fileN, чтобы показать, чем строка X отличается от него.

Символ - в столбце N означает, что строка есть в fileN, но отсутствует в результате. Символ + в столбце N означает, что строка есть в результате, но отсутствует в fileN (другими словами, с точки зрения этого родителя строка была добавлена).

В приведённом выше примере вывода сигнатура функции была изменена в обоих файлах (отсюда два удаления - из file1 и file2, а также ++, обозначающий одну добавленную строку, отсутствующую и в file1, и в file2). Кроме того, ещё восемь строк совпадают с file1, но отсутствуют в file2 (поэтому перед ними стоит +).

При отображении с помощью git diff-tree -c сравниваются родители коммита слияния с результатом слияния (то есть file1..fileN — это родители). При отображении с помощью git diff-files -c сравниваются два родителя неразрешённого слияния с файлом рабочего дерева (то есть file1 — это стадия 2, она же «наша версия», а file2 — стадия 3, она же «их версия»).

Примеры

git log --no-merges

Показать всю историю коммитов, пропуская слияния

git log v2.6.12.. include/scsi drivers/scsi

Показать все коммиты начиная с версии v2.6.12, в которых изменялся какой-либо файл в подкаталогах include/scsi или drivers/scsi

git log --since="2 weeks ago" -- gitk

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

git log --name-status release..test

Показать коммиты, которые есть в ветке «test», но ещё отсутствуют в ветке «release», а также список путей, изменённых каждым коммитом.

git log --follow builtin/rev-list.c

Показать коммиты, в которых изменялся builtin/rev-list.c, в том числе коммиты, созданные до того, как файлу присвоили его нынешнее имя.

git log --branches --not --remotes=origin

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

git log master --not --remotes=*/master

Показать все коммиты, которые есть в локальной ветке master, но отсутствуют в ветках master любых удалённых репозиториев.

git log -p -m --first-parent

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

git log -L /int main/',/^}/:main.c

Показать, как со временем менялась функция main() в файле main.c.

git log -3

Ограничить количество отображаемых коммитов тремя.

Обсуждение

Git в некоторой степени не зависит от кодировки символов.

  • Содержимое объектов blob — это неинтерпретируемые последовательности байтов. На базовом уровне преобразования кодировки не выполняются.

  • Имена путей кодируются в UTF-8 в нормализованной форме C. Это относится к объектам дерева, файлу индекса, именам ссылок, а также к именам путей в аргументах командной строки, переменных среды и файлах конфигурации (.git/config (см. git-config[1]), gitignore[5], gitattributes[5] и gitmodules[5]).

    Обратите внимание, что на базовом уровне Git рассматривает имена путей просто как последовательности байтов, отличных от NUL; преобразование кодировки имён путей не выполняется (за исключением Mac и Windows). Поэтому использование имён путей, содержащих символы не из ASCII, в основном работает даже на платформах и в файловых системах, использующих устаревшие расширенные кодировки ASCII. Однако репозитории, созданные в таких системах, не будут правильно работать в системах на основе UTF-8 (например, Linux, Mac, Windows) и наоборот. Кроме того, многие инструменты на основе Git просто предполагают, что имена путей представлены в UTF-8, и не смогут правильно отображать другие кодировки.

  • Сообщения журналов коммитов обычно кодируются в UTF-8, но также поддерживаются и другие расширенные кодировки ASCII. К ним относятся ISO-8859-x, CP125x и многие другие, но not UTF-16/32, EBCDIC и многобайтовые кодировки CJK (GBK, Shift-JIS, Big5, EUC-x, CP9xx и т. д.).

Хотя мы рекомендуем кодировать сообщения журналов коммитов в UTF-8, базовая система и Git Porcelain разработаны так, чтобы не навязывать UTF-8 проектам. Если всем участникам проекта удобнее использовать устаревшие кодировки, Git этого не запрещает. Однако следует учитывать несколько моментов.

  1. git commit и git commit-tree выдают предупреждение, если переданное им сообщение журнала коммита не похоже на допустимую строку UTF-8, если только явно не указать, что в проекте используется устаревшая кодировка. Для этого в файле .git/config нужно указать i18n.commitEncoding, например:

    [i18n]
            commitEncoding = ISO-8859-1

    В объектах коммитов, созданных с этой настройкой, значение i18n.commitEncoding записывается в заголовок encoding. Это помогает другим людям, которые будут просматривать их позднее. Если этот заголовок отсутствует, предполагается, что сообщение журнала коммита закодировано в UTF-8.

  2. git log, git show, git blame и другие команды проверяют заголовок encoding объекта коммита и пытаются перекодировать сообщение журнала в UTF-8, если не указано иное. Желаемую выходную кодировку можно задать с помощью i18n.logOutputEncoding в файле .git/config, например:

    [i18n]
            logOutputEncoding = ISO-8859-1

    Если эта переменная конфигурации не задана, вместо неё используется значение i18n.commitEncoding.

Обратите внимание, что мы намеренно не стали перекодировать сообщение журнала коммита при создании коммита, чтобы принудительно использовать UTF-8 на уровне объекта коммита: преобразование в UTF-8 не всегда является обратимой операцией.

Конфигурация

См. git-config[1] для основных переменных и git-diff[1] для настроек, связанных с созданием diff.

format.pretty

Значение по умолчанию для параметра --format. (См. выше раздел Pretty Formats.) По умолчанию используется medium.

i18n.logOutputEncoding

Кодировка, используемая при отображении журналов. (См. выше раздел Discussion.) По умолчанию используется значение i18n.commitEncoding, если оно задано, и UTF-8 в противном случае.

Всё, что находится выше этой строки в данном разделе, не включено из документации 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 аналогично использованию параметра git log --date. Подробности см. в git-log[1].

Если задан формат "auto:foo" и используется пейджер, для даты будет применён формат "foo". В противном случае будет использоваться "default".

log.decorate

Выводит имена ссылок для всех коммитов, отображаемых командой log. Возможные значения:

short

префиксы имён ссылок refs/heads/, refs/tags/ и refs/remotes/ не выводятся.

full

выводится полное имя ссылки (включая префикс).

auto

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

Это эквивалентно параметру --decorate команды git log.

log.initialDecorationSet

По умолчанию git log показывает украшения только для некоторых известных пространств имён ссылок. Если задан all, все ссылки отображаются как украшения.

log.excludeDecoration

Исключает указанные шаблоны из украшений журнала. Это похоже на параметр командной строки --decorate-refs-exclude, но параметр конфигурации можно переопределить параметром --decorate-refs.

log.diffMerges

Задаёт формат diff, используемый при указании --diff-merges=on; подробности см. в разделе --diff-merges в git-log[1]. По умолчанию используется separate.

log.follow

Если true, git log будет вести себя так, как если бы был указан параметр --follow, когда задан один <path>. Это имеет те же ограничения, что и --follow: например, этот параметр нельзя использовать для отслеживания нескольких файлов, и он плохо работает с нелинейной историей.

log.graphColors

Список цветов, разделённых запятыми, которые можно использовать для отрисовки линий истории в git log --graph.

log.showRoot

Если значение истинно, начальный коммит будет показан как крупное событие создания. Это эквивалентно diff с пустым деревом. Такие инструменты, как git-log[1] или git-whatchanged[1], которые обычно скрывают корневой коммит, теперь будут его показывать. По умолчанию значение истинно.

log.showSignature

Если значение истинно, команды git-log[1], git-show[1] и git-whatchanged[1] считают, что задано --show-signature.

log.mailmap

Если значение истинно, команды git-log[1], git-show[1] и git-whatchanged[1] считают, что задано --use-mailmap, в противном случае — что задано --no-use-mailmap. По умолчанию значение истинно.

notes.mergeStrategy

Стратегия слияния, выбираемая по умолчанию при разрешении конфликтов заметок. Должна быть одной из следующих: manual, ours, theirs, union или cat_sort_uniq. По умолчанию используется manual. Дополнительные сведения о каждой стратегии см. в разделе «СТРАТЕГИИ СЛИЯНИЯ ЗАМЕТОК» справки git-notes[1].

Эту настройку можно переопределить, передав параметр --strategy команде git-notes[1].

notes.<name>.mergeStrategy

Стратегия слияния, выбираемая при слиянии заметок в refs/notes/<name>. Переопределяет более общую настройку notes.mergeStrategy. Дополнительные сведения о доступных стратегиях см. в разделе «СТРАТЕГИИ СЛИЯНИЯ ЗАМЕТОК» справки git-notes[1].

notes.displayRef

Ссылка (или ссылки, если задан шаблон glob или параметр указан несколько раз), из которой следует считывать заметки при отображении сообщений коммитов с помощью команд семейства git log, помимо набора по умолчанию, заданного параметром core.notesRef или GIT_NOTES_REF.

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

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

Эту настройку можно отключить параметром --no-notes команд семейства git-log[1] или параметром --notes=<ref>, принимаемым этими командами.

Действующее значение core.notesRef (возможно, переопределённое параметром GIT_NOTES_REF) также неявно добавляется в список отображаемых ссылок.

notes.rewrite.<command>

При переписывании коммитов с помощью <command> (в настоящее время amend или rebase), если этой переменной присвоено значение false, git не будет копировать заметки из исходного коммита в переписанный. По умолчанию используется true. См. также раздел notes.rewriteRef ниже.

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

notes.rewriteMode

При копировании заметок во время переписывания (см. параметр notes.rewrite.<command>) определяет, что делать, если у целевого коммита уже есть заметка. Должно быть задано одно из значений: overwrite, concatenate, cat_sort_uniq или ignore. По умолчанию используется concatenate.

Эту настройку можно переопределить с помощью переменной окружения GIT_NOTES_REWRITE_MODE.

notes.rewriteRef

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

Значение по умолчанию отсутствует; чтобы включить переписывание заметок, необходимо настроить эту переменную. Задайте ей значение refs/notes/commits, чтобы включить переписывание заметок для коммитов по умолчанию.

Значение можно переопределить с помощью переменной окружения GIT_NOTES_REWRITE_REF. Дополнительное описание формата см. выше в разделе notes.rewrite.<command>.

log

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

Spec-Zone.ru

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