Git #9 Git log & shortlog, czyli historia w konsoli
Poziom trudności
2/5

Podczas pracy w projekcie z wykorzystaniem systemu kontroli wersji GIT, jedną z często wykonywanych czynności będzie przeglądanie historii. Można to zrobić co najmniej na kilka sposobów. Każdy ma swoje wady i zalety, a to, czy używany jednego, czy drugiego zależy głównie od prywatnych preferencji każdego użytkownika. W tym artykule przedstawię używanie polecenia git log

Git log

Pierwszym sposobem, który trzeba obowiązkowo znać, jest polecenie git log. Dzięki niemu możemy bez dodatkowych narzędzi, bezpośrednio w konsoli przeglądać informacje o przeszłych commit‚ach. Podstawowe użycie tej komendy ogranicza się do wpisania:

qabrio@test:~/workspace/git_test$ git log
commit 2acc6dd867d8e3d27fe590712518717aa0ec0941 (HEAD -> master)
Merge: 1c20681 50c6d18
Author: Qabrio
Date: Mon Jan 27 20:41:00 2020 +0100
Merge branch 'new_feature_1'
commit 1c20681c48cf189d5a0088c7992096e5f5f7b5bb
Author: Qabrio
Date: Mon Jan 27 20:29:00 2020 +0100
feature_6 has been changed
commit 89c4987480c2139d321ad97ddbe979d517a69e62
Author: Qabrio
Date: Mon Jan 27 19:47:00 2020 +0100
add new variable as a factor
commit 50c6d1836c7ef9d9f7238506db54a2b0b5e2168b (new_feature_1)
Author: Qabrio
Date: Mon Jan 27 19:33:00 2020 +0100
feature_1 implemented
(...)

Jak widać powyżej, otrzymaliśmy informacje o commit’ach w projekcie. Informacje, jakie uzyskaliśmy to identyfikator, autor, data oraz dodatkowo tytuł. Jeśli dodatkowo do któregoś z commit’ów był dodany tag, zostanie on wyświetlony obok identyfikatora. Jeśli taka forma jest dla kogoś nieczytelna, a informacje o dacie i autorze są nadmiarowe, polecam skorzystanie z flagi –oneline, dzięki czemu uzyskamy informacje w bardziej czytelnej i przejrzystej, tabelarycznej formie:

qabrio@test:~/workspace/git_test$ git log --oneline
2acc6dd (HEAD -> master) Merge branch 'new_feature_1'
1c20681 feature_6 has been changed
89c4987 add new variable as a factor
50c6d18 (new_feature_1) feature_1 implemented
b3cc096 small type fix for the fucntion test_1 and test_4
ca2c9d8 initial commit
qabrio@test:~/workspace/git_test$

Kolejną możliwą formą wyświetlenia historii w konsoli jest skorzystanie z flagi graph, dzięki której będziemy mieli podstawową wizualizację ścieżek:

qabrio@test:~/workspace/git_test$ git log --graph
* commit 2acc6dd867d8e3d27fe590712518717aa0ec0941 (HEAD -> master)
|\ Merge: 1c20681 50c6d18
| | Author: Qabrio
| | Date: Mon Jan 27 20:41:00 2020 +0100
| |
| | Merge branch 'new_feature_1'
| |
| * commit 50c6d1836c7ef9d9f7238506db54a2b0b5e2168b (new_feature_1)
| | Author: Qabrio
| | Date: Mon Jan 27 19:33:00 2020 +0100
| |
| | feature_1 implemented
| |
* | commit 1c20681c48cf189d5a0088c7992096e5f5f7b5bb
| | Author: Qabrio
| | Date: Mon Jan 27 20:29:00 2020 +0100
| |
| | feature_6 has been changed
| |
* | commit 89c4987480c2139d321ad97ddbe979d517a69e62
|/ Author: Qabrio
| Date: Mon Jan 27 19:47:00 2020 +0100
|
| add new variable as a factor

Oczywiście nic nie stoi na przeszkodzie, aby połączyć obie opcje w jednym poleceniu i użyć git log –oneline –graph. Niezależnie od formy wyświetlania, możemy ograniczyć liczbę wyświetlanych ostatnio commit’ów, poprzez wykorzystanie parametru -n [liczba] lub po prostu -[liczba]. Na przykład w celu podglądu ostatniego commit’a w formie tabelarycznej użyjemy:

qabrio@test:~/workspace/git_test$ git log --oneline -n 2
2acc6dd (HEAD -> master) Merge branch 'new_feature_1'
1c20681 feature_6 has been changed
qabrio@test:~/workspace/git_test$ git log --oneline -2
2acc6dd (HEAD -> master) Merge branch 'new_feature_1'
1c20681 feature_6 has been changed
qabrio@test:~/workspace/git_test$

