Git #9 Git log & Git shortlog, czyli historia w konsoli

Git Log i Git Shortlog. W artykule odpowiedź na pytanie jak używać, jakie są różnice, oraz przykłady, jak najlepiej wykorzystać polecenia.

Git shortlog

Git shortlog


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

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

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

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(+)

Filtrowanie logów

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

  • –after — wszystkie commit’y po wprowadzonej dacie,
  • –before — wszystkie commity przed wprowadzoną datą,
  • –author — filtrowania po autorze.

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

Git 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 :).

close

Newsletter