git diff два файла в одной ветке, тот же коммит

97

извините, если этот вопрос существует, я на удивление не смог его найти: /

Как я могу выполнить обмен git diffмежду двумя файлами в одной ветке и одной и той же фиксации?

т.е. git diff fileA.php fileB.php

(в идеале с легко читаемой цветовой кодировкой, которая gitпредлагает .... или похожей на то, что делает программа BeyondCompare!)

г -_- б
источник
Примечание: Git: как различать два разных файла в разных коммитах? является немного более общим, чем этот вопрос, но ответ по сути такой же, как и правильный ответ на этот , и у него нет всех этих фиктивных ответов, поэтому я проголосовал за закрытие этого вопроса как на обман.
SamB

Ответы:

84

Для этого вам не нужен git, просто используйте diff fileA.php fileB.php(или vimdiff, если хотите параллельное сравнение)

Джаред МакАтир
источник
22
vimdiffдля победы! Спасибо!
d -_- b
24
Это может сработать, но это не git diff. Это совершенно другой формат вывода.
daboross 01
11
Это не отвечает на исходный вопрос
DylanYoung
8
Я не согласен, OP не был ясен, но тот факт, что он упоминает BeyondCompare, подразумевает, что он специально не ищет, git diffа просто легко читаемый diff. Также тот факт, что он принял мой ответ как то, что он искал, также указывает на то, что он действительно отвечает на него.
JaredMcAteer,
3
прочтите ответ внимательно. команда diff fileA fileBнетgit diff fileA fileB
Мэтью
247

Если вы хотите использовать git diffдва произвольных файла, вы можете использовать git diff --no-index <file_a> <file_b>. Для этого не нужно отслеживать два файла git.

rzrgenesys187
источник
32
+1 поскольку он отвечает на начальный вопрос (независимо от того, «зачем вы это делаете» ... могут быть причины)
NobodysNightmare
19
--word-diffвыделяет изменения словом, а не просто строкой
user3148949
2
Для тех из нас, кто использует PowerShell, это гораздо более простой способ получить различие двух файлов в репо.
Джей Сойер
2
Как этот отличный ответ, перечисленный ниже 2 ранее, с меньшим количеством голосов (и менее полезными) ответами при сортировке по "активным" ??? Я даже не считаю ответ, помеченный как правильный. В любом случае, спасибо!
j_random_hacker
@daboross В GNU diffutils 3.4+ (08.08.2016) diffесть --color, что может помочь (см. unix.stackexchange.com/a/338960 ). Но даже в этом случае при использовании diff-so-fancy, похоже, требуется конкретный выходной формат git diff. diff -u(см. stackoverflow.com/a/4857407/10095231 ) не работает.
Кельвин
14

Если файлы, которые вы хотите сравнить, находятся в вашей рабочей копии, вы можете использовать их просто так, diffкак указано другими, однако, если файлы находятся в какой-либо ревизии, вы можете указать ревизию для каждого файла.

git diff <revision_1>:<file_1> <revision_2>:<file_2>

как указано здесь: https://stackoverflow.com/a/3343506/1815446

В вашем случае (указав одну и ту же ревизию для обоих файлов):

git diff <revisionX>:fileA.php <revisionX>:fileB.php
Pau Fracés
источник
Примечание: ревизия может быть HEAD~2, SHA-1, именем ветки и т. Д.
ma11hew28
Это сработало для меня, просто сравнив имена файлов из двух разных каталогов: git diff --name-only HEAD:dir1 HEAD:dir1_backup работает после a git addиз обоих каталогов.
Фрэнк Форте
1
Это работает, если ревизия не извлечена в рабочее дерево, или файлы рабочего дерева изменены, и кто-то хочет сравнить оригиналы, или если рабочего дерева нет вообще, как в чистом репозитории git. Очень жаль, что на этот вопрос с высоким рейтингом есть ответы с высокими оценками, которые отвечают на все еще полезный, но совершенно другой вопрос: «Как я могу получить результат, подобный git-diff, без использования git?»
TrentP
4

Чтобы обычный gnu diff выглядел как git diff, я бы рекомендовал следующие параметры:

diff -burN file_or_dir1 file_or_dir2

(где -bигнорировать пробелы, -uунифицированное различие, -rрекурсивно, -Nрассматривать отсутствующие файлы как /dev/null).

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

colordiff -burN file_or_dir1 file_or_dir2 | less -R

Это дает результат и интерфейс, очень близкие к реальным git diff.

mvp
источник
4
-1 , потому что "вы не можете" неверно (см: stackoverflow.com/a/13965200/968531 )
NobodysNightmare
Удалите «вы не можете», добавьте инструкции по установке colordiff, и это может быть нормальным ответом на исходный вопрос.
DylanYoung
0

Если вы хотите сравнить два локальных файла в одном каталоге, просто используйте diff.

diff fileA.php fileB.php
Мэтт Лэйси
источник
Это не ответ на исходный вопрос
DylanYoung
-4

Просто используйте обычный diff.

diff -Nua fileA.php fileB.php
Питер ван дер До
источник
8
-1 , потому что "вы не можете" неверно (см: stackoverflow.com/a/13965200/968531 )
NobodysNightmare