Spec-Zone.ru › Git

git-diff-tree

Название

git-diff-tree — сравнивает содержимое и режим объектов blob, найденных с помощью двух объектов дерева

Синтаксис

git diff-tree [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty]
              [-t] [-r] [-c | --cc] [--combined-all-paths] [--root] [--merge-base]
              [<common-diff-options>] <tree-ish> [<tree-ish>] [<path>…​]

Описание

Сравнивает содержимое и режим объектов blob, найденных с помощью двух объектов дерева.

Если указан только один <tree-ish>, коммит сравнивается с его родителями (см. --stdin ниже).

Обратите внимание, что git diff-tree может использовать дерево, заключённое в объекте коммита.

Параметры

-p
-u
--patch

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

-s
--no-patch

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

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

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

--output=<file>

Выводить данные в указанный файл вместо стандартного вывода.

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

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

--raw

Создать diff в необработанном формате. Это поведение по умолчанию.

--patch-with-raw

Синоним -p --raw.

--indent-heuristic

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

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

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

--anchored=<text>

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

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

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

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

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

default
myers

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

minimal

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

patience

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

histogram

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

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

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

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

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

--compact-summary

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

--numstat

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

--shortstat

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

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

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

changes

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

lines

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

files

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

cumulative

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

<limit>

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

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

--cumulative

Синоним --dirstat=cumulative.

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

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

--summary

Вывести краткую сводку расширенной информации заголовка, например о создании, переименовании и изменении режима файлов.

--patch-with-stat

Синоним -p --stat.

-z

Если указан параметр --raw, --numstat, --name-only или --name-status, не преобразовывать имена путей и использовать 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. В этом формате перечисляются коммиты в диапазоне, как это делает команда summary из git-submodule[1]. Если указано значение --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

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

Определяет, следует ли использовать пустые blob-объекты в качестве источника переименования.

--check

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

--ws-error-highlight=<kind>

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

--full-index

При создании вывода в формате патча показывать в строке «index» полные имена объектов blob до и после изменения вместо первых нескольких символов.

--binary

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

--abbrev[=<n>]

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

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

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

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

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

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

Обнаруживать переименования. Если задано <n>, оно определяет порог индекса сходства (то есть объём добавлений и удалений относительно размера файла). Например, -M90% означает, что Git должен считать пару удаление/добавление переименованием, если более 90% файла не изменилось. Если знак % отсутствует, число следует читать как дробь с десятичной точкой перед ним. То есть -M5 становится 0.5 и, таким образом, эквивалентно -M50%. Аналогично, -M05 эквивалентно -M5%. Чтобы ограничить обнаружение только точными переименованиями, используйте -M100%. Индекс сходства по умолчанию равен 50%.

-C[<n>]
--find-copies[=<n>]

Обнаруживать копирования, а также переименования. См. также --find-copies-harder. Если задано <n>, оно имеет то же значение, что и для -M<n>.

--find-copies-harder

Для повышения производительности по умолчанию параметр -C обнаруживает копирования только в том случае, если исходный файл копии был изменён в том же наборе изменений. Этот флаг заставляет команду проверять неизменённые файлы на предмет возможного источника копирования. Для больших проектов эта операция обходится очень дорого, поэтому используйте её с осторожностью. Несколько указаний параметра -C имеют тот же эффект.

-D
--irreversible-delete

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

При использовании вместе с -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). Можно использовать любую комбинацию символов фильтра (в том числе пустую). Если к комбинации добавлен * (все или ни одного), выбираются все пути, если при сравнении найдётся хотя бы один файл, соответствующий другим критериям; если таких файлов нет, не выбирается ничего.

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

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

-S<string>

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

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

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

-G<regex>

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

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

+    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, патчи двоичных файлов без фильтра textconv будут игнорироваться.

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

--find-object=<object-id>

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

Объектом может быть blob или коммит подмодуля. В параметре git-log подразумевается параметр -t, позволяющий также находить деревья.

--pickaxe-all

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

--pickaxe-regex

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

-O<orderfile>

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

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

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

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

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

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

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

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

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

-R

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

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

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

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

-W
--function-context

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

--exit-code

Завершать работу программы с кодами, аналогичными кодам diff(1). То есть возвращать 1, если обнаружены различия, и 0, если различий нет.

--quiet

Отключить весь вывод программы. Подразумевает --exit-code. Запрещает выполнение внешних помощников для сравнения, коду завершения которых нельзя доверять, то есть если соответствующий параметр конфигурации diff.trustExitCode или diff.<driver>.trustExitCode либо переменная среды GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE имеет значение false.

--ext-diff

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

--no-ext-diff

Запретить внешние драйверы сравнения.

--textconv
--no-textconv

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

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

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

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

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

--no-prefix

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

--default-prefix

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

--line-prefix=<prefix>

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

