Spec-Zone.ru › Git

git-diff

Имя

git-diff — показывает изменения между коммитами, коммитом и рабочим деревом и т. д.

Краткое описание

git diff [<options>] [<commit>] [--] [<path>…​]
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]
git diff [<options>] [--merge-base] <commit> [<commit>…​] <commit> [--] [<path>…​]
git diff [<options>] <commit>...<commit> [--] [<path>…​]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path> [<pathspec>…​]

Описание

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

git diff [<options>] [--] [<path>...]

Эта форма позволяет просмотреть изменения, внесённые вами относительно индекса (области подготовки к следующему коммиту). Другими словами, различия показывают, что вы could хотели добавить в индекс с помощью Git, но ещё не добавили. Эти изменения можно подготовить к коммиту с помощью git-add[1].

git diff [<options>] --no-index [--] <path> <path> [<pathspec>...]

Эта форма позволяет сравнить указанные два пути в файловой системе. Параметр --no-index можно не указывать, если команда выполняется в рабочем дереве под управлением Git и хотя бы один из путей указывает за пределы рабочего дерева, либо если команда выполняется вне рабочего дерева под управлением Git. Эта форма подразумевает --exit-code. Если оба пути указывают на каталоги, можно указать дополнительные pathspec. Они ограничат набор файлов, включённых в сравнение. Все такие pathspec должны быть относительными, поскольку применяются к обеим сторонам сравнения.

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]

Эта форма позволяет просмотреть изменения, подготовленные вами к следующему коммиту, относительно указанного <commit>. Обычно требуется сравнение с последним коммитом, поэтому, если <commit> не указан, по умолчанию используется HEAD. Если HEAD не существует (например, в ещё не созданных ветках), а <commit> не указан, отображаются все подготовленные изменения. --staged — синоним --cached.

Если указан --merge-base, вместо <commit> используется базовый коммит слияния для <commit> и HEAD. git diff --cached --merge-base A эквивалентно git diff --cached $(git merge-base A HEAD).

git diff [<options>] [--merge-base] <commit> [--] [<path>...]

Эта форма позволяет просмотреть изменения в рабочем дереве относительно указанного <commit>. Используйте HEAD, чтобы сравнить его с последним коммитом, или имя ветки, чтобы сравнить его с вершиной другой ветки.

Если указан --merge-base, вместо <commit> используется базовый коммит слияния для <commit> и HEAD. git diff --merge-base A эквивалентно git diff $(git merge-base A HEAD).

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>...]

Эта форма позволяет просмотреть изменения между двумя произвольными <commit>.

Если указан --merge-base, для стороны «до» используется базовый коммит слияния двух коммитов. git diff --merge-base A B эквивалентно git diff $(git merge-base A B) B.

git diff [<options>] <commit> <commit>...<commit> [--] [<path>...]

Эта форма позволяет просмотреть результаты коммита слияния. Первый указанный <commit> должен быть самим слиянием; два или более оставшихся коммита должны быть его родителями. Удобно указать нужный набор ревизий с помощью суффиксов @ и ^!. Если A является коммитом слияния, то git diff A A^@, git diff A^! и git show A дают один и тот же объединённый diff.

git diff [<options>] <commit>..<commit> [--] [<path>...]

Эта форма равнозначна предыдущей (без ..) и позволяет просмотреть изменения между двумя произвольными <commit>. Если <commit> с одной стороны опущен, эффект будет таким же, как при использовании HEAD.

git diff [<options>] <commit>...<commit> [--] [<path>...]

Эта форма позволяет просмотреть изменения в ветке, содержащей второй <commit> и заканчивающейся им, начиная с общего предка обоих <commit>. git diff A...B эквивалентно git diff $(git merge-base A B) B. Можно опустить любой из <commit>; эффект будет таким же, как при использовании HEAD.

На случай, если вы делаете что-то необычное, следует отметить, что все <commit> в описании выше, за исключением случая --merge-base и двух последних форм, использующих обозначения .., могут быть любыми <tree>. Представляющее интерес дерево — это дерево, на которое указывает ссылка ref с именем AUTO_MERGE; её записывает стратегия слияния ort при возникновении конфликтов слияния (см. git-merge[1]). Сравнение рабочего дерева с AUTO_MERGE показывает изменения, уже внесённые вами для разрешения текстовых конфликтов (см. примеры ниже).

Более полный список способов записи <commit> см. в разделе «УКАЗАНИЕ РЕВИЗИЙ» справочной страницы gitrevisions[7]. Однако diff предназначен для сравнения двух endpoints, а не диапазонов; обозначения диапазонов (<commit>..<commit> и <commit>...<commit>) не обозначают диапазон в смысле раздела «УКАЗАНИЕ ДИАПАЗОНОВ» справочной страницы gitrevisions[7].

