Spec-Zone.ru › Git

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. Полезно для подавления вывода таких команд, как 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>]]]

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

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

--compact-summary

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

--numstat

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

--shortstat

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

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

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

changes

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

lines

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

files

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

cumulative

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

<limit>

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

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

--cumulative

Синоним для --dirstat=cumulative.

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

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

--summary

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

--patch-with-stat

Синоним для -p --stat.

-z

Если указан параметр --raw, --numstat, --name-only или --name-status, не изменять имена путей и использовать NUL-символы в качестве разделителей полей вывода.

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

--name-only

Показывать только имя каждого изменённого файла в дереве после применения изменений. Имена файлов часто кодируются в UTF-8. Дополнительные сведения см. в обсуждении кодировки на странице руководства git-log[1].

--name-status

Показывать только имена и состояния изменённых файлов. Значение букв состояния описано в разделе о параметре --diff-filter. Как и при использовании --name-only, имена файлов часто кодируются в UTF-8.

--submodule[=<format>]

Указать способ отображения различий в подмодулях. Если указано значение --submodule=short, используется формат short. В этом формате показываются только имена коммитов в начале и конце диапазона. Если указано значение --submodule или --submodule=log, используется формат log. В этом формате перечисляются коммиты в диапазоне, как это делает команда summary из git-submodule[1]. Если указано значение --submodule=diff, используется формат diff. В этом формате встроенный diff показывает изменения содержимого подмодуля в диапазоне коммитов. По умолчанию используется diff.submodule или формат short, если параметр конфигурации не задан.

--color[=<when>]

Показывать diff с цветовым оформлением. Значение --color (то есть без =<when>) эквивалентно --color=always. <when> может принимать значения always, never или auto.

--no-color

Отключить цветовое оформление diff. Эквивалентно --color=never.

--color-moved[=<mode>]

Перемещённые строки кода выделяются другим цветом. Если параметр не указан, значением <mode> по умолчанию является no; если параметр указан без режима, используется zebra. Режим должен принимать одно из следующих значений:

no

Перемещённые строки не выделяются.

default

Синоним для zebra. В будущем этот режим может быть заменён более подходящим.

plain

Любая строка, добавленная в одном месте и удалённая в другом, выделяется цветом color.diff.newMoved. Аналогично, для удалённых строк, добавленных в другом месте diff, используется цвет color.diff.oldMoved. Этот режим обнаруживает любые перемещённые строки, но при проверке изменений мало полезен для определения того, был ли блок кода перемещён без перестановки строк.

blocks

Блоки перемещённого текста длиной не менее 20 буквенно-цифровых символов обнаруживаются жадным алгоритмом. Обнаруженные блоки выделяются цветом color.diff.(old|new)Moved. Соседние блоки неразличимы.

zebra

Блоки перемещённого текста обнаруживаются так же, как в режиме blocks. Блоки выделяются цветом color.diff.(old|new)Moved или color.diff.(old|new)MovedAlternative. Изменение цвета указывает на обнаружение нового блока.

dimmed-zebra

Похож на zebra, но дополнительно затемняются не представляющие интереса части перемещённого кода. Граничные строки двух соседних блоков считаются представляющими интерес, остальные — нет. dimmed_zebra — устаревший синоним.

--no-color-moved

Отключить обнаружение перемещений. Этот параметр можно использовать для переопределения настроек конфигурации. Он эквивалентен --color-moved=no.

--color-moved-ws=<mode>,...

Этот параметр определяет, как игнорируются пробелы при обнаружении перемещений для --color-moved. Эти режимы можно указать списком через запятую:

no

Не игнорировать пробелы при обнаружении перемещений.

ignore-space-at-eol

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

ignore-space-change

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

ignore-all-space

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

allow-indentation-change

Сначала игнорировать любые пробелы при обнаружении перемещений, а затем объединять перемещённые блоки кода в один блок только в том случае, если изменение пробелов одинаково в каждой строке. Этот режим несовместим с остальными.

--no-color-moved-ws

Не игнорировать пробелы при обнаружении перемещений. Этот параметр можно использовать для переопределения настроек конфигурации. Он эквивалентен --color-moved-ws=no.

--word-diff[=<mode>]

По умолчанию слова разделяются пробелами; см. описание --word-diff-regex ниже. Значение <mode> по умолчанию — plain; допустимы следующие варианты:

color

Выделять изменённые слова только цветом. Подразумевает --color.

plain

Показывать слова как [-removed-] и {added}. Экранирование разделителей не выполняется, даже если они встречаются во входных данных, поэтому результат может быть неоднозначным.

porcelain

Использовать специальный построчный формат, предназначенный для обработки скриптами. Последовательности добавленных, удалённых и неизменённых строк выводятся в обычном формате unified diff: в начале строки ставится символ +/-/` `, после которого выводится оставшаяся часть строки. Символы перевода строки во входных данных представлены тильдой ~ на отдельной строке.

none

Снова отключить сравнение по словам.

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

Параметр --word-diff берёт тот же построчный diff, который создаётся без этого параметра, и вычисляет изменения по словам внутри каждого фрагмента. Это может привести к созданию diff большего размера, чем при использовании специального инструмента для сравнения по словам. Если в будущем Git получит другую реализацию, вывод может измениться. Обратите внимание: это похоже на параметр --diff-algorithm, который также может изменить вывод.

--word-diff-regex=<regex>

Использовать <regex> для определения слова вместо того, чтобы считать словом последовательности символов, не являющихся пробельными. Также подразумевает --word-diff, если этот параметр ещё не включён.

Каждое неперекрывающееся совпадение с <regex> считается словом. Всё, что находится между совпадениями, считается пробелами и игнорируется(!) при поиске различий. Возможно, в регулярное выражение стоит добавить |[^[:space:]], чтобы оно соответствовало всем непробельным символам. Совпадение, содержащее символ перевода строки, молча обрезается(!) на этом символе.

Например, --word-diff-regex=. будет считать каждую букву отдельным словом и, соответственно, показывать различия посимвольно.

Регулярное выражение также можно задать с помощью драйвера diff или параметра конфигурации; см. gitattributes[5] или git-config[1]. Явно указанное выражение переопределяет любые настройки драйвера diff или конфигурации. Драйверы diff переопределяют настройки конфигурации.

--color-words[=<regex>]

Эквивалентно --word-diff=color и (если задано регулярное выражение) --word-diff-regex=<regex>.

--no-renames

Отключить обнаружение переименований, даже если в файле конфигурации оно включено по умолчанию.

--rename-empty
--no-rename-empty

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

--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 или git apply; этот параметр предназначен исключительно для тех, кто хочет сосредоточиться на проверке текста после изменения. Кроме того, в выводе явно недостаточно информации, чтобы применить такой патч в обратном направлении, даже вручную, отсюда и название параметра.

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

-l<num>

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

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

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

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

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

-S<string>

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

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

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

-G<regex>

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

Чтобы показать разницу между -S<regex> --pickaxe-regex и -G<regex>, рассмотрим коммит со следующим 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). Эти параметры созданы главным образом для команды git difftool и в других случаях могут быть не очень полезны.

-R

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

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

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

-a
--text

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

--ignore-cr-at-eol

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

--ignore-space-at-eol

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

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

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

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

--inter-hunk-context=<number>

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

-W
--function-context

Показывать всю функцию в качестве строк контекста для каждого изменения. Имена функций определяются так же, как при формировании заголовков фрагментов патча с помощью git diff (см. раздел «Определение пользовательского заголовка фрагмента» в 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>

Для каждой спецификации пути, заданной в командной строке, спускаться не более чем на <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 -- foo foo/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

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

  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. статус, за которым может следовать число «score»;

  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. необязательное число «score» отсутствует;

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

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

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

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

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

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

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

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

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

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

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

    diff --git a/file1 b/file2

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

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

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

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

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

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

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

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

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

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

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

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

Любая команда, генерирующая 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, в записи будут указаны два пути.

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

Spec-Zone.ru

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