git-diff-files
Название
git-diff-files — сравнивает файлы в рабочем дереве и индексе
Краткое описание
git diff-files [-q] [-0 | -1 | -2 | -3 | -c | --cc] [<common-diff-options>] [<path>…]
Описание
Сравнивает файлы в рабочем дереве и индексе. Если указаны пути, сравниваются только файлы по указанным путям. В противном случае сравниваются все записи в индексе. Формат вывода совпадает с форматом для git diff-index и git diff-tree.
Параметры
-
-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>]]] -
Создать diffstat. По умолчанию для имени файла используется столько места, сколько необходимо, а оставшееся пространство отводится графику. Максимальная ширина по умолчанию равна ширине терминала или 80 столбцам, если терминал не подключён; её можно переопределить с помощью
<width>. Ширину части с именами файлов можно ограничить, указав после запятой<name-width>другую ширину или задавdiff.statNameWidth=<name-width>. Ширину части с графиком можно ограничить с помощью--stat-graph-width=<graph-width> или задавdiff.statGraphWidth=<graph-width>. Параметры--statи--stat-graph-widthвлияют на все команды, создающие график статистики, тогда как параметрыdiff.statNameWidthиdiff.statGraphWidthне влияют наgitformat-patch. Указав третий параметр<count>, можно ограничить вывод первыми<count>строками; если строк больше, после них выводится ....Эти параметры также можно задавать по отдельности с помощью
--stat-width=<width>,--stat-name-width=<name-width> и--stat-count=<count>. -
--compact-summary -
Вывести краткую сводку расширенной информации заголовка, например о создании или удалении файлов («new» или «gone», необязательно
+lдля символической ссылки) и изменении режима (+xили-xпри добавлении или удалении бита исполняемого файла соответственно) в diffstat. Информация размещается между частью с именами файлов и графиком. Подразумевает--stat. -
--numstat -
Похож на
--stat, но показывает число добавленных и удалённых строк в десятичной записи, а имена путей выводит без сокращений, что удобнее для машинной обработки. Для двоичных файлов вместо сообщения00выводятся два значения-. -
--shortstat -
Вывести только последнюю строку формата
--stat, содержащую общее число изменённых файлов, а также число добавленных и удалённых строк. -
-X[<param>,...] -
--dirstat[=<param>,...] -
Вывести распределение относительного объёма изменений для каждого подкаталога. Поведение параметра
--dirstatможно настроить, передав ему список параметров, разделённых запятыми. Значения по умолчанию задаются переменной конфигурацииdiff.dirstat(см. git-config[1]). Доступны следующие параметры:-
changes -
Вычислять значения dirstat, подсчитывая строки, удалённые из источника или добавленные в целевой файл. При этом не учитывается объём перемещений кода внутри файла. Иными словами, перестановка строк в файле учитывается меньше, чем прочие изменения. Это поведение используется по умолчанию, если параметр не указан.
-
lines -
Вычислять значения dirstat, выполняя обычный построчный анализ diff и суммируя количество удалённых и добавленных строк. (Для двоичных файлов вместо этого подсчитываются блоки по 64 байта, поскольку понятие строк для двоичных файлов неприменимо.) Это более ресурсоёмкий вариант поведения
--dirstat, чемchanges, но он учитывает перестановки строк внутри файла наравне с прочими изменениями. Результат согласуется с выводом других параметров--*stat. -
files -
Вычислять значения dirstat, подсчитывая количество изменённых файлов. В анализе dirstat каждый изменённый файл имеет одинаковый вес. Это наименее ресурсоёмкий вариант поведения
--dirstat, поскольку содержимое файлов вообще не проверяется. -
cumulative -
Учитывать изменения во вложенном каталоге также и для родительского каталога. Обратите внимание: при использовании
cumulativeсумма выведенных процентов может превышать 100%. Поведение по умолчанию (без накопления) можно задать параметромnoncumulative. - <limit>
-
Целочисленный параметр задаёт пороговый процент (по умолчанию 3%). Каталоги, на которые приходится меньше этого процента изменений, не выводятся.
Пример: следующая команда подсчитает изменённые файлы, игнорируя каталоги, на которые приходится менее 10% от общего числа изменённых файлов, и суммируя показатели вложенных каталогов для родительских каталогов:
--dirstat=files,10,cumulative. -
-
--cumulative -
Синоним для
--dirstat=cumulative. -
--dirstat-by-file[=<param>,...] -
Синоним для
--dirstat=files,<param>,.... -
--summary -
Вывести краткую сводку расширенной информации заголовка, например о создании файлов, переименованиях и изменениях режима.
-
--patch-with-stat -
Синоним для
-p--stat. -
-z -
Если указан параметр
--raw,--numstat,--name-onlyили--name-status, не изменять имена путей и использовать NUL-символы в качестве разделителей полей вывода.Без этого параметра имена путей с «нестандартными» символами заключаются в кавычки, как описано для переменной конфигурации
core.quotePath(см. git-config[1]). -
--name-only -
Показывать только имя каждого изменённого файла в дереве после применения изменений. Имена файлов часто кодируются в UTF-8. Дополнительные сведения см. в обсуждении кодировки на странице руководства git-log[1].
-
--name-status -
Показывать только имена и состояния изменённых файлов. Значение букв состояния описано в разделе о параметре
--diff-filter. Как и при использовании--name-only, имена файлов часто кодируются в UTF-8. -
--submodule[=<format>] -
Указать способ отображения различий в подмодулях. Если указано значение
--submodule=short, используется форматshort. В этом формате показываются только имена коммитов в начале и конце диапазона. Если указано значение--submoduleили--submodule=log, используется форматlog. В этом формате перечисляются коммиты в диапазоне, как это делает командаsummaryиз git-submodule[1]. Если указано значение--submodule=diff, используется форматdiff. В этом формате встроенный diff показывает изменения содержимого подмодуля в диапазоне коммитов. По умолчанию используетсяdiff.submoduleили форматshort, если параметр конфигурации не задан. -
--color[=<when>] -
Показывать diff с цветовым оформлением. Значение
--color(то есть без=<when>) эквивалентно--color=always.<when>может принимать значенияalways,neverилиauto. -
--no-color -
Отключить цветовое оформление diff. Эквивалентно
--color=never. -
--color-moved[=<mode>] -
Перемещённые строки кода выделяются другим цветом. Если параметр не указан, значением
<mode>по умолчанию являетсяno; если параметр указан без режима, используетсяzebra. Режим должен принимать одно из следующих значений:-
no -
Перемещённые строки не выделяются.
-
default -
Синоним для
zebra. В будущем этот режим может быть заменён более подходящим. -
plain -
Любая строка, добавленная в одном месте и удалённая в другом, выделяется цветом
color.diff.newMoved. Аналогично, для удалённых строк, добавленных в другом месте diff, используется цветcolor.diff.oldMoved. Этот режим обнаруживает любые перемещённые строки, но при проверке изменений мало полезен для определения того, был ли блок кода перемещён без перестановки строк. -
blocks -
Блоки перемещённого текста длиной не менее 20 буквенно-цифровых символов обнаруживаются жадным алгоритмом. Обнаруженные блоки выделяются цветом
color.diff.(old|new)Moved. Соседние блоки неразличимы. -
zebra -
Блоки перемещённого текста обнаруживаются так же, как в режиме
blocks. Блоки выделяются цветомcolor.diff.(old|new)Movedилиcolor.diff.(old|new)MovedAlternative. Изменение цвета указывает на обнаружение нового блока. -
dimmed-zebra -
Похож на
zebra, но дополнительно затемняются не представляющие интереса части перемещённого кода. Граничные строки двух соседних блоков считаются представляющими интерес, остальные — нет.dimmed_zebra— устаревший синоним.
-
-
--no-color-moved -
Отключить обнаружение перемещений. Этот параметр можно использовать для переопределения настроек конфигурации. Он эквивалентен
--color-moved=no. -
--color-moved-ws=<mode>,... -
Этот параметр определяет, как игнорируются пробелы при обнаружении перемещений для
--color-moved. Эти режимы можно указать списком через запятую:-
no -
Не игнорировать пробелы при обнаружении перемещений.
-
ignore-space-at-eol -
Игнорировать изменения пробелов в конце строки.
-
ignore-space-change -
Игнорировать изменения количества пробелов. Игнорируются пробелы в конце строки, а все остальные последовательности из одного или нескольких пробельных символов считаются эквивалентными.
-
ignore-all-space -
Игнорировать пробелы при сравнении строк. Различия игнорируются, даже если в одной строке есть пробелы, а в другой их нет.
-
allow-indentation-change -
Сначала игнорировать любые пробелы при обнаружении перемещений, а затем объединять перемещённые блоки кода в один блок только в том случае, если изменение пробелов одинаково в каждой строке. Этот режим несовместим с остальными.
-
-
--no-color-moved-ws -
Не игнорировать пробелы при обнаружении перемещений. Этот параметр можно использовать для переопределения настроек конфигурации. Он эквивалентен
--color-moved-ws=no. -
--word-diff[=<mode>] -
По умолчанию слова разделяются пробелами; см. описание
--word-diff-regexниже. Значение<mode>по умолчанию —plain; допустимы следующие варианты:-
color -
Выделять изменённые слова только цветом. Подразумевает
--color. -
plain -
Показывать слова как [
-removed-] и{. Экранирование разделителей не выполняется, даже если они встречаются во входных данных, поэтому результат может быть неоднозначным.added} -
porcelain -
Использовать специальный построчный формат, предназначенный для обработки скриптами. Последовательности добавленных, удалённых и неизменённых строк выводятся в обычном формате unified diff: в начале строки ставится символ
+/-/` `, после которого выводится оставшаяся часть строки. Символы перевода строки во входных данных представлены тильдой~на отдельной строке. -
none -
Снова отключить сравнение по словам.
Обратите внимание: несмотря на название первого режима, во всех режимах для выделения изменённых частей используется цвет, если цветовое оформление включено.
Параметр
--word-diffберёт тот же построчный diff, который создаётся без этого параметра, и вычисляет изменения по словам внутри каждого фрагмента. Это может привести к созданию diff большего размера, чем при использовании специального инструмента для сравнения по словам. Если в будущем Git получит другую реализацию, вывод может измениться. Обратите внимание: это похоже на параметр--diff-algorithm, который также может изменить вывод. -
-
--word-diff-regex=<regex> -
Использовать
<regex>для определения слова вместо того, чтобы считать словом последовательности символов, не являющихся пробельными. Также подразумевает--word-diff, если этот параметр ещё не включён.Каждое неперекрывающееся совпадение с
<regex>считается словом. Всё, что находится между совпадениями, считается пробелами и игнорируется(!) при поиске различий. Возможно, в регулярное выражение стоит добавить |[^[:space:]], чтобы оно соответствовало всем непробельным символам. Совпадение, содержащее символ перевода строки, молча обрезается(!) на этом символе.Например,
--word-diff-regex=.будет считать каждую букву отдельным словом и, соответственно, показывать различия посимвольно.Регулярное выражение также можно задать с помощью драйвера diff или параметра конфигурации; см. gitattributes[5] или git-config[1]. Явно указанное выражение переопределяет любые настройки драйвера diff или конфигурации. Драйверы diff переопределяют настройки конфигурации.
-
--color-words[=<regex>] -
Эквивалентно
--word-diff=colorи (если задано регулярное выражение)--word-diff-regex=<regex>. -
--no-renames -
Отключить обнаружение переименований, даже если в файле конфигурации оно включено по умолчанию.
-
--rename-empty -
--no-rename-empty -
Указывает, следует ли использовать пустые блобы в качестве источника переименования.
-
--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» при генерации вывода в формате патча.
-
--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% исходного содержимого, чтобы Git счёл изменение полным переписыванием (в противном случае итоговый патч будет представлять собой серию перемешанных удалений и вставок со строками контекста).При использовании вместе с
-Mполностью переписанный файл также считается источником переименования (обычно-Mрассматривает как источник переименования только исчезнувший файл), а число<n>управляет этим аспектом параметра-B(по умолчанию 50%).-B20%указывает, что изменение, при котором добавления и удаления составляют 20% или более от размера файла, может быть выбрано как возможный источник переименования в другой файл. -
-M[<n>] -
--find-renames[=<n>] -
Обнаруживать переименования. Если указано
<n>, оно задаёт порог индекса сходства (то есть объём добавлений и удалений относительно размера файла). Например,-M90%означает, что Git должен считать пару «удаление/добавление» переименованием, если файл изменился менее чем на 10%. Если знак%отсутствует, число трактуется как дробь с десятичной точкой перед ним. То есть-M5становится 0.5 и, таким образом, эквивалентно-M50%. Аналогично,-M05эквивалентно-M5%. Чтобы обнаруживать только точные переименования, используйте-M100%. Индекс сходства по умолчанию равен 50%. -
-C[<n>] -
--find-copies[=<n>] -
Обнаруживать копирования, а также переименования. См. также
--find-copies-harder. Если указано<n>, оно имеет то же значение, что и для-M<n>. -
--find-copies-harder -
По умолчанию, ради производительности, параметр
-Cобнаруживает копирования, только если исходный файл копии был изменён в том же наборе изменений. Этот флаг заставляет команду проверять неизменённые файлы как возможные источники копирования. Для больших проектов эта операция очень затратна, поэтому используйте её с осторожностью. Несколько параметров-Cдают тот же эффект. -
-D -
--irreversible-delete -
Не выводить исходное содержимое для удалённых файлов, то есть печатать только заголовок, но не различия между исходным и
/dev/null. Полученный патч не предназначен для применения с помощьюpatchилиgitapply; этот параметр предназначен исключительно для тех, кто хочет сосредоточиться на проверке текста после изменения. Кроме того, в выводе явно недостаточно информации, чтобы применить такой патч в обратном направлении, даже вручную, отсюда и название параметра.При использовании вместе с
-Bтакже не выводить исходное содержимое в части удаления пары «удаление/создание». -
-l<num> -
Параметры
-Mи-Cвключают предварительные этапы, позволяющие с небольшими затратами обнаружить некоторые переименования и копирования, за которыми следует исчерпывающий этап, сравнивающий все оставшиеся несопоставленные целевые файлы со всеми подходящими исходными. (Для переименований подходят только оставшиеся несопоставленные исходные файлы; для копирований подходят все исходные файлы.) Для N исходных и целевых файлов эта исчерпывающая проверка имеет сложность O(N^2). Этот параметр не позволяет выполнять исчерпывающий этап обнаружения переименований и копирований, если число задействованных исходных и целевых файлов превышает указанное значение. Значение по умолчанию —diff.renameLimit. Обратите внимание: значение 0 означает отсутствие ограничения. -
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]] -
Выбирать только добавленные (
A), скопированные (C), удалённые (D), изменённые (M), переименованные (R) файлы, файлы с изменившимся типом (например, обычный файл, символическая ссылка, подмодуль и т. д.;T), неслитые файлы (U), неизвестные файлы (X) или файлы с нарушенной парой (B). Можно использовать любую комбинацию символов фильтра (в том числе пустую). Если к комбинации добавлено*(все или ничего), выбираются все пути, если в сравнении есть хотя бы один файл, соответствующий остальным критериям; если таких файлов нет, ничего не выбирается.Кроме того, эти заглавные буквы можно заменить строчными, чтобы исключить соответствующие файлы. Например,
--diff-filter=adисключает добавленные и удалённые пути.Обратите внимание, что не все различия могут включать все типы. Например, записи о копировании и переименовании отсутствуют, если обнаружение этих типов отключено.
-
-S<string> -
Искать различия, меняющие число вхождений указанной
<string>в файле (то есть добавление или удаление). Предназначено для использования в скриптах.Это полезно, когда вы ищете точный блок кода (например, структуру) и хотите узнать историю этого блока с момента его появления: используйте эту возможность итеративно, передавая интересующий блок из исходного содержимого обратно в
-S, и продолжайте, пока не получите самую первую версию блока.Поиск также выполняется в двоичных файлах.
-
-G<regex> -
Искать различия, в тексте патча которых есть добавленные или удалённые строки, соответствующие
<regex>.Чтобы показать разницу между
-S<regex>--pickaxe-regexи-G<regex>, рассмотрим коммит со следующим 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, патчи двоичных файлов без фильтра 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 -
Если команда запущена из подкаталога проекта, с помощью этого параметра можно исключить изменения за пределами каталога и выводить пути относительно него. Если вы находитесь не в подкаталоге (например, в пустом репозитории), можно указать подкаталог, относительно которого нужно выводить результат, передав
<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(см. раздел «Определение пользовательского заголовка фрагмента» в 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>
-
Для каждой спецификации пути, заданной в командной строке, спускаться не более чем на <depth> уровней каталогов. Значение
-1означает отсутствие ограничений. Нельзя использовать совместно с подстановочными знаками в спецификации пути. Для дерева, содержащегоfoo/bar/baz, в следующем списке показаны совпадения, генерируемые каждым набором параметров:-
--max-depth=0--foo:foo -
--max-depth=1--foo:foo/bar -
--max-depth=1--foo/bar:foo/bar/baz -
--max-depth=1--foofoo/bar:foo/bar/baz -
--max-depth=2--foo:foo/bar/baz
Если спецификация пути не задана, глубина измеряется так, как если бы были указаны все записи верхнего уровня. Обратите внимание, что это отличается от измерения от корня:
--max-depth=0всё равно вернётfoo. Это позволяет ограничить глубину, запросив при этом подмножество записей верхнего уровня.Обратите внимание, что этот параметр поддерживается только для различий между объектами дерева, но не для различий с индексом или рабочим деревом.
-
Более подробное объяснение этих общих параметров см. также в gitdiffcore[7].
- -1 --base
- -2 --ours
- -3 --theirs
- -0
-
Сравнение соответственно с версией «base», «нашей веткой» или «их веткой». При использовании этих параметров различия для слитых записей не отображаются.
По умолчанию выполняется сравнение с нашей веткой (-2) и путями, разрешёнными без конфликтов. Параметр -0 можно указать, чтобы не выводить различия для неслитых записей, а просто показать «Unmerged».
- -c
- --cc
-
Сравнивает файл рабочего дерева с этапом 2 (наша ветка) и этапом 3 (их ветка) и выводит объединённый diff, подобно тому, как
diff-treeотображает коммит слияния с этими флагами. - -q
-
Не выводить сообщения даже для несуществующих файлов
Формат необработанного вывода
Формат необработанного вывода команд git-diff-index, git-diff-tree, git-diff-files и git diff --raw очень похож.
Все эти команды сравнивают два набора объектов; различается то, что именно сравнивается:
-
git-diff-index<tree-ish> -
сравнивает
<tree-ish>и файлы в файловой системе. -
git-diff-index--cached<tree-ish> -
сравнивает
<tree-ish>и индекс. -
git-diff-tree[-r] <tree-ish-1> <tree-ish-2> [<pattern>...] -
сравнивает деревья, указанные двумя аргументами.
-
git-diff-files[<pattern>...] -
сравнивает индекс и файлы в файловой системе.
Все команды выводят по одной строке на каждый изменённый файл, за исключением git diff-files для неслитого файла: в этом случае выводятся строки «unmerged» и «in-place edit».
Строка вывода имеет следующий формат:
in-place edit :100644 100644 bcd1234 0123456 M file0 copy-edit :100644 100644 abcd123 1234567 C68 file1 file2 rename-edit :100644 100644 abcd123 1234567 R86 file1 file3 create :000000 100644 0000000 1234567 A file4 delete :100644 000000 1234567 0000000 D file5 unmerged :000000 000000 0000000 0000000 U file6
То есть слева направо:
-
двоеточие;
-
режим для «src»; 000000 при создании или если «src» взят из индекса и не слит;
-
пробел;
-
режим для «dst»; 000000 при удалении или если «dst» взят из индекса и не слит;
-
пробел;
-
sha1 для «src»; 0{40} при создании или если «src» взят из индекса и не слит;
-
пробел;
-
sha1 для «dst»; 0{40} при удалении, если «dst» взят из индекса и не слит или если «dst» взят из рабочего дерева и не синхронизирован с индексом;
-
пробел;
-
статус, за которым может следовать число «score»;
-
табуляция или 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»;
-
статусы объединяются в строку символов статуса для каждого родителя;
-
необязательное число «score» отсутствует;
-
имена путей файла разделяются табуляцией.
Для -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/совпадают, если не выполняется переименование или копирование. В частности, даже при создании или удалении вместо имён файловa/илиb/используется/dev/nullnot.При переименовании или копировании
file1иfile2содержат соответственно имя исходного файла при переименовании или копировании и имя файла, полученного в результате. -
За ним следует одна или несколько строк расширенного заголовка:
old mode <mode> new mode <mode> deleted file mode <mode> new file mode <mode> copy from <path> copy to <path> rename from <path> rename to <path> similarity index <number> dissimilarity index <number> index <hash>..<hash> <mode>
Режимы файлов
<mode>выводятся в виде шестизначных восьмеричных чисел, включающих тип файла и биты прав доступа.В именах путей в расширенных заголовках отсутствуют префиксы
a/иb/.Индекс сходства — это процент неизменённых строк, а индекс различия — процент изменённых строк. Значение округляется вниз до целого числа, за которым следует знак процента. Поэтому значение индекса сходства 100% зарезервировано для двух одинаковых файлов, а различие 100% означает, что ни одна строка из старого файла не попала в новый.
Строка индекса содержит имена объектов blob до и после изменения.
<mode>включается, если режим файла не изменился; в противном случае отдельные строки указывают старый и новый режимы. -
Имена путей с «нестандартными» символами заключаются в кавычки, как описано для переменной конфигурации
core.quotePath(см. git-config[1]). -
Все файлы
file1в выводе относятся к файлам до коммита, а все файлыfile2— к файлам после коммита. Нельзя последовательно применять каждое изменение к каждому файлу. Например, этот патч поменяет местами a и b:diff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
-
В заголовках фрагментов указывается имя функции, к которой относится фрагмент. Подробные сведения о настройке этого параметра для конкретных языков см. в разделе «Определение пользовательского заголовка фрагмента» в 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, в записи будут указаны два пути.
diff-files
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-diff-files