IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 6 - Git - Zkoumání historie - Dokončení

V minulé lekci, Git - Zkoumání historie, jsme se zabývali identifikací commitů a začali jsme zkoumat historii. Vypsali jsme si všechny commity, zobrazili změny v souborech, vyfiltrovali historii a zobrazili historii větví.

V dnešním Git tutoriálu 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 po určitém commitu.

Všechny příkazy si opět 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.

Zkoumání historie

V lekci Zkoumání historie jsme začali zkoumat historii příkazem git log. Nyní si probereme zbývající příkazy git branch, git show a git diff.

Příkaz git branch

Po příkazu git branch sáhneme, chceme-li zobrazit seznam všech větví v našem lokálním repositáři. Například jak místní, tak i vzdálené větve zobrazíme příkazem git branch -a.

Nyní příkazem git branch -a zobrazíme výpis místních a vzdálených větví v repositáři /laravel:

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

Aktuální větev, na které se právě nacházíme, je označena hvězdičkou. Pokud chceme zobrazit další informace o větvích, jako je například poslední commit na každé větvi, použijeme příkaz git branch -v:

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

Jelikož jsme připojeni ke vzdálenému repositáři, podívejme se na seznam všech větví na vzdáleném serveru pomocí příkazu git branch -r:

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

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

Příkaz git show

Jedním z klíčových nástrojů je příkaz git show, jehož spuštěním získáme detaily commitu nebo objektu v repositáři Git. Spuštěním příkazu git show získáme detaily posledního vytvořeného commitu:

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

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

Detaily obsahují:

  • commit 036ea83da2afba28163a1f959a227cda7bd14a88: Jedná se o unikátní hash commit.
  • HEAD -> 10.x: Označuje aktuální pozici v pracovním adresáři a název větve.
  • tag: lehky_tag, tag: anotovany_tag: Tagy spojené s commitem.
  • origin/HEAD, origin/10.x: Označuje, že vzdálený repositář má svou vlastní kopii repositáře, která obsahuje aktuální commit a větev 10.x.
  • Author: Autor commitu.
  • Date: Datum a časová zóna, kdy byl commit vytvořen.
  • Uses actions/checkout@v4: Informaci o obsahu commitu.
  • diff --git ...: Ukazuje změny provedené v určitých souborech v rámci tohoto commitu.

Pro zobrazení jakéhokoliv commitu použijeme buď jeho hash (git show <hash>), nebo jeho tag (git show <nazev tagu>).

Příkaz git diff

Pomocí příkazu git diff můžeme efektivně sledovat změny v pracovním adresáři a porovnat je s aktuálním stavem repositáře. Příkaz nám umožňuje zobrazit rozdíly mezi soubory od posledního commitu. Příkaz je užitečný pro řešení konfliktů, ladění změn a udržování přehledu o úpravách v projektu.

Syntaxe příkazu je:

$ git diff <argumenty> <název_souboru>

Některé běžné argumenty používané s git diff zahrnují:

  • --staged: Ukáže rozdíly mezi indexem a posledním commitovaným stavem.
  • --color: Zobrazí výsledek s barvami pro zvýraznění změn.
  • --name-only: Zobrazí pouze názvy souborů, ve kterých byly změny provedeny.

Ukážeme si příkaz git diff na příkladu, ve kterém postupně spustíme tyto příkazy:

$ echo 'Nový text do souboru' > testovaci_soubor
$ git add .
$ git commit -m "Vytvoření nového testovacího souboru testovaci_soubor"
$ echo 'Nově přidaný text' >> testovaci_soubor

Z příkazů dostaneme tyto výstupy:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ echo 'Nový text do souboru' > testovaci_soubor
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git add .
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git commit -m "Vytvoření nového testovacího souboru testovaci_soubor"
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ echo 'Nově přidaný text' >> testovaci_soubor
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$

Nyní zobrazme změny provedené v souboru testovaci_soubor pomocí příkazu git diff <soubor>. Získáme výpis rozdílu mezi starou a novou verzí souboru:

MINGW64:/c/mujgit/laravel
ItNetwork@DESKTOP-ADEVTG4 MINGW64 /c/mujgit/laravel (10.x)
$ git diff testovaci_soubor
diff --git a/testovaci_soubor b/testovaci_soubor
index 18316c9a..6bfcf463 100644
--- a/testovaci_soubor
+++ b/testovaci_soubor
@@ -1 +1,2 @@
 Nový text do souboru
+Nově přidaný text

Zde je rozbor jednotlivých částí:

  • diff --git a/testovaci_soubor b/testovaci_soubor: Označuje názvy porovnávaných souborů.
  • index 18316c9a..6bfcf463 100644: Označuje starou a novou hodnotu hash.
  • --- a/testovaci_soubor: Označuje starou verzi souboru.
  • +++ b/testovaci_soubor: Označuje novou verzi souboru.
  • @@ -1 +1,2 @@: Kontext změn ukazující, že změna byla provedena na řádku 1 a byl vložen 1 nový řádek.
  • Nový text do souboru: Původní obsah souboru.
  • +Nově přidaný text: Přidaný text, znak + na začátku řádku signalizuje, že byla provedena nová změna.

Pro zobrazení změn mezi dvěma commity bychom použili příkaz git diff <commit_1> <commit_2>. Rozdíly mezi větvemi bychom vypsali příkazem git diff <větev_1>..<větev_2>.

Příkaz git reset

Příkaz git reset umožňuje vrátit stav repositáře k určitému commitu. Tímto příkazem odstraníme změny provedené po určitém commitu a vrátíme se k předchozímu stavu.

Zasahování do historie repositáře může být nebezpečné. Obvykle je v pořádku provádět tyto druhy změn ve vlastním místním úložišti. Měli bychom se však vyhnout změnám, které přepisují historii do vzdálených úložišť.

Příkaz git reset má tyto argumenty, které ovlivňují jeho chování vůči repositáři:

  • --soft,
  • --mixed (výchozí chování),
  • --hard.

--soft

Resetuje hlavičku (HEAD), ale pracovní strom a index zůstanou nezměněné. Změny, které byly provedeny po daném commitu, zůstanou ve stavu k dispozici pro nový commit.

--mixed (výchozí chování)

Resetuje hlavičku (HEAD) a pracovní strom, ale index zůstává nezměněný. Změny po daném commitu nebudou součástí následujícího commitu, ale zůstanou ve stavu k dispozici pro další úpravy.

--hard

Resetuje hlavičku (HEAD), pracovní strom a index. Změny po daném commitu budou odstraněny a vrátí se k přesnému stavu repositáře v daném commitu.

Argument --hard může způsobit trvalou ztrátu změn provedených po daném commitu.

Následující obrázek popisuje, jak přesně příkaz git reset funguje:

Vizualizace git reset - Git

Nyní spustíme příkaz ls nebo dir a zobrazíme stav souborů našeho repositáře:

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

Nyní si ukážeme, jak použít příkaz reset --hard k obnovení našeho repositáře do stavu před tím, než jsme vytvořili soubor testovaci_soubor.

  1. Spustíme příkaz git log a získáme hash commitu, na který chceme resetovat náš repositář.
  2. Následně použijeme tento hash ve spojení s příkazem git reset --hard 036ea83da2afba28163a1f959a227cda7bd14a88 k obnovení repositáře do příslušného stavu.
  3. Spuštěním příkazu git log uvidíme, že poslední commit byl smazán a společně s ním všechny změny.

Po provedení reset --hard bude z repositáře vymazán testovaci_soubor. Ověříme si to příkazem ls nebo dir:

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

V příští lekci, Git - Správa větví, se podíváme na větvení. Vysvětlíme si, proč se jimi zabýváme a co nám do vývoje přinášejí. Ukážeme si, jak se s větvemi pracuje.


 

Předchozí článek
Git - Zkoumání historie
Všechny články v sekci
Git
Přeskočit článek
(nedoporučujeme)
Git - Správa větví
Článek pro vás napsal Filip Studený
Avatar
Uživatelské hodnocení:
32 hlasů
.
Aktivity