--ita-invisible-in-index

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

--max-depth=<depth>

Для каждого pathspec, указанного в командной строке, спускаться не более чем на <depth> уровней каталогов. Значение -1 означает отсутствие ограничений. Нельзя сочетать с подстановочными знаками в pathspec. Для дерева, содержащего foo/bar/baz, в следующем списке показаны совпадения, полученные для каждого набора параметров:

  • --max-depth=0 -- foo: foo

  • --max-depth=1 -- foo: foo/bar

  • --max-depth=1 -- foo/bar: foo/bar/baz

  • --max-depth=1 -- foo foo/bar: foo/bar/baz

  • --max-depth=2 -- foo: foo/bar/baz

Если pathspec не указан, глубина измеряется так, как если бы были заданы все записи верхнего уровня. Обратите внимание, что это отличается от измерения от корня: --max-depth=0 по-прежнему вернёт foo. Это позволяет ограничить глубину, запрашивая подмножество записей верхнего уровня.

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

Более подробное объяснение этих общих параметров см. также в gitdiffcore[7].

<tree-ish>

Идентификатор объекта дерева.

<path>…​

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

-r

Рекурсивно обходить поддеревья.

-t

Показывать саму запись дерева, а также поддеревья. Подразумевает -r.

--root

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

--merge-base

Вместо непосредственного сравнения <tree-ish> используется база слияния двух <tree-ish> в качестве стороны «до». Необходимо указать два <tree-ish>, и оба должны быть коммитами.

--stdin

Если указан --stdin, команда не принимает аргументы <tree-ish> из командной строки. Вместо этого она считывает из стандартного ввода строки, содержащие либо два <tree>, либо один <commit>, либо список <commit>. (В качестве разделителя используется один пробел.)

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

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

Следующие флаги дополнительно влияют на поведение при сравнении коммитов (но не деревьев).

-m

По умолчанию git diff-tree --stdin не показывает различия для коммитов слияния. С этим флагом показываются различия между данным коммитом и каждым из его родителей. См. также -c.

-s

По умолчанию git diff-tree --stdin показывает различия: либо в машиночитаемом формате (без -p), либо в виде патча (с -p). Этот вывод можно подавить. Он полезен только с флагом -v.

-v

Этот флаг заставляет git diff-tree --stdin также показывать сообщение коммита перед различиями.

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

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

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

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

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

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

--no-abbrev-commit

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

--oneline

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

--encoding=<encoding>

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

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

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

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

--notes[=<ref>]

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

По умолчанию показываются заметки из ссылок на заметки, перечисленных в переменных 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», так и из ссылок на заметки по умолчанию.

--no-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, и показать результат.

--no-commit-id

Когда это применимо, git diff-tree выводит строку с идентификатором коммита. Этот флаг подавляет вывод идентификатора коммита.

-c

Этот флаг изменяет способ отображения коммита слияния (поэтому он полезен только тогда, когда команде передан один <tree-ish> или --stdin). Он одновременно показывает различия между результатом слияния и каждым из родителей, вместо того чтобы поочерёдно показывать попарные различия между родителем и результатом (так работает параметр -m). Кроме того, выводятся только файлы, изменённые относительно всех родителей.

--cc

Этот флаг изменяет способ отображения патча коммита слияния аналогично параметру -c. Он подразумевает параметры -c и -p, а также дополнительно сжимает вывод патча, опуская несущественные фрагменты, содержимое которых у родителей имеет только два варианта, а результат слияния без изменений выбирает один из них. Если все фрагменты несущественны, сам коммит и сообщение журнала коммита не показываются, как и в любом другом случае «пустого различия».

--combined-all-paths

Этот флаг заставляет объединённые различия (используемые для коммитов слияния) выводить имя файла для всех родителей. Поэтому он действует только при указании -c или --cc и, вероятно, полезен только при обнаружении изменений имён файлов (то есть если запрошено обнаружение переименований или копирований).

--always

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

Форматы вывода

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

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

oneline
<hash> <title-line>

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

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

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

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

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

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

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

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

raw

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

format:<format-string>

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

Например, format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" выведет примерно следующее:

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

