IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - Git - Skúmanie histórie

V predchádzajúcom kvíze, Kvíz - Princípy, inštalácie a základy Gitu, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.

V dnešnom Git tutoriále sa budeme zaoberať identifikáciou commitov a začneme skúmať históriu. Vypíšeme si všetky commity, zobrazíme zmeny v súboroch, vyfiltrujeme históriu a zobrazíme históriu vetiev.

Všetky príkazy budeme skúšať v našom naklonovanom repositári Laravel z lekcie Git – Základy – Dokončenie. Otvoríme terminál MinTTY a pomocou príkazu cd laravel sa do repositára presunieme.

Identifikácia commitov

V Git je možné commit identifikovať rôznymi spôsobmi, čo nám umožňuje jednoznačne určiť konkrétny commit. Medzi kľúčové metódy identifikácie patria:

  • Hash commit.
  • Meno vetvy.
  • Tag.

Hash commit

Ako už bolo spomenuté v predchádzajúcich lekciách, každý commit je definovaný svojim hashom. Jedná sa o 40-miestne hexadecimálne číslo, napríklad 036ea83da2afba28163a1f959a227cda7bd14a88. Toto číslo je jedinečné pre každý commit. Na identifikáciu commitu však nemusíme toto číslo písať celé, stačí iba jeho niekoľko prvých znakov.

Meno vetvy

Každá vetva (branch) je zložená minimálne z jedného commitu. Pri vytvorení nového lokálneho repositára a prevedení prvého commitu vytvárame hlavnú vetvu s názvom master alebo main.

Názov hlavnej vetvy je obvykle nastavený pri inštalácii Gitu a je možné ho neskôr premenovať. V budúcich lekciách sa budeme venovať vetvám podrobnejšie.

Tag

Tag slúži na označenie dôležitých bodov v histórii projektu, ako sú nové verzie, dôležité opravy chýb alebo kľúčové míľniky. Môžeme ich pridávať k ľubovoľnému commitu. Zoznam všetkých tagov v repozitári je možné vypísať pomocou príkazu git tag, ktorý je nasledovaný výpisom tagov zoradených abecedne.

Teraz príkazom git tag zobrazíme všetky vytvorené tagy v repositári laravel zoradené abecedne:

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

Klávesmi alebo si môžeme zoznam tagov prezerať. Stlačením klávesu q zoznam zatvoríme.

Každý tag musí mať unikátny názov. Každý novovytvorený tag je automaticky pripojený k aktuálnemu commitu. Git umožňuje vytvoriť ľahký alebo anotovaný tag.

Ľahký tag

Ľahký tag sa veľmi podobá vetve, iba s tým rozdielom, že sa nepremiestňuje. Teda slúži iba ako ukazovateľ na commit. Na jeho vytvorenie stačí vytvoriť alebo sa prepnúť na commit, ktorý chceme označiť a zadať príkaz git tag <tag_name>.

Pre aktuálny commit vytvoríme nový tag s názvom easy_tag:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git tag easy_tag
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Spustením príkazu git tag, uvidíme náš novo vytvorený tag:

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

Anotovaný tag

Anotovaný tag je plnohodnotným objektom, porovnateľný s commitom. Obsahuje všetky identifikačné informácie ako commit (meno autora, čas, hash) a môžeme k nemu pridať správu. Na jeho vytvorenie použijeme príkaz git tag -a <tag_name> -m "<tag_message>".

K aktuálnemu commitu teraz vytvoríme anotovaný tag:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git tag -a annotated_tag -m "Creation of an annotated tag"
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Tag si opäť overíme príkazom git tag:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git tag
annotated_tag
easy_tag
v10.0.0
v10.0.1
v10.0.2
...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Skúmanie histórie

Prehliadanie histórie je v Gite jednou z najdôležitejších operácií, vďaka ktorej máme možnosť obnoviť stav repositára do určitého bodu v histórii. Git poskytuje tieto kľúčové príkazy:

  • git log pre výpis všetkých commitov, zobrazenie zmien v súboroch, filtrovanie histórie a zobrazenie histórie vetiev.
  • git branch pre zobrazenie zoznamu vetiev.
  • git show na zobrazenie detailov commitu.
  • git diff na porovnanie zmien.

