git diff dwa pliki w tej samej gałęzi, to samo zatwierdzenie

97

przepraszam, jeśli to pytanie istnieje, o dziwo nie mogłem go znaleźć: /

Jak mogę wykonać git diffmiędzy dwoma plikami w tej samej gałęzi i tym samym zatwierdzeniu?

to znaczy git diff fileA.php fileB.php

(najlepiej z łatwym do odczytania kodowaniem kolorami, które gitoferuje ... lub podobne do tego, co robi program BeyondCompare!)

d -_- b
źródło
Uwaga: Git: Jak porównać dwa różne pliki w różnych zatwierdzeniach? jest nieco bardziej ogólne niż to pytanie, ale odpowiedź jest zasadniczo taka sama, jak poprawna odpowiedź na to , i nie zawiera wszystkich tych fałszywych odpowiedzi, więc głosowałem za zamknięciem tego jako naiwniaka.
SamB

Odpowiedzi:

84

Nie potrzebujesz do tego gita, po prostu użyj diff fileA.php fileB.php(lub vimdiff, jeśli chcesz porównać obok siebie)

JaredMcAteer
źródło
22
vimdiffdla zwycięstwa! Dzięki!
d -_- b
24
To może działać, ale nie jest to git diff. To zupełnie inny format wyjściowy.
daboross
11
To nie odpowiada na pierwotne pytanie
DylanYoung
8
Nie zgadzam się, OP nie był jasny, ale fakt, że wspomina BeyondCompare, oznacza, że ​​nie szuka on konkretnie git diffróżnicy, ale po prostu łatwego do odczytania diff. Również fakt, że przyjął moją odpowiedź jako to, czego szukał, wskazuje również, że w rzeczywistości odpowiada ona.
JaredMcAteer
3
przeczytaj uważnie odpowiedź. polecenie diff fileA fileBnie jestgit diff fileA fileB
Matthew Hinea
247

Jeśli chcesz użyć git diffna dwóch dowolnych plikach, możesz użyć git diff --no-index <file_a> <file_b>. Aby gitto zadziałało, nie trzeba śledzić tych dwóch plików .

rzrgenesys187
źródło
32
+1, ponieważ odpowiada na podstawowe pytanie (niezależnie od tego, „dlaczego miałbyś to zrobić”… może być powód)
NobodysNightmare
19
--word-diffpodkreśla zmiany słowami, a nie tylko liniami
user3148949
2
Dla tych z nas, którzy używają PowerShell, jest to znacznie łatwiejszy sposób na uzyskanie różnicy dwóch plików w repozytorium.
Jay Soyer
2
W jaki sposób ta doskonała odpowiedź jest wymieniona poniżej 2 wcześniejszych, odpowiedzi posiadające mniej głosów (i mniej przydatne) podczas sortowania według „aktywnych” ??? Nawet nie liczę odpowiedzi oznaczonej jako poprawna. W każdym razie dzięki!
j_random_hacker
@daboross W GNU diffutils 3.4+ (2016-08-08), diffhas --color, co może pomóc (patrz unix.stackexchange.com/a/338960 ). Ale nawet wtedy, jeśli jest używany diff-so-fancy, wydaje się, że wymaga określonego formatu wyjściowego git diff. diff -u(patrz stackoverflow.com/a/4857407/10095231 ) nie działa.
kelvin
14

Jeśli pliki, które chcesz porównać, znajdują się w kopii roboczej, możesz użyć po prostu difftak, jak wskazały inne, jednak jeśli pliki są w jakiejś wersji, możesz określić wersję dla każdego pliku

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

jak zauważono tutaj: https://stackoverflow.com/a/3343506/1815446

W twoim przypadku (określając tę ​​samą wersję dla obu plików):

git diff <revisionX>:fileA.php <revisionX>:fileB.php
Pau Fracés
źródło
Uwaga: może to być wersjaHEAD~2 , SHA-1, nazwa oddziału itp.
ma11hew
To zadziałało dla mnie, po prostu porównując nazwy plików z dwóch różnych katalogów: git diff --name-only HEAD:dir1 HEAD:dir1_backup działa po jednym git addz obu katalogów.
Frank Forte
1
Działa to, jeśli wersja nie jest wypisana do drzewa roboczego lub pliki drzewa roboczego są modyfikowane i ktoś chce porównać oryginały, lub jeśli w ogóle nie ma drzewa roboczego, jak w czystym repozytorium git. Szkoda, że ​​to wysoko oceniane pytanie ma wysoko oceniane odpowiedzi, które odpowiadają na wciąż użyteczne, ale całkiem inne pytanie, "jak mogę uzyskać wynik podobny do git-diff bez używania git?"
TrentP
4

Aby zwykłe różnice w gnu wyglądały bardziej jak git diff, polecam następujące parametry:

diff -burN file_or_dir1 file_or_dir2

(gdzie -bignoruje spacje, -uujednoliconą różnicę, -rrekurencję, -Ntraktuje brakujące pliki jako /dev/null).

Działa świetnie, ale nadal nie ma kolorów, a automatyczne stronicowanie w stylu git jest praktycznie nieobecne. Jeśli chcesz naprawić oba (tak robię), zainstaluj colordiffi używaj w następujący sposób:

colordiff -burN file_or_dir1 file_or_dir2 | less -R

Daje to wyjście i interfejs bardzo zbliżone do rzeczywistego git diff.

mvp
źródło
4
-1, ponieważ „nie możesz” jest niepoprawne (patrz: stackoverflow.com/a/13965200/968531 )
NobodysNightmare
Usuń „nie możesz”, dodaj instrukcje dotyczące instalacji colordiff i może to być dobra odpowiedź na pierwotne pytanie.
DylanYoung
-4

Po prostu użyj zwykłego diff.

diff -Nua fileA.php fileB.php
Peter van der Does
źródło
8
-1, ponieważ „nie możesz” jest niepoprawne (patrz: stackoverflow.com/a/13965200/968531 )
NobodysNightmare