Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 5 - Git - Zkoumání historie

V dnešním Git tutoriálu se budeme zabývat identifikací commitů a začneme zkoumat historii. Vypíšeme si všechny commity, zobrazíme změny v souborech, vyfiltrujeme historii a zobrazíme historii větví.

Všechny příkazy budeme zkoušet v našem naklonovaném repositáři Laravel z lekce Git - Základy - Dokončení. Otevřeme terminál MinTTY a pomocí příkazu cd laravel se do repositáře přesuneme.

Identifikace commitů

V Git je možné commit identifikovat různými způsoby, což nám umožňuje jednoznačně určit konkrétní commit. Mezi klíčové metody identifikace patří:

  • Hash commitu.
  • Jméno větve.
  • Tag.

Hash commitu

Jak již bylo zmíněno v předchozích lekcích, každý commit je definován svým hashem. Jedná se o 40-ti místné hexadecimální číslo, například 036ea83da2afba28163a1f959a227cda7bd14a88. Toto číslo je jedinečné pro každý commit. Pro identifikaci commitu ovšem nemusíme toto číslo psát celé, stačí pouze jeho několik prvních znaků.

Jméno větve

Každá větev (branch) je složena minimálně z jednoho commitu. Při vytvoření nového lokálního repositáře a provedení prvního commitu vytváříme hlavní větev s názvem master nebo main.

Název hlavní větve je obvykle nastaven při instalaci Gitu a lze jej později přejmenovat. V budoucích lekcích se budeme věnovat větvím podrobněji. 

Tag

Tag slouží k označení důležitých bodů v historii projektu, jako jsou nové verze, důležité opravy chyb nebo klíčové milníky. Můžeme je přidávat k libovolnému commitu. Seznam všech tagů v repozitáři lze vypsat pomocí příkazu git tag, který je následován výpisem tagů seřazených abecedně.

Nyní příkazem git tag zobrazíme všechny vytvořené tagy v repositáři laravel seřazené abecedně:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git tag
v10.0.0
v10.0.1
v10.0.2
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Klávesami nebo si můžeme seznam tagů prohlížet. Stisknutím klávesy q seznam zavřeme.

Každý tag musí mít unikátní název. Každý nově vytvořený tag je automaticky připojen k aktuálnímu commitu. Git umožňuje vytvořit lehký nebo anotovaný tag.

Lehký tag

Lehký tag se velmi podobá větvi, pouze s tím rozdílem, že se nepřemisťuje. Tedy slouží pouze jako ukazatel na commit. Pro jeho vytvoření stačí vytvořit nebo se přepnout na commit, který chceme označit a zadat příkaz git tag <nazev tagu>.

Pro aktuální commit vytvoříme nový tag s názvem lehky_tag:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git tag lehky_tag
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Spuštěním příkazu git tag, uvidíme náš nově vytvořený tag:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git tag
lehky_tag
v10.0.0
v10.0.1
v10.0.2
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Anotovaný tag

Anotovaný tag je plnohodnotným objektem, srovnatelný s commitem. Obsahuje všechny identifikační informace jako commit (jméno autora, čas, hash) a můžeme k němu přidat zprávu. Pro jeho vytvoření použijeme příkaz git tag -a <nazev tagu> -m "<zpráva k tagu>".

K aktuálnímu commitu nyní vytvoříme anotovaný tag:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git tag -a anotovany_tag -m "Vytvoření anotovaného tagu"
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Tag si opět ověříme příkazem git tag:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git tag
anotovany_tag
lehky_tag
v10.0.0
v10.0.1
v10.0.2
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Zkoumání historie

Prohlížení historie je v Gitu jednou z nejdůležitějších operací, díky které máme možnost obnovit stav repositáře do určitého bodu v historii. Git poskytuje tyto klíčové příkazy:

  • git log pro výpis všech commitů, zobrazení změn v souborech, filtrování historie a zobrazení historie větví.
  • git branch pro zobrazení seznamu větví.
  • git show pro zobrazení detailů commitu.
  • git diff pro porovnání změn.

Dnes si ukážeme příkaz git log. S dalšími příkazy se seznámíme později.

Příkaz git log

Příkazem git log můžeme vypsat všechny commity, zobrazit změny v souborech, filtrovat historii a zobrazit historii větví.

Výpis všech commitů

Nejprve si ukážeme zobrazení seznamu všech commitů, včetně jejich identifikátorů, autorů, data a času provedení, příslušných zpráv commitu a změn v souborech

Zatímco příkaz git status umožňuje zkontrolovat pracovní adresář a pracovní oblast, git log pracuje pouze s potvrzenou historií.

Spuštěním příkazu git log v repositáři laravel dostaneme tento výpis:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log
commit 036ea83da2afba28163a1f959a227cda7bd14a88 (HEAD -> 10.x, tag: lehky_tag, tag: anotovany_tag, origin/HEAD, origin/10.x)
Author: Nuno Maduro <[email protected]>
Date:   Tue Oct 17 14:17:21 2023 +0100

    Uses `actions/checkout@v4`

