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?

Daniel
źródło
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).

jackrabb1t
źródło
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.
Gabe Moothart
źródło
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
BigMiner
źródło
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
Sankar Subburaj
źródło
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.

rfunduk
źródło
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

jitendrapurohit
źródło
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.

Roberto
źródło
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
snovelli
źródło
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>
Always_Beginner
źródło
8

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

git log --all -- '*.wmv'
Kraina czarów
źródło
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>
Sześcienny
źródło
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.

Lebnik
źródło
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.

Breen ho
źródło
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.

Boris
źródło
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>”.

Chamila Wijayarathna
źródło
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

AnshBikram
źródło