git diff между двумя разными файлами

112

В HEAD(последней фиксации) у меня есть файл с именем foo. В моем текущем рабочем дереве я переименовал его в bar, а также отредактировал.

Я хочу , чтобы git diff fooв HEADи barв моем текущем рабочем дереве.

MiJyn
источник
65
Я думал, что этот вопрос (из заголовка) может быть связан с использованием git diff для двух файлов, которые не обязательно находятся в репо. Я обнаружил, что для этого предназначен флаг --no-index, например git diff --no-index --word-diff old_file.txt new_file.txt(--word-diff выделяет изменения по слову, а не только по строке, что очень полезно для длинного текста).
Пэт

Ответы:

139

Укажите пути явно:

git diff HEAD:full/path/to/foo full/path/to/bar

Ознакомьтесь с --find-renamesопцией в git-diff документации .

Кредит: twaggs .

Стивен Векслер
источник
10
Я хочу упомянуть, что вы можете сравнивать любые два файла, git diff <path> <path>даже если они не находятся в репозитории git.
митенка
1
@mitenka Не думаю, что это правильно. Если вы посмотрите, git diff --helpто увидите, что для двух файлов поддерживаются только шаблоны git diff [<options>] --no-index [--] <path> <path>. git diff a bсоответствует только шаблонам фиксации, а не файлам.
Дуг
@Doug Вот цитата из упомянутой вами справочной команды git-scm.com/docs/git-diff : Показать [...] изменения между двумя файлами на диске.
митенка
@mitenka в справке сказано, что если вы не используете '--no-index', он не сравнивает файлы; ваш комментарий должен быть отдельным ответом; это неправда и не имеет отношения к этому ответу.
Дуг
1
@Doug Спасибо за ваше мнение. Вот цитата из справки, на которую вы ссылаетесь: Вы можете опустить эту --no-indexопцию при запуске команды в рабочем дереве, управляемом Git, и хотя бы один из путей указывает за пределами рабочего дерева, или при запуске команды вне рабочего дерева, управляемого Git .
митенка
81

Я считаю, что использование --no-index- это то, что вы ищете:

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

как указано в руководстве git:

Эта форма предназначена для сравнения двух указанных путей в файловой системе. Вы можете опустить этот --no-indexпараметр при запуске команды в рабочем дереве, управляемом Git, и хотя бы один из путей указывает за пределами рабочего дерева, или при выполнении команды за пределами рабочего дерева, управляемого Git.

саттарианец
источник
1
@swe, это определенно полезный ответ, но OP конкретно указал, что файл находится в HEAD, что означает, что он находится в индексе git. Принятый ответ напрямую касается вопроса. Также принятый ответ имел фору на 6 лет;)
Майкл Дельгадо
3
Возможно, это не помогло OP, но это было именно то, что я искал.
thislooksfun
1
Это ответ на вопрос, заданный заголовком, если вы уклонились от этого в Интернете.
Мерлин
Спасибо, что ответили на заголовок ... поэтому я пришел сюда.
grek40,
Я рада, что это помогло.
mh sattarian,
3

Если вы используете tortoise git, вы можете щелкнуть правой кнопкой мыши по файлу и git diff: щелкнув правой кнопкой мыши по первому файлу и через подменю tortoisegit выберите «Diff Later». Затем вы можете щелкнуть правой кнопкой мыши второй файл. , перейдите в подменю tortoisegit и выберите "Различить с вашим именем файлаhere.txt"

камжокотем
источник
-12

Используя PhpStorm, я просто копирую код предыдущей фиксации и сравниваю его с текущей версией, используя встроенный инструмент «сравнить с буфером обмена».

Стиви Уандер
источник
5
PhpStorm - это коммерческая IDE. Этот вопрос касается того, как это сделать в самом git cli, без предположения о дополнительном программном обеспечении.
Чарльз Тейлор