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

6. diel - Git - Skúmanie histórie - Dokončenie

V minulej lekcii, Git - Skúmanie histórie, sme sa zaoberali identifikáciou commitov a začali sme skúmať históriu. Vypísali sme si všetky commity, zobrazili zmeny v súboroch, vyfiltrovali históriu a zobrazili históriu vetiev.

V dnešnom Git tutoriále 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 po určitom commite.

Všetky príkazy si opäť 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.

Skúmanie histórie

V lekcii Skúmanie histórie sme začali skúmať históriu príkazom git log. Teraz si preberieme zostávajúce príkazy git branch, git show a git diff.

Príkaz git branch

Po príkaze git branch siahneme, ak chceme zobraziť zoznam všetkých vetiev v našom lokálnom repositári. Napríklad ako miestne, tak aj vzdialené vetvy zobrazíme príkazom git branch -a.

Teraz príkazom git branch -a zobrazíme výpis miestnych a vzdialených vetiev v repositári /laravel:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git branch -a
* 10.x
  remotes/origin/10.x
  remotes/origin/3.0
  remotes/origin/5.0
  ...
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Aktuálna vetva, na ktorej sa práve nachádzame, je označená hviezdičkou. Pokiaľ chceme zobraziť ďalšie informácie o vetvách, ako je napríklad posledný commit na každej vetve, použijeme príkaz git branch -v:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git branch -v
* 10.x 036ea83d Uses `actions/checkout@v4`

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

Keďže sme pripojení k vzdialenému repositárovi, pozrime sa na zoznam všetkých vetiev na vzdialenom serveri pomocou príkazu git branch -r:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git branch -r
  origin/10.x
  origin/3.0
  origin/5.0
  ...

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

Príkaz git show

Jedným z kľúčových nástrojov je príkaz git show, ktorého spustením získame detaily commitu alebo objektu v repositári Git. Spustením príkazu git show získame detaily posledného vytvoreného commitu:

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

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)
$

Detaily obsahujú:

  • commit 036ea83da2afba28163a1f959a227cda7bd14a88: Jedná sa o unikátny hash commit.
  • HEAD -> 10.x: Označuje aktuálnu pozíciu v pracovnom adresári a názov vetvy.
  • tag: easy_tag, tag: annotated_tag: Tagy spojené s commitom.
  • origin/HEAD, origin/10.x: Označuje, že vzdialený repositár má svoju vlastnú kópiu repositára, ktorá obsahuje aktuálny commit a vetvu 10.x.
  • Author: Autor commitu.
  • Date: Dátum a časová zóna, kedy bol commit vytvorený.
  • Uses actions/checkout@v4: Informáciu o obsahu commitu.
  • diff --git ...: Ukazuje zmeny vykonané v určitých súboroch v rámci tohto commitu.

    Pre zobrazenie akéhokoľvek commitu použijeme buď jeho hash (git show <hash>), alebo jeho tag (git show <tag_name>).

Príkaz git diff

Pomocou príkazu git diff môžeme efektívne sledovať zmeny v pracovnom adresári a porovnať ich s aktuálnym stavom repositára. Príkaz nám umožňuje zobraziť rozdiely medzi súbormi od posledného commitu. Príkaz je užitočný pre riešenie konfliktov, ladenie zmien a udržiavanie prehľadu o úpravách v projekte.

Syntax príkazu je:

$ git diff <arguments> <file_name>

Niektoré bežné argumenty používané s git diff zahŕňajú:

  • --staged: Ukáže rozdiely medzi indexom a posledným commitovaným stavom.
  • --color: Zobrazí výsledok s farbami pre zvýraznenie zmien.
  • --name-only: Zobrazí iba názvy súborov, v ktorých boli zmeny vykonané.

Ukážeme si príkaz git diff na príklade, v ktorom postupne spustíme tieto príkazy:

$ echo 'New text to file' > test_file
$ git add .
$ git commit -m "Creating a new test file test_file"
$ echo 'Newly added text' >> test_file

Z príkazov dostaneme tieto výstupy:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ echo 'New text to file' > test_file
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git add .
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git commit -m "Creating a new test file test_file"
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ echo 'Newly added text' >> test_file
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Teraz zobrazme zmeny vykonané v súbore test_file pomocou príkazu git diff <file_name>. Získame výpis rozdielu medzi starou a novou verziou súboru:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ git diff test_file
diff --git a/test_file b/test_file
index 18316c9a..6bfcf463 100644
--- a/test_file
+++ b/test_file
@@ -1 +1,2 @@
 New text to file
