git diff między dwoma różnymi plikami

112

W HEAD(najnowszym zatwierdzeniu) mam plik o nazwie foo. W moim obecnym drzewie roboczym zmieniłem jego nazwę na bar, a także dokonałem edycji.

Chcę git diff foosię HEAD, a barw moim obecnym drzewie roboczym.

MiJyn
źródło
65
Pomyślałem, że to pytanie (z tytułu) może dotyczyć użycia git diff na dwóch plikach, które niekoniecznie znajdują się w repozytorium. Zauważyłem, że służy do tego flaga --no-index, np. git diff --no-index --word-diff old_file.txt new_file.txt(--Word-diff podkreśla zmiany według słowa, a nie tylko wiersza, co jest bardzo pomocne w przypadku długiego tekstu).
Pat

Odpowiedzi:

139

Podaj ścieżki jawnie:

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

Sprawdź --find-renamesopcję w git-diff dokumentach .

Kredyt: twaggs .

Steven Wexler
źródło
10
Chcę wspomnieć, że możesz porównać dowolne dwa pliki używając, git diff <path> <path>nawet jeśli nie znajdują się w repozytorium git.
mitenka
1
@mitenka Nie sądzę, że to prawda. Jeśli spojrzysz na git diff --help, zobaczysz, że jedyne wzorce obsługiwane dla dwóch plików to git diff [<options>] --no-index [--] <path> <path>. git diff a bdopasowuje tylko wzorce zatwierdzeń, a nie pliki.
Doug
@Doug Oto cytat z polecenia pomocy, o którym wspomniałeś, git-scm.com/docs/git-diff : Pokaż zmiany [...] między dwoma plikami na dysku.
mitenka
@mitenka pomoc mówi, jeśli nie używasz '--no-index', nie porównuje plików; twój komentarz powinien być osobną odpowiedzią; to nieprawda i nie dotyczy tej odpowiedzi.
Doug
1
@Doug Dziękuję za twoją opinię. Oto cytat z pomocy, do której się odwołujesz: Możesz pominąć tę --no-indexopcję, uruchamiając polecenie w drzewie roboczym kontrolowanym przez Gita i co najmniej jedna ze ścieżek wskazuje poza drzewem roboczym lub podczas uruchamiania polecenia poza drzewem roboczym kontrolowanym przez Gita .
mitenka
81

Uważam, że używanie --no-indexjest tym, czego szukasz:

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

jak wspomniano w podręczniku git:

Ta forma służy do porównania podanych dwóch ścieżek w systemie plików. Możesz pominąć--no-indexopcję, uruchamiając polecenie w drzewie roboczym kontrolowanym przez Gita, a przynajmniej jedna ze ścieżek wskazuje poza drzewem roboczym lub podczas uruchamiania polecenia poza drzewem roboczym kontrolowanym przez Git.

mh sattarian
źródło
1
@swe to zdecydowanie przydatna odpowiedź, ale OP wyraźnie stwierdził, że plik jest w HEAD, co oznacza, że ​​znajduje się w indeksie git. Zaakceptowana odpowiedź bezpośrednio odnosi się do pytania. Również zaakceptowana odpowiedź miała 6 lat
Michael Delgado
3
Może to nie pomogło OP, ale właśnie tego szukałem.
thislooksfun
1
To odpowiada na pytanie zamieszczone w tytule, jeśli unikałeś tego w Internecie.
Merlin
Dzięki za odpowiedź w tytule ... dlatego tu przyjechałem.
grek40
Cieszę się, że to pomogło.
mh sattarian
3

Jeśli używasz narzędzia Tortoise Git, możesz kliknąć plik prawym przyciskiem myszy i uzyskać różnicę przez: Kliknięcie prawym przyciskiem myszy na pierwszym pliku i poprzez podmenu tortoisegit wybierz opcję "Porównaj później" Następnie na drugim pliku możesz również kliknąć prawym przyciskiem myszy , przejdź do podmenu tortoisegit, a następnie wybierz „Porównaj z twoją nazwą pliku.txt”

camjocotem
źródło
-12

Używając PhpStorm, po prostu kopiuję kod poprzedniej zmiany i porównuję go z aktualną wersją za pomocą wbudowanego narzędzia "porównaj ze schowkiem".

Stevie Wonder
źródło
5
PhpStorm to komercyjne IDE. To pytanie dotyczy tego, jak to zrobić w samym git cli, bez domniemania dodatkowego oprogramowania.
Charles Taylor