Zobacz zmiany w określonym pliku za pomocą git


472

Wiem, że mogę użyć git diffpolecenia do sprawdzenia zmian, ale, o ile rozumiem, jest on oparty na katalogu. Oznacza to, że podaje wszystkie zmiany wszystkich plików w bieżącym katalogu.

Jak mogę sprawdzić zmiany tylko w jednym określonym pliku? Powiedzmy, że zmieniłem pliki file_1.rb, file_2.rb... file_N.rb, ale interesują mnie tylko zmiany w pliku file_2.rb. Jak sprawdzić te zmiany (zanim zatwierdzę)?



4
Moje główne pytanie brzmi: jak sprawdzić różnicę dla konkretnego pliku, zanim zatwierdzę wszystkie zmiany. Git log służy do zatwierdzonych zmian.
Mellon,

1
Z mojego doświadczenia wynika, że ​​lepiej używać narzędzia wizualnego, takiego jak GitKraken
Giovanni Benussi,

Odpowiedzi:


642

Użyj polecenia takiego jak:

git diff file_2.rb

Zapoznaj się z git diffdokumentacją, aby uzyskać pełne informacje na temat rodzajów rzeczy, dla których możesz uzyskać różnice.

Zwykle git diffsam w sobie pokazuje wszystkie zmiany w całym repozytorium (nie tylko w bieżącym katalogu).


100
Jeśli chcesz zobaczyć zmiany w pliku, które już „dodałeś”, to jest to „git diff --cached”
Ana Betts

8
Jeśli chcesz sprawdzić plik ze starszym zatwierdzeniem: $ git diff [zatwierdzenie skrótu] plik_2.rb
Alex Angelico

2
Jak wyjść z widoku różnic?
Garry,

1
Lub użyj SourceTree.
GeneCode

4
@GurpreetsinghDhanju Spróbuj nacisnąć Q

110

Inna metoda (wspomniana w tej odpowiedzi SO ) zachowa historię w terminalu i zapewni bardzo dokładny zapis samego pliku:

git log --follow -p -- file

Spowoduje to wyświetlenie całej historii pliku (w tym historii bez zmian nazw i różnic dla każdej zmiany).

Innymi słowy, jeśli plik o nazwie bar był kiedyś nazwany foo, to git log -p pasek (bez opcji --follow) pokaże tylko historię pliku do momentu, w którym zmieniono jego nazwę - nie pokaże historia pliku, gdy był znany jako foo. Użycie git log - pasek -p wyświetli całą historię pliku, w tym wszelkie zmiany w pliku, gdy był znany jako foo.


3
Działa ładnie z --stat, aby mieć przegląd dodanych / usuniętych linii.
Tom Hale

2
Tak, ta odpowiedź powinna zajmować co najmniej wyższą pozycję, śledzić historię, a nie tylko bieżącą różnicę, ani nie trzeba śledzić wszystkich skrótów zatwierdzeń. Całkiem proste użycie, ale bardzo wydajne w zmianach
Ilhicas

87

Możesz użyć, gitk [filename]aby wyświetlić dziennik zmian


2
Spowodowałoby to wyświetlenie historii zatwierdzeń w pliku, co czasem może być tym, czego potrzebujesz.
r1k0

26

Możesz użyć poniższego polecenia, aby zobaczyć, kto zmienił co w pliku.

git blame <filename>


4
To najlepsza odpowiedź, ponieważ mówi ci, kto dokonał zmiany i kiedy oraz w jakim zatwierdzeniu była częścią zmiany. Aby odfiltrować określoną zmianę, po prostu zrób, git blame <filename> | grep <searchfor>gdzie <searchfor>jest krótka wartość. Na przykład, aby dowiedzieć się, kto zmienił foosię barIN dist/index.php, należy użyćgit blame dist/index.php | grep bar
Kraang Prime

15

Możesz wykonać

git status -s

Spowoduje to wyświetlenie nazwy zmodyfikowanych plików, a następnie po skopiowaniu ścieżki zainteresowanego pliku można zobaczyć zmiany za pomocą git diff

git diff <filepath + filename>

8

aby wyświetlić listę, zatwierdza tylko szczegóły dotyczące określonych zmian plików,

git log --follow file_1.rb

aby wymienić różnicę między różnymi zatwierdzeniami dla tego samego pliku,

git log -p file_1.rb

aby wymienić tylko zatwierdzenie i jego komunikat,

git log --follow --oneline file_1.rb

5

możesz także spróbować

git show <filename>

W przypadku zatwierdzeń, git show pokaże komunikat dziennika i różnicę tekstową (między plikiem a zatwierdzoną wersją pliku).

Możesz sprawdzić dokumentację git show, aby uzyskać więcej informacji.



0

Całkowicie zgadzam się z @Greg Hewgill

A jeśli ścieżka zawiera spacje, możesz użyć, spróbuj dodać za pomocą apostrofu ' lub `

git diff 'MyProject / My Folder / My Sub Folder / file_2.rb'

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.