Spec-Zone.ru › Git

git-diff-index

Имя

git-diff-index — сравнение дерева с рабочим деревом или индексом

Синтаксис

git diff-index [-m] [--cached] [--merge-base] [<common-diff-options>] <tree-ish> [<path>…​]

Описание

Сравнивает содержимое и режим blob-объектов в объекте дерева с соответствующими отслеживаемыми файлами в рабочем дереве или с соответствующими путями в индексе. Если указаны аргументы <path>, сравниваются только пути, соответствующие этим шаблонам. В противном случае сравниваются все отслеживаемые файлы.

Параметры

-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>

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

--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>]]]

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

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

Параметр --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>

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

--full-index

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

--binary

В дополнение к --full-index выводить двоичный diff, который можно применить с помощью 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% означает, что для признания изменения полной перезаписью в результате должно остаться менее 30% исходного содержимого (в противном случае итоговый patch будет представлять собой серию удалений и вставок, перемежающихся строками контекста).

При использовании вместе с -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

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

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

-l<num>

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

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

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

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

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

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

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

--pickaxe-all

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

--pickaxe-regex

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

-O<orderfile>

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

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

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

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

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

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

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

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

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

-R

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

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

Если команда запущена из подкаталога проекта, этот параметр позволяет исключить из вывода изменения за пределами каталога и показывать пути относительно него. Если вы находитесь не в подкаталоге (например, в bare-репозитории), можно указать подкаталог, относительно которого нужно формировать вывод, передав <path> в качестве аргумента. --no-relative можно использовать, чтобы отменить как параметр конфигурации diff.relative, так и предыдущий параметр --relative.

-a
--text

Считать все файлы текстовыми.

--ignore-cr-at-eol

При сравнении игнорировать символ возврата каретки в конце строки.

--ignore-space-at-eol

Игнорировать изменения пробелов в конце строки.

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

-I<regex>
--ignore-matching-lines=<regex>

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

--inter-hunk-context=<number>

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

-W
--function-context

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

--exit-code

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

--quiet

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

--ext-diff

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

--no-ext-diff

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

--textconv
--no-textconv

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

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

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

--src-prefix=<prefix>

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

--dst-prefix=<prefix>

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

--no-prefix

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

--default-prefix

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

--line-prefix=<prefix>

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

--ita-invisible-in-index

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

--max-depth=<depth>

Для каждого 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>

Идентификатор объекта дерева, с которым выполняется сравнение.

--cached

Не учитывать файл на диске.

--merge-base

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

-m

По умолчанию файлы, записанные в индекс, но не извлечённые в рабочее дерево, считаются удалёнными. Этот флаг заставляет git diff-index считать все не извлечённые файлы актуальными.

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

Формат необработанного вывода команд 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 для неслитого файла: в этом случае выводятся строки «неслитый» и «изменение на месте».

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

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 для слияний

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

  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/ совпадают, если не выполняется переименование или копирование. В частности, даже при создании или удалении /dev/null not используется вместо имён файлов a/ или b/.

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

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

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

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

    Имена путей в расширенных заголовках не содержат префиксов 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. В заголовках блоков изменений указывается имя функции, к которой относится блок. Подробнее о настройке этого поведения для конкретных языков см. раздел «Defining a custom hunk-header» в gitattributes[5].

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

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

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

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

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

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

    diff --combined file

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие форматы 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, запись будет содержать два пути.

Режимы работы

Можно выбрать, следует ли полностью доверять файлу индекса (используя флаг --cached) или поручить логике diff показывать файлы, не соответствующие состоянию stat, как «предположительно изменённые». Обе операции весьма полезны.

Режим с кэшем

Если указан параметр --cached, можно задать вопрос:

show me the differences between HEAD and the current index
contents (the ones I'd write using 'git write-tree')

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

git diff-index --cached HEAD

Пример: допустим, я переименовал commit.c в git-commit.c и выполнил update-index, чтобы это изменение отразилось в файле индекса. git diff-files ничего бы не показала, поскольку файл индекса совпадает с моим рабочим каталогом. Но выполнение git diff-index покажет:

torvalds@ppc970:~/git> git diff-index --cached HEAD
:100644 000000 4161aecc6700a2eb579e842af0b7f22b98443f74 0000000000000000000000000000000000000000 D        commit.c
:000000 100644 0000000000000000000000000000000000000000 4161aecc6700a2eb579e842af0b7f22b98443f74 A        git-commit.c

Легко заметить, что в приведённом выше примере выполнено переименование.

На самом деле, git diff-index --cached должна всегда быть полностью эквивалентна выполнению git write-tree и сравнению результата. Но этот способ гораздо удобнее, если нужно просто проверить текущее состояние.

Таким образом, команда git diff-index --cached очень полезна, когда вы спрашиваете себя: «Что я уже отметил для фиксации и чем это отличается от предыдущего дерева?»

Режим без кэша

Режим «без кэша» работает иначе и потенциально полезнее из двух, поскольку его поведение нельзя воспроизвести сочетанием git write-tree + git diff-tree. Поэтому он используется по умолчанию. Версия без кэша отвечает на вопрос:

show me the differences between HEAD and the currently checked out
tree - index contents _and_ files that aren't up to date

Это тоже, очевидно, очень полезный вопрос, поскольку ответ показывает, что вы могли бы зафиксировать. И снова вывод полностью совпадает с выводом git diff-tree -r, но с одним нюансом.

Если какой-либо файл не совпадает с индексом, для него нет соответствующего объекта в хранилище, и для обозначения этого используется специальный sha1, состоящий из нулей. Допустим, вы отредактировали kernel/sched.c, но ещё не выполнили для него git update-index: с новым состоянием не связан никакой «объект», и вы получите:

torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
:100644 100644 7476bb5ba 000000000 M        kernel/sched.c

Иными словами, это показывает, что дерево изменилось, а kernel/sched.c не актуален и может содержать новые данные. Нулевой sha1 означает, что для получения реального diff нужно обратиться непосредственно к объекту в рабочем каталоге, а не выполнять сравнение объектов.

Примечание
Как и другие команды этого типа, git diff-index вообще не проверяет содержимое файла. Поэтому, возможно, kernel/sched.c на самом деле не изменился — вы просто затронули его. В любом случае это означает, что нужно выполнить для него git update-index, чтобы синхронизировать индекс.
Примечание
Одновременно могут отображаться файлы, которые «были обновлены», и файлы, которые «всё ещё изменены в рабочем каталоге». Всегда можно определить состояние каждого файла: у «обновлённых» файлов отображается действительный sha1, а у файлов, «не синхронизированных с индексом», всегда будет специальный sha1, состоящий из нулей.

diff-index

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

Spec-Zone.ru

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