Dnes si ukážeme príkaz git log. S ďalšími príkazmi sa zoznámime neskôr.

Príkaz git log

Príkazom git log môžeme vypísať všetky commity, zobraziť zmeny v súboroch, filtrovať históriu a zobraziť históriu vetiev.

Výpis všetkých commitov

Najprv si ukážeme zobrazenie zoznamu všetkých commitov, vrátane ich identifikátorov, autorov, dátumu a času vykonania, príslušných správ commitu a zmien v súboroch

Zatiaľ čo príkaz git status umožňuje skontrolovať pracovný adresár a pracovnú oblasť, git log pracuje iba s potvrdenou históriou.

Spustením príkazu git log v repositári laravel dostaneme tento výpis:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git log
commit 036ea83da2afba28163a1f959a227cda7bd14a88 (HEAD -> 10.x, tag: easy_tag, tag: annotated_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
...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Klávesmi alebo si môžeme históriu commitov prezerať, stlačením klávesu q históriu zatvoríme.

Poďme si vysvetliť, čo nám Git píše:

  • commit <hash> (tag): Unikátny identifikátor (hash) daného commitu a jeho tag.
  • Author: Autor commitu.
  • Date: Dátum a časová zóna, kedy bol commit vytvorený.
  • Update README.md: Tu môžeme vidieť názov a detailný popis commitu.

Uvedením atribútu --oneline zobrazíme každý commit v skrátenej forme, zobrazí sa začiatok hasha a jeho názov.

Spustíme príkaz git log --oneline a dostaneme tento výpis commitov v skrátenej formáte <hash> <description>:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git log --oneline
036ea83d (HEAD -> 10.x, tag: easy_tag, tag: annotated_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
...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Výstup príkazu git log môžeme obmedziť zahrnutím -<commit_count>. Napríklad príkaz git log -3 zobrazí iba tri najnovšie commity.

Zobrazenie zmien v súboroch

Na zobrazenie zmien vykonaných v súboroch sa použije atribút --stat. Spustíme príkaz git log --stat na zobrazenie commitov so zmenami vykonaných v súboroch:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git log --stat
commit 036ea83da2afba28163a1f959a227cda7bd14a88 (HEAD -> 10.x, tag: easy_tag, tag: annotated_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(-)
...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Použitím príkazu git log --stat -p získame podrobný prehľad o vykonaných zmenách:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git log --stat -p
commit 036ea83da2afba28163a1f959a227cda7bd14a88 (HEAD -> 10.x, tag: easy_tag, tag: annotated_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
...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Filtrovanie histórie

Príkaz git log nám tiež umožňuje filtrovať históriu podľa dátumu, autora, tagov a súborov. Ukážme si filtrovanie podľa dátumu a súboru.

Filtrovanie podľa dátumu

Na filtrovanie histórie podľa dátumu vytvorenia použijeme príkaz git log --oneline --after="<date>" --before="<date>":

Teraz si zobrazíme commity vytvorené v období medzi rokmi 2018 a 2020, zoradených od najnovších po najstaršie:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/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
...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$
Filtrovanie podľa súboru

Pre filtrovanie podľa konkrétneho súboru použijeme príkaz git log -- <file_name> a získame výpis všetkých commitov, ktoré ovplyvňujú súbor README.md:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/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
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Zobrazenie histórie vetiev

Príkazom git log --all --graph --oneline --decorate zobrazíme celkovú históriu, z ktorej vyčítame priebeh zmien na jednotlivých vetvách.

Zobrazíme si históriu vývoja repositára /laravel vo forme grafu, ktorý nám poskytuje prehľad o vývoji projektu:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/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
...

IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

V budúcej lekcii, Git - Skúmanie histórie - Dokončenie, dokončíme skúmanie histórie. Budeme sa zaoberať zoznamom všetkých vetiev, detailmi commitu, sledovaním a odstránením vykonaných zmien.


 

Predchádzajúci článok
Kvíz - Princípy, inštalácie a základy Gitu
Všetky články v sekcii
Git
Preskočiť článok
(neodporúčame)
Git - Skúmanie histórie - Dokončenie
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
1 hlasov
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity