Jak mogę wyświetlić listę wszystkich zatwierdzeń, które zmieniły określony plik?


800

Czy istnieje sposób, aby wyświetlić listę wszystkich zatwierdzeń, które zmieniły określony plik?


1
Czy szukasz zmian w pliku w jednym oddziale; we wszystkich lokalnych oddziałach; we wszystkich oddziałach na jednym pilocie; czy to wszystko? Myślę, że to wszystko będzie wymagało skryptu.
benhorgen

Odpowiedzi:


1081

Te --followprace dla danego pliku

git log --follow -- filename

Różnica w stosunku do innych podanych rozwiązań

Należy pamiętać, że inne rozwiązania obejmują git log path(bez --follow). Takie podejście jest przydatne, jeśli chcesz śledzić np. Zmiany w katalogu , ale potknie się przy zmianie nazwy plików (więc użyj --follow filename).


32
+1 --followodpowiada za zmianę nazwy, więc jest to bardziej niezawodne niżgit log -- path
Gabe Moothart,

42
Zauważ, że --followakceptuje ścieżkę , która może być plikiem, ale także katalogiem. W przypadku tego ostatniego będzie on działał rekurencyjnie i raportował zmiany we wszystkich plikach poniżej tego punktu. (To zachowanie nie jest udokumentowane na stronie podręcznika i może nie być trwałe.)
StvnW

5
Jaka jest różnica między tym a sprawiedliwymgit log filename?
VaTo

8
@ SaulOrtega, git log filenamenie śledzi zmiany nazwy pliku, tzn. Pokaże wszystkie zatwierdzenia dotyczące tej nazwy pliku (nie rzeczywisty plik). Jeśli utworzysz pliki, Xa Yzmienisz oba, a następnie usuniesz Yi zmienisz nazwę Xna, Ya następnie zmienisz je i uruchomisz git log Y, otrzymasz wiadomości zarówno dla starej, jak Yi nowej . I odwrotnie, --followotrzymasz zatwierdzenia dotyczące tego pliku, gdy zostanie on nazwany X i kiedy zostanie nazwany Y.
MarSoft,

7
użyj „git log - all filename”, aby wyświetlić wszystkie zatwierdzenia we wszystkich oddziałach
Lebnik

122

git log pathpowinien robić co chcesz. Od git logmężczyzny :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.

11
Nie działa, jeśli ścieżka pliku uległa zmianie. Odpowiedź jackrabbit działa w tym przypadku.
kwahn

1
Działa to, jeśli musisz ograniczyć dziennik do określonej gałęzi
am

63

Patrzyłem na to uważnie i wydaje się, że wszystkie te odpowiedzi nie pokazują mi naprawdę wszystkich zobowiązań we wszystkich oddziałach.

Oto, co wymyśliłem, bawiąc się opcjami widoku edycji gitk. To pokazuje mi wszystkie zatwierdzenia dla pliku, niezależnie od oddziału, lokalnego, ponownego logowania i zdalnego.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

Działa również z git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename

11
Jest to idealne rozwiązanie, gdy ktoś wprowadza zmiany, ale zapomina, gdzie je zatwierdził.
earthmeLon

2
Bardzo przydatne. Obejmuje również zobowiązania do
przechowywania

To powinna być preferowana odpowiedź. Pytanie polegało na znalezieniu wszystkich zatwierdzeń, tak właśnie jest.
carl verbiest

Uwaga, która --reflogobejmuje zobowiązania, które zostały ponownie wprowadzone / zmienione lub w inny sposób odrzucone. Może to powinno być oczywiste, ale próbowałem to wykorzystać git logi starałem się zrozumieć, dlaczego widzę pozornie zduplikowane zatwierdzenia!
Soren Bjornstad,

43

Użyj poniższego polecenia, aby uzyskać zatwierdzenia dla określonego pliku:

git log -p filename

8
Rozumiem, że to nie do końca odpowiada na pytanie, ponieważ chciał listy zatwierdzeń, ale to jest złoto i będzie w moim pliku.
zkent

3
To nie zadziała, jeśli plik nie istnieje w aktualnie wyewidencjonowanym oddziale. Możesz dodać gałąź jak git log -p mybranch -- filenamelub po prostu użyć, git log --all -- filenameaby przeglądać wszystkie gałęzie.
Soren Bjornstad,

37

Powinno być tak proste, jak git log <somepath>; sprawdź stronę (git-log(1) ).

Osobiście lubię używać, git log --stat <path>aby zobaczyć wpływ każdego zatwierdzenia na plik.


9
Lub nawet -pjeśli chcesz zobaczyć pełną różnicę, nie tylko to, że zmodyfikowano pewną liczbę linii.
Cascabel,