git diff [<options>] <blob> <blob>

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

Параметры

-p
-u
--patch

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

-s
--no-patch

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

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

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

--output=<file>

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

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

Задать символы, обозначающие новые, старые строки или строки контекста в создаваемом патче. Обычно это соответственно +, - и ' '.

--raw

Создать diff в необработанном формате.

--patch-with-raw

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

--indent-heuristic

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

--no-indent-heuristic

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

--minimal

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

--patience

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

--histogram

Создать diff с использованием алгоритма «histogram diff».

--anchored=<text>

Создать diff с использованием алгоритма «anchored diff».

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

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

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

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

default
myers

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

minimal

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

patience

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

histogram

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

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

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

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

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

--compact-summary

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

--numstat

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

--shortstat

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

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

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

changes

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

lines

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

files

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

cumulative

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

<limit>

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

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

--cumulative

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

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

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

--summary

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

--patch-with-stat

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

-z

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

Без этого параметра имена путей с «необычными» символами заключаются в кавычки, как описано для переменной конфигурации 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. В этом формате перечисляются коммиты диапазона, как это делает git-submodule[1] summary. Если указан параметр --submodule=diff, используется формат diff. В этом формате отображается встроенный diff изменений содержимого подмодуля между коммитами диапазона. По умолчанию используется diff.submodule или формат short, если параметр конфигурации не задан.

--color[=<when>]

Показывать diff цветным. --color (то есть без =<when>) означает то же, что и --color=always. Значение <when> может быть одним из следующих: always, never или auto. Его можно изменить с помощью параметров конфигурации color.ui и color.diff.

--no-color

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

--color-moved[=<mode>]

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

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, чем при использовании специализированной программы для word diff. Если в будущем Git получит другую реализацию, вывод может измениться. Обратите внимание, что это похоже на параметр --diff-algorithm, который также может изменить вывод.

--word-diff-regex=<regex>

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

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

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

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

--color-words[=<regex>]

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

--no-renames

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

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

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

--check

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

--ws-error-highlight=<kind>

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

--full-index

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

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

-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

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

-a
--text

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

--ignore-cr-at-eol

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

--ignore-space-at-eol

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

-b
--ignore-space-change

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

-w
--ignore-all-space

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

--ignore-blank-lines

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

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

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

--inter-hunk-context=<number>

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

-W
--function-context

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

Сравнить рабочее дерево с

  • версией «основы» (этап № 1) при использовании -1 или --base,

  • «нашей ветвью» (этап № 2) при использовании -2 или --ours либо

  • «их ветвью» (этап № 3) при использовании -3 или --theirs.

Эти этапы присутствуют в индексе только для неслитых записей, то есть во время разрешения конфликтов. Подробные сведения см. в разделе «3-Way Merge» команды git-read-tree[1].

-0

Не выводить различия для неслитых записей, а просто показать «Unmerged». Можно использовать только при сравнении рабочего дерева с индексом.

<path>...

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

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

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

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

git-diff-index <tree-ish>

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

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

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

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

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

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

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

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

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

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

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

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

  2. режим для «src»; 000000 при создании либо если «src» взят из индекса и не слит.

  3. пробел.

  4. режим для «dst»; 000000 при удалении либо если «dst» взят из индекса и не слит.

  5. пробел.

  6. sha1 для «src»; 0{40} при создании либо если «src» взят из индекса и не слит.

  7. пробел.

  8. sha1 для «dst»; 0{40} при удалении, если «dst» взят из индекса и не слит либо если «dst» взят из рабочего дерева и не синхронизирован с индексом.

  9. пробел.

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

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

  12. путь для «src»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

:100644 100644 5be4a4a 0000000 M file.c

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

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

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

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

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

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

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

  5. имя (имена) файла, разделённые табуляцией

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

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

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

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

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

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

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

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

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

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

    diff --git a/file1 b/file2

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

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

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

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

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

    Имена путей в расширенных заголовках не содержат префиксов 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, запись содержит два пути.

Примеры

Различные способы проверить рабочее дерево
$ git diff            (1)
$ git diff --cached   (2)
$ git diff HEAD       (3)
$ git diff AUTO_MERGE (4)
  1. Изменения в рабочем дереве, ещё не подготовленные для следующего коммита.

  2. Изменения между индексом и последним коммитом; именно они попадут в коммит при запуске git commit без параметра -a.

  3. Изменения в рабочем дереве с момента последнего коммита; именно они попадут в коммит при запуске git commit -a

  4. Изменения в рабочем дереве, внесённые вами для разрешения текстовых конфликтов.