Доступны следующие заполнители:

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

    %n

    символ новой строки

    %%

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

    %x00

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

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

    %Cred

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

    %Cgreen

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

    %Cblue

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

    %Creset

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

    %C(<spec>)

    спецификация цвета, описанная в разделе Values («Значения») раздела "CONFIGURATION FILE" («Файл конфигурации») в git-config[1]. По умолчанию цвета отображаются, только если они включены для вывода журнала (параметром color.diff, color.ui или --color; если вывод направляется в терминал, также учитываются настройки auto первого параметра). %C(auto,<spec>) принимается как устаревший синоним значения по умолчанию (например, %C(auto,red)). Указание %C(always,<spec>) позволяет отображать цвета, даже если в остальных случаях они отключены (однако вместо этого можно использовать --color=always, чтобы включить цвета для всего вывода, в том числе для этого формата и любых других элементов, которые Git может раскрашивать). Самостоятельное использование auto (то есть %C(auto)) включает автоматическую раскраску следующих заполнителей до следующего переключения цвета.

    %m

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

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

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

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

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

    %<|(<m> )

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

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

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

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

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

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

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

  • Заполнители, раскрывающиеся в информацию, извлечённую из коммита:

    %H

    хеш коммита

    %h

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

    %T

    хеш дерева

    %t

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

    %P

    хеши родительских коммитов

    %p

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

    %an

    имя автора

    %aN

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

    %ae

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

    %aE

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

    %al

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

    %aL

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

    %ad

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

    %aD

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

    %ar

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

    %at

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

    %ai

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

    %aI

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

    %as

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

    %ah

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

    %cn

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

    %cN

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

    %ce

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

    %cE

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

    %cl

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

    %cL

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

    %cd

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

    %cD

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

    %cr

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

    %ct

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

    %ci

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

    %cI

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

    %cs

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

    %ch

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

    %d

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

    %D

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

    %(count)

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

    %(total)

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

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

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

    prefix=<value>

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

    suffix=<value>

    Выводится после списка имён ссылок. По умолчанию — «)».

    separator=<value>

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

    pointer=<value>

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

    tag=<value>

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

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

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

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

    tags[=<bool-value>]

    Помимо аннотированных тегов учитывать также облегчённые теги.

    abbrev=<number>

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

    match=<pattern>

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

    exclude=<pattern>

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

    %S

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

    %e

    кодировка

    %s

    тема

    %f

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

    %b

    тело сообщения

    %B

    исходное тело сообщения (неперенесённые тема и тело)

    %N

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

    %GG

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

    %G?

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

    %GS

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

    %GK

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

    %GF

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

    %GP

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

    %GT

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

    %gD

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

    %gd

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

    %gn

    имя пользователя reflog

    %gN

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

    %ge

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

    %gE

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

    %gs

    тема reflog

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

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

    key=<key>

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

    only[=<bool>]

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

    separator=<sep>

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

    unfold[=<bool>]

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

    keyonly[=<bool>]

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

    valueonly[=<bool>]

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

    key_value_separator=<sep>

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

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

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

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

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

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

tformat:

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

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

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

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

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

Формат необработанного вывода

Формат необработанного вывода команд git-diff-index, git-diff-tree, git-diff-files и git diff --raw очень похож.

Все эти команды сравнивают два набора объектов; различается то, что сравнивается:

git-diff-index <tree-ish>

сравнивает <tree-ish> и файлы в файловой системе.

git-diff-index --cached <tree-ish>

сравнивает <tree-ish> и индекс.

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]

сравнивает деревья, указанные двумя аргументами.

git-diff-files [<pattern>...]

сравнивает индекс и файлы в файловой системе.

Все команды выводят по одной строке на каждый изменённый файл, кроме git diff-files в случае неразрешённого конфликта в файле: тогда выводятся строки "unmerged" и "in-place edit".

Строка вывода имеет следующий формат:

in-place edit  :100644 100644 bcd1234 0123456 M file0
copy-edit      :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit    :100644 100644 abcd123 1234567 R86 file1 file3
create         :000000 100644 0000000 1234567 A file4
delete         :100644 000000 1234567 0000000 D file5
unmerged       :000000 000000 0000000 0000000 U file6

То есть слева направо:

  1. двоеточие.

  2. режим для "src"; 000000 при создании или если "src" взят из индекса и содержит неразрешённый конфликт.

  3. пробел.

  4. режим для "dst"; 000000 при удалении или если "dst" взят из индекса и содержит неразрешённый конфликт.

  5. пробел.

  6. sha1 для "src"; 0{40} при создании или если "src" взят из индекса и содержит неразрешённый конфликт.

  7. пробел.

  8. sha1 для "dst"; 0{40} при удалении, если "dst" взят из индекса и содержит неразрешённый конфликт или если "dst" взят из рабочего дерева и не синхронизирован с индексом.

  9. пробел.

  10. статус, за которым может следовать число «оценки».

  11. табуляция или NUL, если используется параметр -z.

  12. путь для "src"

  13. табуляция или NUL, если используется параметр -z; присутствует только для C или R.

  14. путь для "dst"; присутствует только для C или R.

  15. LF или NUL, если используется параметр -z, для завершения записи.

Возможные буквы статуса:

  • A: добавление файла

  • C: копирование файла в новый файл

  • D: удаление файла

  • M: изменение содержимого или режима файла

  • R: переименование файла

  • T: изменение типа файла (обычный файл, символическая ссылка или подмодуль)

  • U: файл содержит неразрешённый конфликт (прежде чем зафиксировать его, необходимо завершить слияние)

  • X: «неизвестный» тип изменения (скорее всего, ошибка; сообщите о ней)