To prawda, ale to dość głośne, biorąc pod uwagę, że większość plików była zmieniana wiele razy w ciągu ich życia. Nie chcę widzieć pełnych różnic dla każdego zatwierdzenia, które kiedykolwiek dotknęło pliku. Zwykle szukam konkretnej rzeczy, więc mogę uzyskać dziennik zawierający tylko wpływy, a następnie git showkonkretne zatwierdzenia, które wyglądają, jakby miały znaczenie.
rfunduk

git log --stat --follow - * .html => wyjściowa lista zatwierdzeń z dokładnie jednym plikiem w każdym zatwierdzeniu. Bardzo dobrze!
Sergio Belevskij

18

Alternatywnie (od Gita 1.8.4) możliwe jest również pobranie wszystkich zatwierdzeń, które zmieniły określoną część pliku. Możesz to zrobić, przechodząc przez linię początkową i numer linii końcowej.

Zwrócony wynik to lista zatwierdzeń, które zmodyfikowały tę konkretną część. Polecenie wygląda następująco:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

gdzie upperLimitjest start_line_numberi lowerLimitjestending_line_number

Więcej informacji - https://www.techpurohit.com/list-some-useful-git-commands


17

Jak zauważył jackrabb1t, --followjest bardziej niezawodny, ponieważ nadal wymienia historię poza nazwami / ruchami. Tak więc, jeśli szukasz pliku, który nie znajduje się obecnie w tej samej ścieżce lub pliku, którego nazwa została zmieniona w różnych zatwierdzeniach, - śledzi go.

Może to być lepsza opcja, jeśli chcesz wizualizować zmiany nazwy / ścieżki:

git log --follow --name-status -- <path>

Ale jeśli chcesz mieć bardziej kompaktową listę zawierającą tylko to, co ważne:

git log --follow --name-status --format='%H' -- <path>

lub nawet

git log --follow --name-only --format='%H' -- <path>

Minusem jest to, że --followdziała tylko dla jednego pliku.


4
--followdziała dla pojedynczej ścieżki , która może być katalogiem. Jeśli przejdzie katalog, uruchomi się rekurencyjnie i zgłosi zmiany we wszystkich plikach poniżej tego punktu.
StvnW

10

Jeśli próbujesz obserwować plik usunięty w poprzednim zatwierdzeniu, użyj

git log --follow -- filename

3
Dla gitpoczątkujących: Służy również git log -p --follow -- filenamedo wyświetlania zmian. Uwaga: „nazwa pliku” może być plikiem, katalogiem lub submodułem.
Tino

8

Jeśli chcesz wyświetlić wszystkie zatwierdzenia, które zmieniły plik, we wszystkich gałęziach użyj tego:

git log --follow --all <filepath>

8

Jeśli chcesz szukać wszystkich zatwierdzeń według, filenamea nie według filepath , użyj:

git log --all -- '*.wmv'

6

Jeśli chcesz zobaczyć wszystkie zmiany wprowadzone w zatwierdzeniach, które zmieniły konkretny plik (a nie tylko zmiany w samym pliku), możesz przekazać --full-diff:

git log -p --full-diff [branch] -- <path>

lub bez[branch]
Anentropic

1
@Anentropic Nawiasy kwadratowe miały wskazywać, że argument jest opcjonalny.
Cubic

To wszystko, czego potrzebuję, pokazuje pełną zmianę, obejmuje pewną zmianę po scaleniu.
ThanhLD,

5

Służy git log --all <filename>do wyświetlania zatwierdzeń wpływających <filename>na wszystkie gałęzie.


4
gitk <path_to_filename>

Zakładając, że pakiet „gitk” jest już zainstalowany.

Jeśli nie jest zainstalowany, wykonaj następujące czynności:

sudo apt-get install gitk

A następnie wypróbuj powyższe polecenie. To jest dla Linuksa ... Może pomóc użytkownikom Linuksa, jeśli chcą GUI.


Użytkownicy systemu Windows powinni pamiętać, że gitkjest on dołączony do Git dla Windows.
Soren Bjornstad

2

Aby uzyskać listę skrótów zatwierdzeń, użyj git rev-list

 git rev-list HEAD <filename>

Wynik:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

co oznacza, że ​​5 zatwierdzeń dotknęło tego pliku. Ma odwrotną kolejność chronologiczną, więc pierwsze zatwierdzenie na liście b7c4f0d7jest najnowsze.


1

W systemie Linux możesz do tego użyć gitk.

Można go zainstalować przy użyciu „sudo apt-get install git-gui gitk”. Może być używany do wyświetlania zatwierdzeń określonego pliku przez „gitk <nazwa_pliku>”.


1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Odniesienie

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.