6. diel - Git - Skúmanie histórie - Dokončenie
V predchádzajúcej 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 ** tutoriáli Git** 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 repozitári Laravel z lekcie Git – Základy –
Dokončenie. Otvoríme terminál MinTTY a pomocou príkazu
cd laravel sa do repozitá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 repozitári.
Napríklad miestne 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 repozitá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 repozitáru, 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 repozitá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ý repozitár má svoju vlastnú kópiu repozitá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
repozitára. Príkaz nám umožňuje zobraziť rozdiely medzi súbormi od
posledného commitu. Príkaz je užitočný pri riešení konfliktov, ladení
zmien a udržiavaní 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 na zvýraznenie zmien.--name-only: Zobrazí iba názvy súborov, v ktorých boli vykonané zmeny.
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 riadku1a vložený bol1nový 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 repozitá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 repozitára môže byť nebezpečné. Zvyčajne 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 repozitáru:
--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 na ď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 repozitá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:

Teraz spustíme príkaz ls alebo dir a zobrazíme
stav súborov nášho repozitá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 repozitára do stavu pred tým, ako sme vytvorili súbor
test_file.
- Spustíme príkaz
git loga získame hash commitu, na ktorý chceme resetovať náš repozitár. - Následne použijeme tento hash v spojení s príkazom
git reset --hard 036ea83da2afba28163a1f959a227cda7bd14a88na obnovenie repozitára do príslušného stavu. - Spustením príkazu
git loguvidíme, že posledný commit bol zmazaný a spoločne s ním všetky zmeny.
Po vykonaní reset --hard bude z repozitá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 ďalšej lekcii, Git - Správa vetiev, sa pozrieme na vetvy. 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.
