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 repozitáři laravel
z lekce Git - Základy -
Dokončení. Otevřeme terminál MinTTY
a pomocí příkazu
cd laravel
se do repozitář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 repozitář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 repozitář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 repozitář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
repozitář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
: Jde o tagy spojené s commitem.origin/HEAD, origin/10.x
: Označuje, že vzdálený repozitář má svou vlastní kopii repozitáře, která obsahuje aktuální commit a větev 10.x.Author
: Jedná se o autora commitu.Date
: Uvádí datum a časovou zónu, kdy byl commit vytvořen.Uses actions/checkout@v4
: Jde o informaci o obsahu commitu.diff --git ...
: Ukazuje změny provedené v určitých souborech v rámci tohoto commitu.
Pro zobrazení jakéhokoli 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
repozitář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.
Ukažme 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 řádku1
a byl vložen1
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 repozitář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 repozitář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 repozitář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 repozitář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:

Nyní spustíme příkaz ls
nebo dir
a zobrazíme
stav souborů našeho repozitář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 repozitáře do stavu před tím, než jsme vytvořili soubor
testovaci_soubor
.
- Spustíme příkaz
git log
a získáme hash commitu, na který chceme resetovat náš repozitář. - Následně použijeme tento hash ve spojení s příkazem
git reset --hard 036ea83da2afba28163a1f959a227cda7bd14a88
k obnovení repozitáře do příslušného stavu. - 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 repozitář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 větvemi zabýváme a co nám do vývoje přinášejí. Ukážeme si, jak se s větvemi pracuje.