Aliasy w Git'cie

Kolejną ciekawą możliwością, jaką oferuje nam git, jest możliwość tworzenia aliasów. Przykładowe tworzenie, a następnie użycie aliasu będzie wyglądało tak:

qabrio@test:~/workspace/git_test$ git config --global alias.customlog "log --oneline --graph"
qabrio@test:~/workspace/git_test$ git customlog
* 2acc6dd (HEAD -> master) Merge branch 'new_feature_1'
|\
| * 50c6d18 (new_feature_1) feature_1 implemented
* | 1c20681 feature_6 has been changed
* | 89c4987 add new variable as a factor
|/
* b3cc096 small type fix for the fucntion test_1 and test_4
* ca2c9d8 initial commit
qabrio@test:~/workspace/git_test$

Analizując powyższy przykład, można zauważyć, że tworzenie aliasu dla git’a jest bardzo podobne do tworzenia aliasów w shell’u. Trzeba pamiętać, że po kropce w poleceniu alias, wpisujemy nazwę aliasu, a komenda musi zostać podana w cudzysłowie. Przydatne jest to, że alias może być używany bezpośrednio po utworzeniu.

Więcej detali: --stat

Polecenie git log, umożlwiia także wyświetlanie informacji dotyczących zmienionych plików w każdym commit’cie. Wystarczy użyć parametru –stat, jak w poniższym przykładzie:

qabrio@test:~/workspace/git_test$ git log --stat -3
commit 2acc6dd867d8e3d27fe590712518717aa0ec0941 (HEAD -> master)
Merge: 1c20681 50c6d18
Author: Qabrio
Date: Mon Jan 27 20:41:00 2020 +0100
Merge branch 'new_feature_1'
commit 1c20681c48cf189d5a0088c7992096e5f5f7b5bb
Author: Qabrio
Date: Mon Jan 27 20:29:00 2020 +0100
feature_6 has been changed
test_file_1 | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
commit 89c4987480c2139d321ad97ddbe979d517a69e62
Author: Qabrio
Date: Mon Jan 27 19:47:00 2020 +0100
add new variable as a factor
test_file_2 | 6 ++++++
1 file changed, 6 insertions(+)
qabrio@test:~/workspace/git_test$

Filtrowanie logów

Polecenie git log umożliwia także filtrowanie logów. Główne parametry filtrujące to:

Poniżej przykłady użycia każdego z nich. Jednak z racji tego, że przykładowy projekt jest bardzo mały, ciężko pokazać dokładne rezultaty działania filtrów, dlatego pominę zwracane przez nie wyniki:

qabrio@test:~/workspace/git_test$ git log --after 2020-01-20
(...)
qabrio@test:~/workspace/git_test$ git log --before 2020-01-20
(...)
qabrio@test:~/workspace/git_test$ git log --author=qabrio
(...)

Git shortlog

Istnieje również możliwość przeglądania historii w formie pogrupowanej po użytkowniku. Dodatkowo możemy użyć flagi -e, która spowoduje wyświetlenie adresu e-mail danego użytkownika, oraz flagi -n, która posortuje nam wszystkie osoby po liczbie commit’ów (oczywiście z racji, że w projekcie są tylko dwa commi’ty jednego użytkownika, nie zobaczymy rezultaty flagi -n). Cała komenda może wyglądać następująco:

qabrio@test:~/workspace/git_test$ git shortlog -e -n
Qabrio (6):
initial commit
small type fix for the fucntion test_1 and test_4
feature_1 implemented
add new variable as a factor
feature_6 has been changed
Merge branch 'new_feature_1'

Ciekawą opcją jest dodanie flagi -s, która spowoduje zsumowanie commit’ów dla każdego użytkownika:

qabrio@test:~/workspace/git_test$ git shortlog -s
6 Qabrio

Shortlog umożliwia także przeszukiwanie commit’ów, poprzez użycie flagi –grep. Cała komanda może prezentować się następująco:

qabrio@test:~/workspace/git_test$ git shortlog -e --grep "feature"
Qabrio (3):
feature_1 implemented
feature_6 has been changed
Merge branch 'new_feature_1'

Jak widzimy został znaleziony jeden commit, który pasował do naszego zapytania. Ciekawostką jest fakt, że w poleceniu dodatkowo można użyć flagi –invert-grep, co spowoduje przeciwieństwo wyżej wykonanej komedny — w powyższym przypadku znajdzie wszystkie commit’y NIE-zawierające frazy first.

Mam nadzieję, że po przeczytaniu tego tekstu, przeglądanie historii git’a przy użyciu wiersza poleceń, nie będzie już takie straszne :).

Dodaj komentarz