+Newly added text

Tu je rozbor jednotlivých častí:

  • diff --git a/test_file b/test_file: Označuje názvy porovnávaných súborov.
  • index 18316c9a..6bfcf463 100644: Označuje starú a novú hodnotu hash.
  • --- a/test_file: Označuje starú verziu súboru.
  • +++ b/test_file: Označuje novú verziu súboru.
  • @@ -1 +1,2 @@: Kontext zmien ukazujúci, že zmena bola vykonaná na riadku 1 a bol vložený 1 nový riadok.
  • New text to file: Pôvodný obsah súboru.
  • +Newly added text: Pridaný text, znak + na začiatku riadku signalizuje, že bola vykonaná nová zmena.

Na zobrazenie zmien medzi dvoma commitmi by sme použili príkaz git diff <commit_1> <commit_2>. Rozdiely medzi vetvami by sme vypísali príkazom git diff <branch_1>..<branch_2>.

Príkaz git reset

Príkaz git reset umožňuje vrátiť stav repositára k určitému commitu. Týmto príkazom odstránime zmeny vykonané po určitom commite a vrátime sa k predchádzajúcemu stavu.

Zasahovanie do histórie repositára môže byť nebezpečné. Obvykle je v poriadku vykonávať tieto druhy zmien vo vlastnom miestnom úložisku. Mali by sme sa však vyhnúť zmenám, ktoré prepisujú históriu do vzdialených úložísk.

Príkaz git reset má tieto argumenty, ktoré ovplyvňujú jeho správanie voči repositárovi:

  • --soft,
  • --mixed (predvolené správanie),
  • --hard.

--soft

Resetuje hlavičku (HEAD), ale pracovný strom a index zostanú nezmenené. Zmeny, ktoré boli vykonané po danom commite, zostanú v stave k dispozícii pre nový commit.

--mixed (predvolené správanie)

Resetuje hlavičku (HEAD) a pracovný strom, ale index zostáva nezmenený. Zmeny po danom commite nebudú súčasťou nasledujúceho commitu, ale zostanú v stave k dispozícii pre ďalšie úpravy.

--hard

Resetuje hlavičku (HEAD), pracovný strom a index. Zmeny po danom commite budú odstránené a vrátia sa k presnému stavu repositára v danom commite.

Argument --hard môže spôsobiť trvalú stratu zmien vykonaných po danom commite.

Nasledujúci obrázok popisuje, ako presne príkaz git reset funguje:

Vizualizácia git reset - Git

Teraz spustíme príkaz ls alebo dir a zobrazíme stav súborov nášho repositára:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ ls
CHANGELOG.md  bootstrap/     package.json  routes/ README.md     composer.json  phpunit.xml   storage/
app/          config/        public/       tests/  artisan*      database/      resources/    vite.config.js
test_file
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

Teraz si ukážeme, ako použiť príkaz reset --hard na obnovenie nášho repositára do stavu pred tým, než sme vytvorili súbor test_file.

  1. Spustíme príkaz git log a získame hash commitu, na ktorý chceme resetovať náš repositár.
  2. Následne použijeme tento hash v spojení s príkazom git reset --hard 036ea83da2afba28163a1f959a227cda7bd14a88 na obnovenie repositára do príslušného stavu.
  3. Spustením príkazu git log uvidíme, že posledný commit bol zmazaný a spoločne s ním všetky zmeny.

Po vykonaní reset --hard bude z repositára vymazaný test_file. Overíme si to príkazom ls alebo dir:

MINGW64:/c/mygit/laravel
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$ ls
CHANGELOG.md  bootstrap/     package.json  routes/ README.md     composer.json  phpunit.xml   storage/
app/          config/        public/       tests/  artisan*      database/      resources/    vite.config.js
IctDemy@DESKTOP-ADEVTG4 MINGW64 /c/mygit/laravel (10.x)
$

V budúcej lekcii, Git - Správa vetiev, sa pozrieme na vetvenie. Vysvetlíme si, prečo sa nimi zaoberáme a čo nám do vývoja prinášajú. Ukážeme si, ako sa s vetvami pracuje.


 

Predchádzajúci článok
Git - Skúmanie histórie
Všetky články v sekcii
Git
Preskočiť článok
(neodporúčame)
Git - Správa vetiev
Článok pre vás napísal Filip Studený
Avatar
Užívateľské hodnotenie:
1 hlasov
.
Aktivity