commit 25070a3ffb175c15b59cd7f12289a9648165bba3
Author: Martin Bastien <[email protected]>
Date:   Tue Sep 26 21:37:09 2023 -0400

    Fix typo in the comment for token prefix (sanctum config) (#6248)

commit 960ea7b325e3ec43c8e795da307f354e61941a66
Author: Taylor Otwell <[email protected]>
Date:   Mon Sep 25 16:38:15 2023 -0500

    Update README.md
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Klávesami nebo si můžeme historii commitů prohlížet, stisknutím klávesy q historii zavřeme.

Pojďme si vysvětlit, co nám Git píše:

  • commit <hash> (tag): Unikátní identifikátor (hash) daného commitu a jeho tag.
  • Author: Autor commitu.
  • Date: Datum a časová zóna, kdy byl commit vytvořen.
  • Update README.md: Zde můžeme vidět název a detailní popis commitu.

Uvedením atributu --oneline zobrazíme každý commit ve zkrácené formě, zobrazí se začátek hashe a jeho název.

Spustíme příkaz git log --oneline a dostaneme tento výpis commitů ve zkrácené formátu <hash> <název>:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log --oneline
036ea83d (HEAD -> 10.x, tag: lehky_tag, tag: anotovany_tag, origin/HEAD, origin/10.x) Uses `actions/checkout@v4`
25070a3f Fix typo in the comment for token prefix (sanctum config) (#6248)
960ea7b3 Update README.md
78243dda Update README.md
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Výstup příkazu git log můžeme omezit zahrnutím -<počet commitů>. Například příkaz git log -3 zobrazí pouze tři nejnovější commity.

Zobrazení změn v souborech

Pro zobrazení změn provedených v souborech se použije atribut --stat. Spustíme příkaz git log --stat k zobrazení commitů se změnami provedených v souborech:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log --stat
commit 036ea83da2afba28163a1f959a227cda7bd14a88 (HEAD -> 10.x, tag: lehky_tag, tag: anotovany_tag, origin/HEAD, origin/10.x)
Author: Nuno Maduro <[email protected]>
Date:   Tue Oct 17 14:17:21 2023 +0100

    Uses `actions/checkout@v4`

 .github/workflows/tests.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Použitím příkazu git log --stat -p získáme podrobný přehled o provedených změnách:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log --stat -p
commit 036ea83da2afba28163a1f959a227cda7bd14a88 (HEAD -> 10.x, tag: lehky_tag, tag: anotovany_tag, origin/HEAD, origin/10.x)
Author: Nuno Maduro <[email protected]>
Date:   Tue Oct 17 14:17:21 2023 +0100

    Uses `actions/checkout@v4`
---
 .github/workflows/tests.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index ebcd6854..0e0c54ec 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -25,7 +25,7 @@ jobs:

     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4

       - name: Setup PHP
         uses: shivammathur/setup-php@v2
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Filtrování historie

Příkaz git log nám také umožňuje filtrovat historii podle data, autora, tagů a souborů. Ukažme si filtrování podle data a souboru.

Filtrování podle data

Pro filtrování historie podle data vytvoření použijeme příkaz git log --oneline --after="<datum>" --before="<datum>":

Nyní si zobrazíme commity vytvořené v období mezi roky 2018 a 2020, seřazených od nejnovějších po nejstarší:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log --oneline --after="2018-01-01" --before="2020-12-31"
919ea4ce update tests
7a2f389f Merge branch 'master' of github.com:laravel/laravel
b1c8ffa1 Merge branch '8.x'
454f0e1a (tag: v8.5.6) Update CHANGELOG.md
e8788a76 update cache
...
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$
Filtrování podle souboru

Pro filtrování podle konkrétního souboru použijeme příkaz git log -- <název souboru> a získáme výpis všech commitů, které ovlivňují soubor README.md:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log -- README.md
commit 960ea7b325e3ec43c8e795da307f354e61941a66
Author: Taylor Otwell <[email protected]>
Date:   Mon Sep 25 16:38:15 2023 -0500

    Update README.md

commit 78243dda899443d478e2a555f8c94d023a2db633
Author: Taylor Otwell <[email protected]>
Date:   Mon Sep 25 16:29:45 2023 -0500

    Update README.md
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Zobrazení historie větví

Příkazem git log --all --graph --oneline --decorate zobrazíme celkovou historii, z které vyčteme průběh změn na jednotlivých větvích.

Zobrazíme si historii vývoje repositáře /laravel ve formě grafu, který nám poskytuje přehled o vývoji projektu:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git log --all --graph --oneline --decorate
  ...
* 88695a7c Add PHP 8.3 to Tests Matrix (#6244)
* 74c5a01b Let database handle default collation (#6241)
| * 96fb350f (origin/master) Re-adds tinker (#6254)
| * 645ab903 Fixes build of `dev-master` (#6252)
| *   8dc6ced5 Merge branch '10.x'
| |\
| | | * 07345458 (origin/revert-6240-revert-6239-10.x) Revert "Revert "Fix incorrect collation for MySQL 8 (#6239)" (#6240)"
| |_|/
|/| |
* | | 96d3ecf5 Revert "Fix incorrect collation for MySQL 8 (#6239)" (#6240)
* | | c088b3b7 Fix incorrect collation for MySQL 8 (#6239)
| |/
|/|
* | bfead27a [10.x] Update sanctum config file (#6234)
| | * 58077d04 (origin/slim-skeleton-11.x) update comment
...

ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

V příští lekci, Git - Zkoumání historie - Dokončení, dokončíme zkoumání historie. Budeme se zabývat seznamem všech větví, detaily commitu, sledováním a odstraněním provedených změn.


 

Předchozí článek
Kvíz - Principy, instalace a základy Gitu
Všechny články v sekci
Git
Přeskočit článek
(nedoporučujeme)
Git - Zkoumání historie - Dokončení
Článek pro vás napsal Patrik Valkovič
Avatar
Uživatelské hodnocení:
300 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity