Git — je distribuovaný systém pro správu verzí s otevřeným zdrojovým kódem, vytvořený Linusem Torvaldsem v roce 2005 pro vývoj jádra Linux. Na rozdíl od centralizovaných systémů, jako je SVN, Git ukládá úplnou kopii repozitáře na každém zařízení vývojáře, což umožňuje pracovat bez trvalého připojení k serveru. Podle údajů Git SCM, 2024 se Git používá ve více než 90 % všech komerčních projektů vývoje softwaru.
Hlavní body
Git — je distribuovaný systém pro správu verzí (VCS), který sleduje změny v souborech a umožňuje několika vývojářům pracovat současně na stejném projektu. Na rozdíl od centralizovaných systémů má v Git každý vývojář úplnou kopii repozitáře včetně celé historie změn, což činí systém odolným vůči ztrátě dat a nevyžaduje trvalé připojení k centrálnímu serveru.
Historie Gitu začala v roce 2005, kdy Linus Torvalds vytvořil nový VCS poté, co společnost BitKeeper zrušila bezplatnou licenci na svůj systém pro vývojáře jádra Linux. Cíle byly: rychlost, jednoduchost architektury, podpora nelineárního vývoje prostřednictvím větvení a plná distribuovanost. Během 3 měsíců Torvalds napsal jádro Gitu a po roce projekt přešel na samosprávu pod vedením Junia Hamana.
Podle průzkumu Stack Overflow (2024) používá Git 93,9 % profesionálních vývojářů, což z něj činí dominantní systém správy verzí v průmyslu. Nejbližší konkurent — Subversion (SVN) — se používá pouze v 5,2 % projektů, převážně ve velkých podnikových prostředích s centralizovanými procesy.
Repozitář Git — je adresář, ve kterém Git sleduje změny všech souborů. Uvnitř adresáře se nachází skrytá složka .git, kde jsou uloženy všechny objekty systému: commity, stromy, bloby a reference. Když vývojář vytvoří commit, Git nekopíruje soubory celé — vytvoří snímek stavu (snapshot) a uloží na něj referenci.
Každý commit obsahuje: unikátní SHA-1 hash (40 znaků), referenci na předchozí commit (parent), autora, datum, zprávu commitu a referenci na strom (tree), který popisuje stav souborů v okamžiku commitu. Řetězec commitů tvoří orientovaný acyklický graf, kde každý commit ukazuje na jednoho nebo více rodičů.
# Inicializace repozitáře
git init my-project
cd my-project
# Vytvoření commitu
echo "Hello, Git" > README.md
git add README.md
git commit -m "Initial commit"
# Zobrazení historie
git log --oneline --graph --all
Git používá tři hlavní oblasti: working directory (soubory na disku), staging area (index, kam se dostávají připravené soubory) a repository (historie commitů). Příkaz git add přesouvá změny z pracovního adresáře do staging a git commit zaznamenává obsah stagingu v repozitáři. Toto oddělení umožňuje vývojáři sestavit smysluplný commit ze sady změn, aniž by musel zaznamenávat každou opravu zvlášť.
Základní příkazy Gitu pokrývají 90 % každodenních operací vývojáře. Příkaz git clone vytvoří lokální kopii vzdáleného repozitáře, git pull stáhne změny ze serveru a sloučí je s aktuální větví, a git push odešle lokální commity na server. Tyto tři příkazy tvoří základní cyklus práce s Gitem.
Pro zobrazení stavu se používá git status — ukazuje, které soubory byly změněny, které byly přidány do staging a které nejsou sledovány. git diff zobrazuje konkrétní změny v souborech před přidáním do staging. Níže je uvedena tabulka s nejčastěji používanými příkazy:
| Příkaz | Akce | Příklad |
|---|---|---|
| git clone | Kopíruje vzdálený repozitář | git clone https://example.com/repo |
| git add | Přidává soubory do staging | git add src/main.kt |
| git commit | Zaznamenává změny v historii | git commit -m "Fix login bug" |
| git push | Odesílá commity na server | git push origin main |
| git pull | Stahuje změny ze serveru | git pull origin feature |
Pro vrácení změn nabízí Git několik možností. git reset přesouvá ukazatel větve na zadaný commit a může resetovat staging nebo pracovní adresář. git revert vytváří nový commit, který vrací změny zadaného commitu — to je bezpečný způsob vrácení pro sdílené větve, protože historie se nepřepisuje.
Větve v Git — jsou lehké přemístitelné ukazatele na konkrétní commit. Vytvoření nové větve nekopíruje soubory, pouze vytváří nový ukazatel, což činí větvení prakticky okamžitým. Větev main (dříve master) — hlavní větev projektu, která obsahuje stabilní, k vydání připravený kód.
Standardní praxí je použití Git Flow nebo GitHub Flow. V Git Flow se používají větve: main (release kód), develop (integrační větev), feature/* (nové funkce), release/* (příprava vydání) a hotfix/* (naléhavé opravy). GitHub Flow je jednodušší: pouze main a feature větve, všechny změny jsou doručovány prostřednictvím Pull Request.
# Vytvoření a přepnutí větve
git branch feature-auth
git checkout feature-auth
# nebo jedním příkazem:
git checkout -b feature-auth
# Seznam větví
git branch --list
git branch -a # všechny větve včetně vzdálených
# Smazání větve
git branch -d feature-auth
Důležitou vlastností větvení v Git — možnost cherry-pick: přenesení jednotlivého commitu z jedné větve do druhé pomocí příkazu git cherry-pick <hash>. To je užitečné, když potřebujete přenést opravu chyby z feature větve do release bez sloučení celé větve. Git také podporuje rebase a interaktivní rebase (git rebase -i) pro lepení, přeuspořádání a úpravy commitů.
Merge (sloučení) vytváří speciální merge-commit, který má dva rodiče. Tento commit zaznamenává fakt spojení dvou větví a zachovává úplnou historii — je vidět, kde a kdy došlo ke sloučení. Merge zachovává historii v podobě, v jaké byla vytvořena, což zjednodušuje audit, ale činí graf commitů složitějším.
Rebase (přesazení) místo vytvoření merge-commitu přesouvá commity aktuální větve na vrchol cílové větve. Historie se stává lineární — vzniká dojem, že vývoj probíhal sekvenčně. Rebase však přepisuje historii, mění SHA-1 hashe commitů, což ho činí nebezpečným pro sdílené větve, ke kterým mají přístup jiní vývojáři.
Doporučení pro výběr: použijte merge pro veřejné větve, kde historii vidí ostatní vývojáři (feature → develop), a rebase pro lokální práci, když potřebujete aplikovat čerstvé změny z main do své feature větve před vytvořením Pull Request. Pravidlo je jednoduché: pokud byl commit již odeslán na server — nerebaseujte ho.
Konflikt sloučení nastává, když Git nemůže automaticky spojit změny v jednom souboru. Git označuje konfliktní části v souboru speciálními značkami: <<<<<<< (naše změny), ======= (oddělovač), >>>>>>> (jejich změny). Vývojář ručně upraví soubor, vybere požadovanou variantu nebo zkombinuje obě, a dokončí sloučení commitem.
Vzdálený repozitář (remote) — kopie Git repozitáře umístěná na serveru. GitHub, GitLab a Bitbucket jsou nejoblíbenější platformy pro hostování vzdálených repozitářů. Poskytují webové rozhraní pro prohlížení kódu, správu přístupu, kontrolu kódu a integraci s CI/CD systémy.
V Git lze nakonfigurovat několik vzdálených repozitářů pro jeden projekt. Ve výchozím nastavení se hlavní remote nazývá origin. Příkaz git remote add přidává nový remote, git fetch stahuje změny bez sloučení, a git pull je zkratka pro git fetch + git merge. Pro práci s kódem prostřednictvím Pull Request vývojář vytvoří fork repozitáře, naklonuje jej, pracuje ve feature větvi a odešle žádost o sloučení do původního repozitáře.
# Přidání vzdáleného repozitáře
git remote add origin https://github.com/user/repo.git
# Zobrazení vzdálených repozitářů
git remote -v
# Odeslání větve na server
git push -u origin feature-auth
# Stažení změn ze vzdálené větve
git pull origin main
Vzdálené repozitáře podporují tagování pro označování release verzí. Tagy mohou být lehké (pouze ukazatel na commit) a anotované (obsahují metadata: autor, datum, zpráva). Anotované tagy se doporučují pro release verze, protože předávají úplné informace o verzi a mohou být podepsány GPG klíčem pro ověření autorství.
Git Worktree umožňuje současnou práci s několika větvemi v různých adresářích bez přepínání mezi nimi. Příkaz git worktree add ../feature-auth feature-auth vytváří nový pracovní adresář feature-auth, kde lze psát kód bez přepínání větve v hlavním adresáři. Worktree je užitečný pro rychlé opravy v release větvi, když je hlavní adresář zaneprázdněn dlouhodobým vývojem.
Git Submodules — mechanismus pro vložení jednoho Git repozitáře do druhého. Submodul ukládá referenci na pevný commit externího repozitáře, což zaručuje reprodukovatelnost sestavení. Příkaz git submodule add https://github.com/example/lib.git přidává externí knihovnu jako podmodul. Při klonování projektu s podmoduly je pro načtení všech závislostí třeba provést git submodule update --init --recursive.
Často kladené otázky
Git — distribuovaný VCS s lokální historií a možností práce offline. SVN — centralizovaný systém vyžadující trvalé připojení k serveru pro všechny operace kromě prohlížení souborů.
Použijte git revert HEAD pro bezpečné vrácení (vytvoří se nový commit). Pokud commit ještě nebyl odeslán na server, můžete použít git reset --soft HEAD~1.
.gitignore — soubor, ve kterém jsou uvedeny vzory souborů a adresářů, které má Git ignorovat. Používá se k vyloučení dočasných souborů, sestavení a konfigurací IDE z repozitáře.
git fetch stahuje změny ze serveru, ale neslučuje je s aktuální větví. git pull provede fetch a okamžitě provede merge. Pro kontrolu použijte fetch + prohlédnutí diff, poté ruční merge.
Použijte git commit --amend — tento příkaz otevře editor pro změnu zprávy commitu. Pokud je commit již na serveru, bude vyžadován git push --force, což je nebezpečné pro sdílené větve.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také