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 riadku1
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:
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
.
- Spustíme príkaz
git log
a získame hash commitu, na ktorý chceme resetovať náš repositár. - 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. - 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.