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


112

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

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


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, без предположения о дополнительном программном обеспечении.
Чарльз Тейлор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.