Сравнение с произвольными коммитами
$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. Сравнить не с вершиной текущей ветви, а с вершиной ветви «test».

  2. Сравнить не с вершиной ветви «test», а с вершиной текущей ветви, ограничив сравнение файлом «test».

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

Сравнение ветвей
$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. Изменения между вершинами ветвей topic и master.

  2. То же, что и выше.

  3. Изменения, произошедшие в ветви master с момента создания на её основе ветви topic.

Ограничение вывода различий
$ git diff --diff-filter=MRC            (1)
$ git diff --name-status                (2)
$ git diff arch/i386 include/asm-i386   (3)
  1. Показать только изменения, переименования и копирования, но не добавления и удаления.

  2. Показать только имена и характер изменений, но не сами различия.

  3. Ограничить вывод различий указанными поддеревьями.

Изменение вывода различий
$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. Потратить дополнительные ресурсы на поиск переименований, копирований и полных переписываний (очень ресурсоёмко).

  2. Вывести различия в обратном порядке.

Настройка

Всё содержимое этого раздела ниже данной строки выборочно включено из документации git-config[1]. Содержимое совпадает с тем, что приведено там:

diff.autoRefreshIndex

При использовании git diff для сравнения с файлами рабочего дерева не считайте изменения только в stat-данных изменениями. Вместо этого незаметно выполните git update-index --refresh, чтобы обновить кэшированные stat-данные путей, содержимое которых в рабочем дереве совпадает с содержимым в индексе. По умолчанию этот параметр равен true. Обратите внимание, что это влияет только на команды Porcelain git diff, но не на низкоуровневые команды diff, такие как git diff-files.

diff.dirstat

Список параметров --dirstat, разделённых запятыми, задающих поведение по умолчанию параметра --dirstat для git diff и подобных команд. Значения по умолчанию можно переопределить в командной строке (с помощью --dirstat=<param>,...). Резервные значения по умолчанию (если они не изменены параметром diff.dirstat) — changes,noncumulative,3. Доступны следующие параметры:

changes

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

lines

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

files

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

cumulative

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

<limit>

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

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

diff.statNameWidth

Ограничивает ширину части с именем файла в выводе --stat. Если задано, применяется ко всем командам, формирующим вывод --stat, кроме format-patch.

diff.statGraphWidth

Ограничивает ширину графической части в выводе --stat. Если задано, применяется ко всем командам, формирующим вывод --stat, кроме format-patch.

diff.context

Формирует diff с <n> строками контекста вместо значения по умолчанию, равного 3. Это значение переопределяется параметром -U.

diff.interHunkContext

Показывает контекст между фрагментами diff до указанного количества строк, объединяя расположенные близко друг к другу фрагменты. Это значение задаёт значение по умолчанию для параметра командной строки --inter-hunk-context.

diff.external

Если эта переменная конфигурации задана, diff формируется не с помощью встроенного механизма diff, а с помощью указанной команды. Её можно переопределить переменной среды GIT_EXTERNAL_DIFF. Команда вызывается с параметрами, описанными в разделе «Git Diffs» документации git[1]. Примечание: если вы хотите использовать внешнюю программу diff только для части файлов, возможно, вам лучше воспользоваться gitattributes[5].

diff.trustExitCode

Если это логическое значение установлено в true, команда diff.external должна возвращать код завершения 0, если считает входные файлы одинаковыми, или 1, если считает их разными, как diff(1). Если значение установлено в false (по умолчанию), команда должна возвращать код завершения 0 независимо от того, одинаковы ли файлы. Любой другой код завершения приводит к фатальной ошибке Git.

diff.ignoreSubmodules

Задаёт значение по умолчанию для --ignore-submodules. Обратите внимание, что это влияет только на команды Porcelain git diff, но не на низкоуровневые команды diff, такие как git diff-files. Команды git checkout и git switch также учитывают этот параметр при отображении незакоммиченных изменений. Если установить значение all, сводка по подмодулям, обычно отображаемая командами git commit и git status при заданном параметре status.submoduleSummary, отключается, если только она не включена параметром командной строки --ignore-submodules. На команды git submodule этот параметр не влияет. По умолчанию установлено значение untracked, поэтому все неотслеживаемые подмодули игнорируются.

diff.mnemonicPrefix

Если параметр задан, git diff использует пару префиксов, отличающуюся от стандартных a/ и b/ в зависимости от сравниваемых объектов. При включённой этой настройке в выводе обратного diff порядок префиксов также меняется на противоположный:

git diff

сравнивает индекс (i) и рабочее дерево (w);

git diff HEAD

сравнивает коммит (c) и рабочее дерево (w);

git diff --cached

сравнивает коммит (c) и индекс (i);

git diff HEAD:<file1> <file2>

сравнивает объект (o) и сущность рабочего дерева (w);

git diff --no-index <a> <b>

сравнивает два объекта, не относящихся к Git: <a> и <b>.

diff.noPrefix

Если параметр задан, git diff не отображает префиксы источника и назначения.

diff.srcPrefix

Если параметр задан, git diff использует этот префикс источника. По умолчанию используется a/.

diff.dstPrefix

Если параметр задан, git diff использует этот префикс назначения. По умолчанию используется b/.

diff.relative

Если установлено значение true, git diff не отображает изменения за пределами каталога и выводит имена путей относительно текущего каталога.

diff.orderFile

Файл, задающий порядок файлов в diff. Подробности см. в описании параметра -O. Если diff.orderFile — относительный путь, он считается относительно корня рабочего дерева.

diff.renameLimit

Количество файлов, рассматриваемых при исчерпывающей проверке копирования и переименования; эквивалент параметра git diff -l. Если значение не задано, в настоящее время по умолчанию используется 1000. Этот параметр не действует, если обнаружение переименований отключено.

diff.renames

Определяет, обнаруживает ли Git переименования и каким образом. Если установлено значение false, обнаружение переименований отключается. Если установлено значение true, включается базовое обнаружение переименований. Если установлено значение copies или copy, Git также обнаруживает копирования. По умолчанию используется значение true. Обратите внимание, что это влияет только на команды Porcelain git diff, такие как git-diff[1] и git-log[1], но не на низкоуровневые команды, например git-diff-files[1].

diff.suppressBlankEmpty

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

diff.submodule

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

diff.wordRegex

Расширенное регулярное выражение POSIX, используемое для определения понятия «слово» при вычислении различий пословно. Последовательности символов, соответствующие регулярному выражению, считаются «словами», а все остальные символы являются игнорируемыми пробельными символами.

diff.<driver>.command

Команда пользовательского драйвера diff. Подробности см. в gitattributes[5].

diff.<driver>.trustExitCode

Если это логическое значение установлено в true, команда diff.<driver>.command должна возвращать код завершения 0, если считает входные файлы одинаковыми, или 1, если считает их разными, как diff(1). Если значение установлено в false (по умолчанию), команда должна возвращать код завершения 0 независимо от того, одинаковы ли файлы. Любой другой код завершения приводит к фатальной ошибке Git.

diff.<driver>.xfuncname

Регулярное выражение, которое драйвер diff должен использовать для распознавания заголовка фрагмента. Также можно использовать встроенный шаблон. Подробности см. в gitattributes[5].

diff.<driver>.binary

Установите для этого параметра значение true, чтобы драйвер diff обрабатывал файлы как двоичные. Подробности см. в gitattributes[5].

diff.<driver>.textconv

Команда, которую драйвер diff должен вызвать для создания текстового представления файла. Результат преобразования используется для создания diff, удобного для чтения. Подробности см. в gitattributes[5].

diff.<driver>.wordRegex

Регулярное выражение, которое драйвер diff должен использовать для разделения слов в строке. Подробности см. в gitattributes[5].

diff.<driver>.cachetextconv

Установите для этого параметра значение true, чтобы драйвер diff кэшировал результаты преобразования текста. Подробности см. в gitattributes[5].

diff.indentHeuristic

Установите для этого параметра значение false, чтобы отключить эвристики, включённые по умолчанию и сдвигающие границы фрагментов diff для повышения удобочитаемости патчей.

diff.algorithm

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

default
myers

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

minimal

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

patience

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

histogram

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

diff.wsErrorHighlight

Подсвечивает ошибки в пробельных символах в строках diff context, old или new. Несколько значений разделяются запятыми, none сбрасывает предыдущие значения, default сбрасывает список до new, а all — это сокращённая запись для old,new,context. Ошибки в пробельных символах выделяются цветом color.diff.whitespace. Параметр командной строки --ws-error-highlight=<kind> переопределяет эту настройку.

diff.colorMoved

Если задан допустимый режим <mode> или значение true, перемещённые строки в diff выделяются другим цветом. Подробное описание допустимых режимов см. в --color-moved. Если задано только значение true, используется режим цвета по умолчанию. Если задано значение false, перемещённые строки не выделяются цветом.

diff.colorMovedWS

Если перемещённые строки выделяются цветом, например при настройке diff.colorMoved, этот параметр определяет, как обрабатывать пробелы. Подробное описание допустимых режимов см. в --color-moved-ws документации git-diff[1].

См. также

diff(1), git-difftool[1], git-log[1], gitdiffcore[7], git-format-patch[1], git-apply[1], git-show[1]

diff

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

Spec-Zone.ru

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