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. Полезно для таких команд, как
gitshow, которые по умолчанию выводят патч, чтобы подавить их вывод, либо чтобы отменить действие таких параметров, как--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не влияет наgitformat-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, но показывает количество добавленных и удаленных строк в десятичной записи, а также полный путь без сокращений, что упрощает машинную обработку. Для двоичных файлов выводит два значения-вместо00. -
--shortstat -
Вывести только последнюю строку формата
--stat, содержащую общее количество измененных файлов, а также количество добавленных и удаленных строк. -
-X[<param>,...] -
--dirstat[=<param>,...] -
Вывести распределение относительного объема изменений для каждого подкаталога. Поведение
--dirstatможно настроить, передав ему список параметров, разделенных запятыми. Значения по умолчанию задаются переменной конфигурацииdiff.dirstat(см. git-config[1]). Доступны следующие параметры:-
changes -
Вычислять показатели dirstat, подсчитывая строки, удаленные из исходного файла или добавленные в конечный. При этом не учитывается объем перемещений кода внутри файла. Иными словами, перестановка строк в файле учитывается меньше, чем другие изменения. Это поведение используется по умолчанию, если параметр не задан.
-
lines -
Вычислять показатели dirstat с помощью обычного построчного анализа diff и суммировать количество удаленных и добавленных строк. (Для двоичных файлов вместо этого подсчитываются блоки по 64 байта, поскольку для двоичных файлов понятие строк не определено.) Это более ресурсоемкое поведение
--dirstat, чемchanges, однако переставленные внутри файла строки учитываются так же, как и другие изменения. Результирующий вывод согласуется с результатами других параметров--*stat. -
files -
Вычислять показатели dirstat, подсчитывая количество измененных файлов. При анализе dirstat каждый измененный файл имеет одинаковый вес. Это наименее ресурсоемкое поведение
--dirstat, поскольку содержимое файлов при этом вообще не анализируется. -
cumulative -
Учитывать изменения во вложенном каталоге также для родительского каталога. Обратите внимание: при использовании
cumulativeсумма указанных процентов может превышать 100%. Поведение по умолчанию (без накопления) можно задать параметромnoncumulative. - <limit>
-
Целочисленный параметр задает пороговый процент (по умолчанию 3%). Каталоги, на которые приходится менее этого процента изменений, не отображаются в выводе.
Пример: следующая команда будет подсчитывать измененные файлы, игнорируя каталоги, в которых содержится менее 10% от общего количества измененных файлов, и суммируя показатели вложенных каталогов в родительских каталогах:
--dirstat=files,10,cumulative. -
-
--cumulative -
Синоним
--dirstat=cumulative. -
--dirstat-by-file[=<param>,...] -
Синоним
--dirstat=files,<param>,.... -
--summary -
Вывести сокращенную сводку расширенной информации заголовка, например о создании, переименовании и изменении режима.
-
--patch-with-stat -
Синоним
-p--stat. -
-z -
Если указаны параметры
--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илиgitapply; он предназначен только для тех, кто хочет сосредоточиться на просмотре текста после изменения. Кроме того, в выводе заведомо недостаточно информации для применения такого patch в обратном направлении, даже вручную, отсюда и название параметра.При использовании вместе с
-Bисходное содержимое также не выводится в части удаления пары удаления/создания. -
-l<num> -
Параметры
-Mи-Cвключают предварительные этапы, которые позволяют с малыми затратами обнаружить некоторые переименования/копирования, после чего следует исчерпывающий этап, сравнивающий все оставшиеся несопоставленные файлы назначения со всеми соответствующими источниками. (При поиске переименований рассматриваются только оставшиеся несопоставленные источники; при поиске копирований — все исходные источники.) Для N источников и назначений эта исчерпывающая проверка имеет сложность O(N^2). Этот параметр запрещает запуск исчерпывающей части обнаружения переименований/копирований, если число участвующих файлов-источников/назначений превышает указанное значение. По умолчанию используетсяdiff.renameLimit. Обратите внимание, что значение 0 считается неограниченным. -
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]] -
Выбирать только файлы, которые были добавлены (
A), скопированы (C), удалены (D), изменены (M), переименованы (R), сменили тип (то есть обычный файл, символическая ссылка, подмодуль и т. д.) (T), не слиты (U), неизвестны (X) или потеряли соответствие (B). Можно использовать любую комбинацию символов фильтра (в том числе пустую). Если к комбинации добавлен*(все или ничего), выбираются все пути, если в сравнении есть хотя бы один файл, соответствующий другим критериям; если нет файлов, соответствующих другим критериям, не выбирается ничего.Кроме того, эти заглавные буквы можно записывать в нижнем регистре, чтобы исключить соответствующие типы. Например,
--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). Эти параметры были созданы главным образом для командыgitdifftoolи вряд ли будут полезны в других случаях. -
-R -
Менять местами два входных источника; то есть показывать различия между содержимым индекса или файла на диске и содержимым дерева.
-
--relative[=<path>] -
--no-relative -
Если команда запущена из подкаталога проекта, этот параметр позволяет исключить из вывода изменения за пределами каталога и показывать пути относительно него. Если вы находитесь не в подкаталоге (например, в bare-репозитории), можно указать подкаталог, относительно которого нужно формировать вывод, передав
<path>в качестве аргумента.--no-relativeможно использовать, чтобы отменить как параметр конфигурацииdiff.relative, так и предыдущий параметр--relative. -
-a -
--text -
Считать все файлы текстовыми.
-
--ignore-cr-at-eol -
При сравнении игнорировать символ возврата каретки в конце строки.
-
--ignore-space-at-eol -
Игнорировать изменения пробелов в конце строки.
-
-b -
--ignore-space-change -
Игнорировать изменения количества пробелов. При этом игнорируются пробелы в конце строки, а любые другие последовательности из одного или нескольких пробельных символов считаются эквивалентными.
-
-w -
--ignore-all-space -
Игнорировать пробелы при сравнении строк. Различия игнорируются, даже если в одной строке есть пробелы, а в другой их нет.
-
--ignore-blank-lines -
Игнорировать изменения, строки которых полностью пусты.
-
-I<regex> -
--ignore-matching-lines=<regex> -
Игнорировать изменения, если все их строки соответствуют
<regex>. Этот параметр можно указывать несколько раз. -
--inter-hunk-context=<number> -
Показывать контекст между блоками diff в пределах указанного
<number>строк, объединяя тем самым близко расположенные блоки. По умолчанию используетсяdiff.interHunkContextили 0, если параметр конфигурации не задан. -
-W -
--function-context -
Показывать всю функцию в качестве строк контекста для каждого изменения. Имена функций определяются так же, как
gitdiffформирует заголовки блоков patch (см. раздел «Определение пользовательского заголовка блока» в gitattributes[5]). -
--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 -
По умолчанию записи, добавленные командой
gitadd-N, отображаются как существующий пустой файл вgitdiffи как новый файл вgitdiff--cached. Этот параметр заставляет отображать запись как новый файл вgitdiffи как несуществующую вgitdiff--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--foofoo/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
То есть, слева направо:
-
двоеточие.
-
режим для «src»; 000000 при создании или если «src» взят из индекса и не слит.
-
пробел.
-
режим для «dst»; 000000 при удалении или если «dst» взят из индекса и не слит.
-
пробел.
-
sha1 для «src»; 0{40} при создании или если «src» взят из индекса и не слит.
-
пробел.
-
sha1 для «dst»; 0{40} при удалении, если «dst» взят из индекса и не слит или если «dst» взят из рабочего дерева и не синхронизирован с индексом.
-
пробел.
-
статус, за которым может следовать числовая «оценка».
-
табуляция или NUL, если используется параметр
-z. -
путь для «src»
-
табуляция или NUL, если используется параметр
-z; присутствует только для C или R. -
путь для «dst»; присутствует только для C или R.
-
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 также для коммитов слияния. Вывод отличается от описанного выше формата следующим образом:
-
для каждого родителя выводится двоеточие
-
выводится больше режимов «src» и значений sha1 «src»
-
статусы объединяются в последовательность символов статуса для каждого родителя
-
числовая «оценка» не выводится
-
имя пути к файлу или имена путей к файлам разделяются табуляцией
Для -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:
-
В начале выводится заголовок «git diff» следующего вида:
diff --git a/file1 b/file2
Имена файлов
a/иb/совпадают, если не выполняется переименование или копирование. В частности, даже при создании или удалении/dev/nullnotиспользуется вместо имён файловa/илиb/.При переименовании или копировании
file1иfile2показывают соответственно имя исходного файла при переименовании или копировании и имя файла, полученного в результате. -
За ним следуют одна или несколько строк расширенного заголовка:
old mode <mode> new mode <mode> deleted file mode <mode> new file mode <mode> copy from <path> copy to <path> rename from <path> rename to <path> similarity index <number> dissimilarity index <number> index <hash>..<hash> <mode>
Режимы файлов
<mode>выводятся как восьмеричные числа из 6 цифр, включающие тип файла и биты прав доступа.Имена путей в расширенных заголовках не содержат префиксов
a/иb/.Индекс сходства — это процент неизменённых строк, а индекс различия — процент изменённых строк. Это целое число, округлённое вниз и сопровождаемое знаком процента. Поэтому значение индекса сходства 100% зарезервировано для двух одинаковых файлов, а 100% различия означает, что ни одна строка из старого файла не попала в новый.
Строка индекса содержит имена blob-объектов до и после изменения. Значение
<mode>включается, если режим файла не меняется; в противном случае старый и новый режимы указываются в отдельных строках. -
Имена путей с «необычными» символами заключаются в кавычки, как описано для переменной конфигурации
core.quotePath(см. git-config[1]). -
Все файлы
file1в выводе относятся к файлам до коммита, а все файлыfile2— к файлам после коммита. Нельзя последовательно применять каждое изменение к каждому файлу. Например, этот патч поменяет местами a и b:diff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
-
В заголовках блоков изменений указывается имя функции, к которой относится блок. Подробнее о настройке этого поведения для конкретных языков см. раздел «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); -
В начале выводится заголовок «git diff» следующего вида (при использовании параметра
-c):diff --combined file
или такого (при использовании параметра
--cc):diff --cc file
-
За ним следуют одна или несколько строк расширенного заголовка (в этом примере показано слияние с двумя родителями):
index <hash>,<hash>..<hash> mode <mode>,<mode>..<mode> new file mode <mode> deleted file mode <mode>,<mode>
Строка
mode<mode>,<mode>..<mode> присутствует, только если хотя бы один из <mode> отличается от остальных. Расширенные заголовки со сведениями об обнаруженном перемещении содержимого (обнаружение переименований и копирования) предназначены для diff двух<tree-ish>и не используются в формате объединённого diff. -
За ним следует двухстрочный заголовок исходного и целевого файлов:
--- a/file +++ b/file
Как и в двухстрочном заголовке традиционного формата diff
unified,/dev/nullобозначает созданные или удалённые файлы.Однако если указан параметр --combined-all-paths, вместо двухстрочного заголовка исходного и целевого файлов выводится заголовок из N+1 строк, где N — количество родителей коммита слияния:
--- a/file --- a/file --- a/file +++ b/file
Этот расширенный формат может быть полезен при включённом обнаружении переименований или копирования: он позволяет увидеть исходное имя файла у разных родителей.
-
Формат заголовка блока изменений изменён, чтобы предотвратить его случайную передачу команде
patch-p1. Формат объединённого diff создан для просмотра изменений коммита слияния и не предназначен для применения. Изменение аналогично изменению расширенного заголовкаindex:@@@ <from-file-range> <from-file-range> <to-file-range> @@@
В заголовке блока изменений для формата объединённого diff содержится (количество родителей + 1) символов
@.
В отличие от традиционного формата diff unified, который показывает два файла A и B в одном столбце с префиксом - (минус — строка присутствует в A, но удалена из B), + (плюс — строка отсутствует в A, но добавлена в B) или " " (пробел — строка не изменена), этот формат сравнивает два или более файла file1, file2,… с одним файлом X и показывает, чем X отличается от каждого fileN. Перед строкой вывода добавляется отдельный столбец для каждого fileN, указывающий, чем строка X отличается от него.
Символ - в столбце N означает, что строка присутствует в fileN, но отсутствует в результате. Символ + в столбце N означает, что строка присутствует в результате, но отсутствует в fileN (иначе говоря, с точки зрения этого родителя строка была добавлена).
В приведённом выше примере сигнатура функции изменена в обоих файлах (отсюда два удаления - из file1 и file2, а также ++, означающий, что добавленная строка отсутствует и в file1, и в file2). Кроме того, ещё восемь строк совпадают с file1, но отсутствуют в file2 (поэтому перед ними стоит префикс +).
При отображении командой git diff-tree -c родители коммита слияния сравниваются с результатом слияния (то есть file1..fileN — это родители). При отображении командой git diff-files -c два неразрешённых родителя слияния сравниваются с файлом рабочего дерева (то есть file1 — это этап 2, или «наша версия», а file2 — этап 3, или «их версия»).
Другие форматы 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 То есть, слева направо:
-
количество добавленных строк;
-
табуляция;
-
количество удалённых строк;
-
табуляция;
-
имя пути (возможно, со сведениями о переименовании или копировании);
-
символ новой строки.
При использовании параметра вывода -z вывод форматируется следующим образом:
1 2 README NUL 3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
А именно:
-
количество добавленных строк;
-
табуляция;
-
количество удалённых строк;
-
табуляция;
-
NUL (присутствует только при переименовании или копировании);
-
имя пути в исходном образе;
-
NUL (присутствует только при переименовании или копировании);
-
имя пути в конечном образе (присутствует только при переименовании или копировании);
-
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