После букв статуса C и R всегда следует оценка (процент сходства между исходным и целевым объектами перемещения или копирования). После буквы статуса M может следовать оценка (процент различия) для переписанных файлов.

Если файл в файловой системе не синхронизирован с индексом, sha1 для "dst" отображается как набор нулей.

Пример:

:100644 100644 5be4a4a 0000000 M file.c

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

Формат diff для слияний

Для вывода diff также для коммитов слияния в командах git-diff-tree, git-diff-files и git-diff --raw можно указать параметр -c или --cc. Вывод отличается от описанного выше формата следующим образом:

  1. для каждого родителя выводится двоеточие;

  2. выводится больше режимов "src" и значений sha1 для "src";

  3. статусы объединяются: для каждого родителя выводится символ статуса;

  4. не выводится необязательное число «оценки»;

  5. имя пути к файлу выводится с разделением табуляцией.

Для -c и --cc выводится только путь назначения или конечный путь, даже если файл был переименован в какой-либо части истории. С параметром --combined-all-paths сначала выводится имя пути в каждом родителе, а затем имя пути в коммите слияния.

Примеры для -c и --cc без --combined-all-paths:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM        desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM        bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR        phooey.c

Примеры при добавлении --combined-all-paths к -c или --cc:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM        desc.c        desc.c        desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM        foo.sh        bar.sh        bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR        fooey.c        fuey.c        phooey.c

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

Создание текста патча с помощью -p

При запуске git-diff[1], git-log[1], git-show[1], git-diff-index[1], git-diff-tree[1] или git-diff-files[1] с параметром -p создаётся текст патча. Создание текста патча можно настроить с помощью переменных окружения GIT_EXTERNAL_DIFF и GIT_DIFF_OPTS (см. git[1]), а также атрибута diff (см. gitattributes[5]).

Результат работы параметра -p немного отличается от традиционного формата diff:

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

    diff --git a/file1 b/file2

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

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

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

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

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

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

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

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

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

  4. Все файлы file1 в выводе соответствуют файлам до коммита, а все файлы file2 — файлам после коммита. Нельзя последовательно применять каждое изменение к каждому файлу. Например, этот патч поменяет местами a и b:

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. В заголовках фрагментов указывается имя функции, к которой относится фрагмент. Подробности о настройке этого параметра для конкретных языков см. в разделе «Определение пользовательского заголовка фрагмента» в gitattributes[5].

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

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

Формат «объединённого diff» выглядит так:

diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
        return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  }

- static void describe(char *arg)
 -static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
  {
 +        unsigned char sha1[20];
 +        struct commit *cmit;
        struct commit_list *list;
        static int initialized = 0;
        struct commit_name *n;

 +        if (get_sha1(arg, sha1) < 0)
 +                usage(describe_usage);
 +        cmit = lookup_commit_reference(sha1);
 +        if (!cmit)
 +                usage(describe_usage);
 +
        if (!initialized) {
                initialized = 1;
                for_each_ref(get_name);
  1. Перед ним выводится заголовок "git diff" следующего вида (если используется параметр -c):

    diff --combined file

    или такого (если используется параметр --cc):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие форматы diff

Параметр --summary описывает добавленные, удалённые, переименованные и скопированные файлы. Параметр --stat добавляет в вывод график diffstat(1). Эти параметры можно сочетать с другими параметрами, например -p; они предназначены для чтения человеком.

При отображении изменения, связанного с переименованием или копированием, формат вывода --stat компактно представляет имена путей, объединяя их общие префикс и суффикс. Например, изменение, при котором arch/i386/Makefile перемещается в arch/x86/Makefile и одновременно изменяются 4 строки, будет показано так:

arch/{i386 => x86}/Makefile    |   4 +--

Параметр --numstat предоставляет сведения diffstat(1), но предназначен для упрощения машинной обработки. Запись в выводе --numstat выглядит так:

1        2        README
3        1        arch/{i386 => x86}/Makefile

То есть слева направо:

  1. число добавленных строк;

  2. табуляция;

  3. число удалённых строк;

  4. табуляция;

  5. имя пути (возможно, со сведениями о переименовании или копировании);

  6. символ новой строки.

При включённом параметре вывода -z данные форматируются следующим образом:

1        2        README NUL
3        1        NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

То есть:

  1. число добавленных строк;

  2. табуляция;

  3. число удалённых строк;

  4. табуляция;

  5. NUL (присутствует только при переименовании или копировании);

  6. имя пути в исходном образе;

  7. NUL (присутствует только при переименовании или копировании);

  8. имя пути в конечном образе (присутствует только при переименовании или копировании);

  9. NUL.

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

diff-tree

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

Spec-Zone.ru

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