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 -
Без этого флага
gitlog-p<path>... показывает коммиты, затрагивающие указанные пути, и различия только для этих же путей. С этим флагом для коммитов, затрагивающих указанные пути, показывается полное сравнение; это означает, что «<path>...» ограничивает только список коммитов, но не вывод различий для этих коммитов.Обратите внимание, что это влияет на все типы вывода, основанные на различиях, например создаваемые с помощью
--statи т. д. -
--log-size -
Для каждого коммита включать в вывод строку
logsize<number>, где<number>— длина сообщения этого коммита в байтах. Предназначено для ускорения работы инструментов, считывающих сообщения журнала из выводаgitlog, позволяя им заранее выделять память. -
-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> выполняется от начала файла. Имена функций определяются так же, как при формировании заголовков фрагментов патча с помощьюgitdiff(см.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/. Если в конце должен быть/*, его необходимо указать явно. -
Не включать ссылки, которые были бы скрыты параметрами
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-onlyA...Bисключает изBкоммиты, которые есть вAили эквивалентны по патчу коммиту вA. Иными словами, эта команда выводит коммиты+изgitcherryAB. Точнее,--cherry-pick--right-only--no-mergesвыводит точный список. -
--cherry -
Синоним
--right-only--cherry-mark--no-merges; полезен для ограничения вывода коммитами на нашей стороне и пометки символомgitlog--cherryupstream...mybranchтех коммитов, которые были применены на другой стороне разошедшейся истории, аналогичноgitcherryupstreammybranch. -
-g -
--walk-reflogs -
Вместо обхода цепочки предков коммитов обходить записи reflog от самой новой к более старым. При использовании этого параметра нельзя указывать коммиты для исключения (то есть обозначения
^<commit>, <commit1>..<commit2> и <commit1>...<commit2> использовать нельзя).При формате
--pretty, отличном отonelineиreference(по очевидным причинам), в вывод добавляются две строки информации из reflog. Указатель reflog в выводе может отображаться какref@{<Nth>}(где<Nth>— индекс записи в reflog в обратном хронологическом порядке) или какref@{<timestamp>}(с<timestamp>этой записи), в зависимости от следующих правил:-
Если начальная точка задана как
ref@{<Nth>}, показывать индексный формат. -
Если начальная точка задана как
ref@{now}, показывать формат временной метки. -
Если не использован ни один из этих вариантов, но в командной строке задан
--date, показывать временную метку в формате, запрошенном параметром--date. -
В остальных случаях показывать индексный формат.
При использовании
--pretty=onelineсообщение коммита предваряется этой информацией в той же строке. Этот параметр нельзя сочетать с--reverse. См. также git-reflog[1].При использовании
--pretty=referenceэта информация не отображается. -
-
--merge -
Показать коммиты, затрагивающие пути с конфликтами в диапазоне
HEAD...<other>, где <other> — первая существующая псевдоссылка изMERGE_HEAD,CHERRY_PICK_HEAD,REVERT_HEADилиREBASE_HEAD. Работает только при наличии неслитых записей в индексе. Этот параметр можно использовать для показа соответствующих коммитов при разрешении конфликтов трёхстороннего слияния. -
--boundary -
Выводить исключённые граничные коммиты. Граничные коммиты предваряются символом
-.
Упрощение истории
Иногда вас интересуют только отдельные части истории, например коммиты, изменяющие определённый <path>. Однако в History Simplification есть две составляющие: одна — выбор коммитов, другая — способ его выполнения, поскольку существуют различные стратегии упрощения истории.
Следующие параметры выбирают коммиты для отображения:
- <paths>
-
Выбираются коммиты, изменяющие указанные <paths>.
-
--simplify-by-decoration -
Выбираются коммиты, на которые ссылается какая-либо ветка или тег.
Обратите внимание: для получения содержательной истории могут отображаться дополнительные коммиты.
Следующие параметры влияют на способ упрощения:
-
Defaultmode -
Упрощает историю до простейшей истории, объясняющей конечное состояние дерева. Она является простейшей, поскольку в ней отсекаются некоторые боковые ветви, если конечный результат совпадает (то есть при слиянии ветвей с одинаковым содержимым).
-
--show-pulls -
Включает все коммиты из режима по умолчанию, а также любые коммиты слияния, которые не являются TREESAME относительно первого родителя, но являются TREESAME относительно более позднего родителя. Этот режим полезен для отображения коммитов слияния, которые «впервые внесли» изменение в ветку.
-
--full-history -
То же, что и режим по умолчанию, но без отсечения некоторых частей истории.
-
--dense -
Отображаются только выбранные коммиты и некоторые другие, необходимые для получения содержательной истории.
-
--sparse -
Отображаются все коммиты в упрощённой истории.
-
--simplify-merges -
Дополнительный параметр для
--full-history, удаляющий из результирующей истории некоторые ненужные слияния, поскольку в этом слиянии нет выбранных коммитов, которые вносят вклад. -
--ancestry-path[=<commit>] -
Если задан диапазон коммитов для отображения (например, <commit1>
..<commit2> или <commit2>^<commit1>) и коммит<commit>в этом диапазоне, отображаются только коммиты из этого диапазона, которые являются предками<commit>, потомками<commit>или самим<commit>. Если коммит не указан, в качестве<commit>используется<commit1>(исключённая часть диапазона). Можно указывать несколько раз; в таком случае коммит включается, если он является одним из указанных коммитов либо его предком или потомком.
Далее следует более подробное объяснение.
Предположим, что вы указали 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объединяет строки вquuxxyzzy.Pявляется TREESAME относительноO, но не относительноE. -
X— независимый корневой коммит, добавивший новый файлside, аYизменил его.Yявляется TREESAME относительноX. Его слияниеQдобавилоsideвP, аQявляется TREESAME относительноP, но не относительноY.
rev-list проходит по истории в обратном направлении, включая или исключая коммиты в зависимости от того, используются ли --full-history и/или переписывание родителей (с помощью --parents или --children). Доступны следующие настройки.
- Режим по умолчанию
-
Коммиты включаются, если они не являются TREESAME ни относительно одного из родителей (это можно изменить; см. ниже
--sparse). Если коммит является слиянием и он TREESAME относительно одного из родителей, переход выполняется только к этому родителю. (Даже если родителей TREESAME несколько, переход выполняется только к одному из них.) В противном случае переход выполняется ко всем родителям.В результате получается:
.-A---N---O / / / I---------DОбратите внимание, что правило перехода только к родителю TREESAME, если он есть, полностью исключило из рассмотрения
B.Cрассматривался черезN, но является TREESAME. Корневые коммиты сравниваются с пустым деревом, поэтомуIявляется !TREESAME.Связи между родителями и потомками видны только с
--parents, но это не влияет на коммиты, выбранные в режиме по умолчанию, поэтому линии родителей показаны. -
--full-historyбез переписывания родителей -
Этот режим отличается от режима по умолчанию одним: всегда выполняется переход ко всем родителям слияния, даже если оно TREESAME относительно одного из них. Даже если включены коммиты с обеих сторон слияния, это не означает, что включается и само слияние! В нашем примере получаем:
I A B N D O P Q
Mисключён, поскольку он TREESAME относительно обоих родителей. ДляE,CиBпереход выполнялся, но толькоBбыл !TREESAME, поэтому остальные не отображаются.Обратите внимание: без переписывания родителей фактически невозможно говорить о связях между родителями и потомками коммитов, поэтому они показаны несвязанными.
-
--full-historyс переписыванием родителей -
Обычные коммиты включаются только в том случае, если они являются !TREESAME (это можно изменить; см. ниже
--sparse).Слияния включаются всегда. Однако их списки родителей переписываются: вдоль каждого родителя отсекаются коммиты, которые сами не включены. В результате получается:
.-A---M---N---O---P---Q / / / / / I B / D / \ / / / / `-------------'Сравните с режимом
--full-historyбез переписывания выше. Обратите внимание:Eбыл отсечён, поскольку он TREESAME, но список родителей P был переписан так, чтобы включать родителя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=HD..Mдаст следующий результат:E \ C---G---H---I---J \ L--MА
--ancestry-path=KD..Mдаст следующий результат:K---------------L--M
Прежде чем обсуждать ещё один параметр, --show-pulls, создадим новый пример истории.
При просмотре упрощённой истории пользователи часто сталкиваются с проблемой: известный им коммит, который каким-то образом изменил файл, не отображается в упрощённой истории этого файла. Рассмотрим новый пример и посмотрим, как в этом случае работают такие параметры, как --full-history и --simplify-merges:
.-A---M-----C--N---O---P
/ / \ \ \/ / /
I B \ R-'`-Z' /
\ / \/ /
\ / /\ /
`---X--' `---Y--' В этом примере предположим, что I создал file.txt, который был изменён разными способами в коммитах A, B и X. Коммиты с одним родителем C, Z и Y не изменяют file.txt. Коммит слияния M был создан разрешением конфликта слияния, включающим оба изменения из A и B, поэтому он не является TREESAME ни относительно одного из них. Коммит слияния R, напротив, был создан путём игнорирования содержимого file.txt в M и использования только содержимого file.txt в X. Поэтому R является TREESAME относительно X, но не относительно M. Наконец, естественное разрешение слияния для создания N — использовать содержимое file.txt в R, поэтому N является TREESAME относительно R, но не относительно C. Коммиты слияния O и P являются TREESAME относительно своих первых родителей, но не относительно вторых родителей — соответственно, Z и Y.
В режиме по умолчанию у N и R есть родитель TREESAME, поэтому переход выполняется по этим рёбрам, а остальные игнорируются. В результате получается следующий граф истории:
I---X
При использовании --full-history Git проходит по каждому ребру. Так будут обнаружены коммиты A и B, а также слияние M, но также будут показаны коммиты слияния O и P. С переписыванием родителей получится следующий граф:
.-A---M--------N---O---P
/ / \ \ \/ / /
I B \ R-'`--' /
\ / \/ /
\ / /\ /
`---X--' `------' В этом случае коммиты слияния O и P создают лишний шум, поскольку фактически не внесли изменений в file.txt. Они лишь объединили тему, основанную на более старой версии file.txt. Это распространённая проблема в репозиториях, где многие участники работают параллельно и сливают свои тематические ветки в одну основную: в результатах --full-history появляется множество не связанных между собой слияний.
При использовании параметра --simplify-merges коммиты O и P исчезают из результатов. Это происходит потому, что переписанные вторые родители O и P доступны из их первых родителей. Эти рёбра удаляются, и тогда коммиты выглядят как коммиты с одним родителем, являющиеся TREESAME относительно своего родителя. То же происходит с коммитом N, в результате чего история выглядит так:
.-A---M--.
/ / \
I B R
\ / /
\ / /
`---X--' В этом представлении видны все важные изменения в коммитах с одним родителем: A, B и X. Также видно тщательно разрешённое слияние M и не столь тщательно разрешённое слияние R. Обычно этой информации достаточно, чтобы понять, почему коммиты A и B «исчезли» из истории в представлении по умолчанию. Однако у такого подхода есть несколько проблем.
Первая проблема — производительность. В отличие от всех предыдущих параметров, параметр --simplify-merges требует пройти по всей истории коммитов, прежде чем вернуть хотя бы один результат. Поэтому этот параметр может быть неудобно использовать в очень больших репозиториях.
Вторая проблема связана с аудитом. Когда над одним репозиторием работает много участников, важно знать, какие коммиты слияния внесли изменение в важную ветку. Проблемное слияние R, показанное выше, скорее всего, не является тем коммитом слияния, который использовался для слияния в важную ветку. Вместо него для слияния R и X в важную ветку использовался коммит N. В сообщении этого коммита может содержаться объяснение того, почему изменение X стало приоритетнее изменений из A и B.
-
--show-pulls -
В дополнение к коммитам, показываемым в истории по умолчанию, отображать каждый коммит слияния, который не является TREESAME относительно своего первого родителя, но является TREESAME относительно более позднего родителя.
Когда коммит слияния включается с помощью
--show-pulls, слияние рассматривается так, как будто оно «подтянуло» изменение из другой ветки. При использовании--show-pullsв этом примере (без других параметров) получается следующий граф:I---X---R---N
Здесь включены коммиты слияния
RиN, поскольку они соответственно подтянули коммитыXиRв базовую ветку. Именно из-за этих слияний коммитыAиBне отображаются в истории по умолчанию.Если использовать
--show-pullsвместе с--simplify-merges, граф будет содержать всю необходимую информацию:.-A---M--. N / / \ / I B R \ / / \ / / `---X--'Обратите внимание: поскольку
Mдоступен изR, ребро отNкMбыло упрощено и удалено. ОднакоNпо-прежнему присутствует в истории как важный коммит, поскольку он «подтянул» изменениеRв основную ветку.
Параметр --simplify-by-decoration позволяет увидеть общую картину топологии истории, опуская коммиты, на которые не ссылаются теги. Коммиты помечаются как !TREESAME (то есть сохраняются после применения описанных выше правил упрощения истории), если (1) на них ссылаются теги или (2) они изменяют содержимое путей, указанных в командной строке. Все остальные коммиты помечаются как TREESAME (и могут быть упрощены и удалены).
Порядок коммитов
По умолчанию коммиты отображаются в обратном хронологическом порядке.
-
--date-order -
Не отображать ни одного родителя, пока не отображены все его потомки; в остальном отображать коммиты в порядке временных меток коммитов.
-
--author-date-order -
Не отображать ни одного родителя, пока не отображены все его потомки; в остальном отображать коммиты в порядке временных меток автора.
-
--topo-order -
Не отображать ни одного родителя, пока не отображены все его потомки, и не смешивать коммиты из разных линий истории.
Например, если история коммитов выглядит так:
---1----2----4----7 \ \ 3----5----6----8---где числа обозначают порядок временных меток коммитов, параметры
gitrev-listи их аналоги с--date-orderотображают коммиты в порядке временных меток: 8 7 6 5 4 3 2 1.С параметром
--topo-orderкоммиты будут отображены в порядке 8 6 5 3 7 4 2 1 (или 8 7 4 2 6 5 3 1); некоторые более старые коммиты отображаются раньше новых, чтобы не смешивать коммиты из двух параллельных линий разработки. -
--reverse -
Выводить выбранные для отображения коммиты (см. раздел
Commit Limitingвыше) в обратном порядке. Нельзя использовать вместе с--walk-reflogs.
Обход объектов
Эти параметры в основном предназначены для упаковки репозиториев Git.
-
--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]), аннотированные к коммиту, при выводе сообщения журнала коммита. По умолчанию этот параметр используется командами
gitlog,gitshowиgitwhatchanged, если в командной строке не заданы параметры--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», затем год из четырёх цифр и сведения о часовом поясе, если не используется местный часовой пояс; например,ThuJan100:00:001970+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показывают фактические родительские коммиты, не учитывая подмену истории или её упрощение. Обратите внимание, что этот формат влияет на способ отображения коммитов, но не на способ отображения разницы, например при использованииgitlog--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 -
имя ссылки, указанное в командной строке, по которой был достигнут коммит (например,
gitlog--source); работает только сgitlog -
%e -
кодировка
-
%s -
тема
-
%f -
очищенная строка темы, подходящая для имени файла
-
%b -
тело
-
%B -
необработанное тело (тема и тело без переноса строк)
-
%N -
заметки к коммиту
-
%GG -
необработанное сообщение проверки подписи GPG для подписанного коммита
- %G?
-
вывести «G» для хорошей (действительной) подписи, «B» для плохой подписи, «U» для хорошей подписи с неизвестной достоверностью, «X» для хорошей подписи с истёкшим сроком действия, «Y» для хорошей подписи, сделанной ключом с истёкшим сроком действия, «R» для хорошей подписи, сделанной отозванным ключом, «E», если подпись невозможно проверить (например, отсутствует ключ), и «N», если подписи нет
-
%GS -
вывести имя подписавшего подписанный коммит
-
%GK -
вывести ключ, использованный для подписи коммита
-
%GF -
вывести отпечаток ключа, использованного для подписи коммита
-
%GP -
вывести отпечаток основного ключа, подчинённый ключ которого использовался для подписи коммита
-
%GT -
вывести уровень доверия к ключу, использованному для подписи коммита
-
%gD -
селектор reflog, например
refs/stash@{1}илиrefs/stash@{2minutesago}; формат соответствует правилам, описанным для параметра-g. Часть перед@— это имя ссылки, заданное в командной строке (так,gitlog-grefs/heads/masterдастrefs/heads/master@{0}). -
%gd -
сокращённый селектор reflog; то же, что
%gD, но часть с именем ссылки сокращается для удобства чтения (например,refs/heads/masterпревращается просто вmaster). -
%gn -
имя идентификатора reflog
-
%gN -
имя идентификатора reflog (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%ge -
адрес электронной почты идентификатора reflog
-
%gE -
адрес электронной почты идентификатора reflog (с учётом .mailmap, см. git-shortlog[1] или git-blame[1])
-
%gs -
тема reflog
-
%(trailers[:<option>,...]) -
вывести завершающие строки тела в соответствии с интерпретацией команды git-interpret-trailers[1]. За строкой
trailersмогут следовать двоеточие и ноль или несколько параметров, разделённых запятыми. Если один и тот же параметр указан несколько раз, используется его последнее значение.-
key=<key> -
выводить только завершающие строки с указанным <key>. Сопоставление не учитывает регистр, завершающее двоеточие необязательно. Если параметр указан несколько раз, выводятся строки, соответствующие любому из ключей. Этот параметр автоматически включает параметр
only, чтобы скрыть строки блока завершающих строк, которые сами не являются завершающими. Если это нежелательно, отключите его с помощьюonly=false. Например,%(trailers:key=Reviewed-by) выводит завершающие строки с ключомReviewed-by. -
only[=<bool>] -
определяет, включать ли строки блока завершающих строк, которые сами не являются завершающими.
-
separator=<sep> -
задаёт разделитель между завершающими строками. По умолчанию используется символ перевода строки. Строка <sep> может содержать буквальные коды форматирования, описанные выше. Чтобы использовать запятую в качестве разделителя, необходимо указать
%x2C, иначе она будет разобрана как начало следующего параметра. Например,%(trailers:key=Ticket,separator=%x2C) выводит все завершающие строки с ключомTicket, разделяя их запятой и пробелом. -
unfold[=<bool>] -
обеспечивает работу так, как если бы был указан параметр
--unfoldкоманды interpret-trailer. Например,%(trailers:only,unfold=true) разворачивает и выводит все завершающие строки. -
keyonly[=<bool>] -
выводить только часть завершающей строки с ключом.
-
valueonly[=<bool>] -
выводить только часть завершающей строки со значением.
-
key_value_separator=<sep> -
задаёт разделитель между ключом и значением каждой завершающей строки. По умолчанию используется «: ». В остальном действует та же семантика, что и для
separator=<sep> выше.
-
ПримечаниеНекоторые подстановочные элементы могут зависеть от других параметров, переданных механизму обхода ревизий. Например, параметры reflog %g*вставят пустую строку, если мы не обходим записи reflog (например, с помощьюgitlog-g). Подстановочные элементы%dи%Dиспользуют формат оформления «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. Полезно для подавления вывода таких команд, как
gitshow, которые по умолчанию показывают патч, или для отмены действия таких параметров, как--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не влияет наgitformat-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, но показывает число добавленных и удалённых строк в десятичном формате и полный путь без сокращений, что удобнее для машинной обработки. Для двоичных файлов выводит два значения-вместо строки00. -
--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илиgitapply; этот параметр предназначен только для тех, кто хочет сосредоточиться на проверке текста после изменения. Кроме того, в выводе явно недостаточно информации для применения такого 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). Эти параметры были разработаны главным образом для командыgitdifftoolи могут быть мало полезны в других случаях. -
-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 -
Показывать всю функцию в качестве строк контекста для каждого изменения. Имена функций определяются так же, как команда
gitdiffформирует заголовки фрагментов 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 -
По умолчанию записи, добавленные командой
gitadd-N, отображаются как существующий пустой файл вgitdiffи как новый файл вgitdiff--cached. Этот параметр отображает запись как новый файл вgitdiffи как отсутствующий файл вgitdiff--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--foofoo/bar:foo/bar/baz -
--max-depth=2--foo:foo/bar/baz
Если шаблон пути не задан, глубина измеряется так, как если бы были указаны все записи верхнего уровня. Обратите внимание, что это отличается от измерения от корня: в этом случае
--max-depth=0по-прежнему вернётfoo. Это позволяет ограничить глубину, запросив при этом подмножество записей верхнего уровня.Обратите внимание, что этот параметр поддерживается только для различий между объектами дерева, но не для сравнений с индексом или рабочим деревом.
-
Более подробное объяснение этих общих параметров см. также в gitdiffcore[7].
Создание текста патча с помощью -p
Запуск git-diff[1], git-log[1], git-show[1], git-diff-index[1], git-diff-tree[1] или git-diff-files[1] с параметром -p создаёт текст патча. Создание текста патча можно настроить с помощью переменных среды GIT_EXTERNAL_DIFF и GIT_DIFF_OPTS (см. git[1]) и атрибута diff (см. gitattributes[5]).
Результат работы параметра -p немного отличается от традиционного формата diff:
-
Перед ним располагается заголовок «git diff» следующего вида:
diff --git a/file1 b/file2
Имена файлов
a/иb/совпадают, если не выполняется переименование или копирование. В частности, даже при создании или удалении файла/dev/nullnotиспользуется вместо имён файловa/илиb/.При переименовании или копировании
file1иfile2обозначают соответственно имя исходного файла и имя файла, полученного в результате переименования или копирования. -
За ним следуют одна или несколько строк расширенного заголовка:
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>включается, если режим файла не меняется; в противном случае старый и новый режимы указываются в отдельных строках. -
Имена путей с «необычными» символами заключаются в кавычки, как описано для переменной конфигурации
core.quotePath(см. git-config[1]). -
Все файлы
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
-
В заголовках блоков 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); -
Перед ним располагается заголовок «git diff» следующего вида (при использовании параметра
-c):diff --combined file
или следующего вида (при использовании параметра
--cc):diff --cc file
-
За ним следуют одна или несколько строк расширенного заголовка (в этом примере показано слияние с двумя родителями):
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. -
Далее следует двухстрочный заголовок исходного и целевого файлов:
--- a/file +++ b/file
Как и в двухстрочном заголовке традиционного формата diff
unified,/dev/nullиспользуется для обозначения созданных или удалённых файлов.Однако, если указан параметр --combined-all-paths, вместо двухстрочного заголовка исходного и целевого файлов выводится заголовок из N+1 строк, где N — количество родителей коммита слияния:
--- a/file --- a/file --- a/file +++ b/file
Этот расширенный формат может быть полезен при активном обнаружении переименований или копирования: он позволяет увидеть исходное имя файла у разных родителей.
-
Формат заголовка блока изменён, чтобы не допустить случайной передачи такого вывода команде
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, она же «их версия»).
Примеры
-
gitlog--no-merges -
Показать всю историю коммитов, пропуская слияния
-
gitlogv2.6.12..include/scsidrivers/scsi -
Показать все коммиты начиная с версии
v2.6.12, в которых изменялся какой-либо файл в подкаталогахinclude/scsiилиdrivers/scsi -
gitlog--since="2weeksago"--gitk -
Показать изменения файла
gitkза последние две недели. Параметр--необходим, чтобы избежать путаницы с веткой с именемgitk -
gitlog--name-statusrelease..test -
Показать коммиты, которые есть в ветке «
test», но ещё отсутствуют в ветке «release», а также список путей, изменённых каждым коммитом. -
gitlog--followbuiltin/rev-list.c -
Показать коммиты, в которых изменялся
builtin/rev-list.c, в том числе коммиты, созданные до того, как файлу присвоили его нынешнее имя. -
gitlog--branches--not--remotes=origin -
Показать все коммиты, которые есть в каких-либо локальных ветках, но отсутствуют во всех ветках отслеживания удалённого репозитория для
origin(то, что есть у вас, но отсутствует у origin). -
gitlogmaster--not--remotes=*/master -
Показать все коммиты, которые есть в локальной ветке master, но отсутствуют в ветках master любых удалённых репозиториев.
-
gitlog-p-m--first-parent -
Показать историю вместе с diff изменений, но только с точки зрения «основной ветки», пропуская коммиты из слитых веток и показывая полный diff изменений, внесённых слияниями. Это имеет смысл только при строгой политике слияния всех тематических веток, когда работа ведётся в одной интеграционной ветке.
-
gitlog-L/intmain/',/^}/:main.c -
Показать, как со временем менялась функция
main() в файлеmain.c. -
gitlog-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 и многие другие, но
notUTF-16/32, EBCDIC и многобайтовые кодировки CJK (GBK, Shift-JIS, Big5, EUC-x, CP9xx и т. д.).
Хотя мы рекомендуем кодировать сообщения журналов коммитов в UTF-8, базовая система и Git Porcelain разработаны так, чтобы не навязывать UTF-8 проектам. Если всем участникам проекта удобнее использовать устаревшие кодировки, Git этого не запрещает. Однако следует учитывать несколько моментов.
-
gitcommitиgitcommit-treeвыдают предупреждение, если переданное им сообщение журнала коммита не похоже на допустимую строку UTF-8, если только явно не указать, что в проекте используется устаревшая кодировка. Для этого в файле.git/configнужно указатьi18n.commitEncoding, например:[i18n] commitEncoding = ISO-8859-1В объектах коммитов, созданных с этой настройкой, значение
i18n.commitEncodingзаписывается в заголовокencoding. Это помогает другим людям, которые будут просматривать их позднее. Если этот заголовок отсутствует, предполагается, что сообщение журнала коммита закодировано в UTF-8. -
gitlog,gitshow,gitblameи другие команды проверяют заголовокencodingобъекта коммита и пытаются перекодировать сообщение журнала в UTF-8, если не указано иное. Желаемую выходную кодировку можно задать с помощьюi18n.logOutputEncodingв файле.git/config, например:[i18n] logOutputEncoding = ISO-8859-1Если эта переменная конфигурации не задана, вместо неё используется значение
i18n.commitEncoding.
Обратите внимание, что мы намеренно не стали перекодировать сообщение журнала коммита при создании коммита, чтобы принудительно использовать UTF-8 на уровне объекта коммита: преобразование в UTF-8 не всегда является обратимой операцией.
Конфигурация
См. git-config[1] для основных переменных и git-diff[1] для настроек, связанных с созданием 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 аналогично использованию параметраgitlog--date. Подробности см. в git-log[1].Если задан формат "auto:foo" и используется пейджер, для даты будет применён формат "foo". В противном случае будет использоваться "default".
-
log.decorate -
Выводит имена ссылок для всех коммитов, отображаемых командой log. Возможные значения:
-
short -
префиксы имён ссылок
refs/heads/,refs/tags/иrefs/remotes/не выводятся. -
full -
выводится полное имя ссылки (включая префикс).
-
auto -
если вывод направлен в терминал, имена ссылок отображаются так, как если бы был указан параметр
short, в противном случае имена ссылок не отображаются.
Это эквивалентно параметру
--decorateкомандыgitlog. -
-
log.initialDecorationSet -
По умолчанию
gitlogпоказывает украшения только для некоторых известных пространств имён ссылок. Если заданall, все ссылки отображаются как украшения. -
log.excludeDecoration -
Исключает указанные шаблоны из украшений журнала. Это похоже на параметр командной строки
--decorate-refs-exclude, но параметр конфигурации можно переопределить параметром--decorate-refs. -
log.diffMerges -
Задаёт формат diff, используемый при указании
--diff-merges=on; подробности см. в разделе--diff-mergesв git-log[1]. По умолчанию используетсяseparate. -
log.follow -
Если
true,gitlogбудет вести себя так, как если бы был указан параметр--follow, когда задан один <path>. Это имеет те же ограничения, что и--follow: например, этот параметр нельзя использовать для отслеживания нескольких файлов, и он плохо работает с нелинейной историей. -
log.graphColors -
Список цветов, разделённых запятыми, которые можно использовать для отрисовки линий истории в
gitlog--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 или параметр указан несколько раз), из которой следует считывать заметки при отображении сообщений коммитов с помощью команд семейства
gitlog, помимо набора по умолчанию, заданного параметром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