Slovník pojmů
Commit v Gitu
Commit uloží vybranou změnu do lokální historie. Neznamená automaticky push, pull request ani nasazení.
Stručná definice
Malý, pojmenovaný krok v historii projektu.
Git ukládá commit jako objekt s vybraným stavem souborů a vazbou na historii. Commit vznikne z obsahu ve staging area, ne ze všech rozpracovaných úprav v pracovní kopii. Proto můžeš připravit dvě nezávislé změny a commitnout je odděleně.
Commit se nejdřív nachází jen v lokálním repozitáři. Uložení souboru v editoru změní pracovní kopii. Push až odešle větev na remote. Pull request je návrh na integraci změny v hostovací službě, nikoli vestavěný objekt Gitu.
K čemu slouží
Srozumitelná historie, review a návrat ke změně
Dobrý commit má jeden jasný účel. Díky tomu lze snadněji pochopit, otestovat, reviewovat nebo případně vrátit právě daný krok.
- uložení samostatné opravy chyby nebo malé části funkce do lokální historie
- rozumné rozdělení práce pro code review a dohledání změny v budoucnu
- spuštění testů a CI nad konkrétní změnou
- porovnání stavu před a po jedné změně nebo příprava cíleného revertního commitu
- popsání důvodu změny zprávou commitu, pokud samotný diff nestačí
Praktický příklad
Oprava výpočtu dopravy bez vedlejších změn
Při opravě výpočtu dopravy necháš formátování jiných souborů a rozpracovanou administraci mimo commit. Do staging area vybereš jen změnu kalkulátoru a test, který popisuje opravený scénář.
Po commitu je oprava zaznamenaná v lokální historii. Až push ji zpřístupní na remote a může vzniknout pull request. Pokud commit už někdo stáhl, nepřepisuj jeho historii amendem nebo rebase bez dohody; změněný obsah dostane jiný hash.
Shell
git status
git add src/Shipping/ShippingPriceCalculator.php tests/Shipping/ShippingPriceCalculatorTest.php
git commit -m "Fix free-shipping threshold"
git push -u origin feature/shipping-threshold
Jak změna putuje
Commit je jen jedna část cesty ke spojení změny
Sekvence: pracovní soubory → staging area → lokální commit → větev na remote → pull request → review a CI → merge do main.
- Uložit soubor Editor zapíše úpravu do working tree. Git ji zatím nemá ve staging area ani historii.
- Vybrat obsah git add vloží vybrané řádky nebo soubory do staging area pro další commit.
- Vytvořit commit git commit uloží lokální záznam s vybraným obsahem, zprávou a rodičovskou historií.
- Sdílet větev git push odešle referenci větve a chybějící objekty do vzdáleného repozitáře. Sám o sobě neotevře pull request ani nenasadí aplikaci.
- Integrovat změnu V pull requestu tým provede review a kontroly. Merge pak spojí schválenou větev do cílové větve podle pravidel projektu.
Co je co
Commit, uložení, push, větev a pull request nejsou totéž
Toto rozlišení pomáhá pochopit, kde se změna právě nachází a kdo ji může vidět.
Uložení v editoru
Zapíše aktuální obsah souboru do pracovní kopie. Nevybírá obsah pro Git a nevytváří historii.
Commit
Uloží vybraný snapshot lokálně. Commit má hash, který vychází mimo jiné z obsahu a rodičů, proto není jen trvalé pořadové číslo.
Push
Odešle lokální větev do remote repozitáře. Může spustit automatizaci služby, ale Git push sám neznamená merge ani produkční deployment.
Větev a pull request
Větev je pohyblivá reference na commit. Pull request je proces nad remote repozitářem, který žádá o spojení větve, review a často i CI kontroly.
Amend a rebase
git commit --amend vytvoří náhradu posledního commitu. Rebase commity znovu přehrává na jiný základ. V obou případech se přepsaným commitům změní hash, takže sdílenou historii měň jen po domluvě.
Výhody a rizika
Čitelná historie má menší cenu než složité opravy později
Přínosy
- jednoznačný účel změny pro autora i review
- snadnější dohledání problému a cílené vrácení změny
- možnost ověřit malý krok testy a automatickými kontrolami
- oddělení rozpracované práce od hotové části změny
Na co pozor
- velký commit míchající funkci, opravu a formátování
- amend nebo rebase již sdílené historie bez dohody
- představa, že lokální commit je záloha mimo vlastní počítač
- secret vložený do commitu, i když se později smaže ze souboru
Praktické použití
Commitnout tehdy, když změna drží pohromadě.
Commit nemusí obsahovat celou velkou funkci. Má obsahovat krok, který má jasný význam a lze ho vysvětlit. Při delší práci je lepší několik malých commitů než jeden obrovský, pokud každý z nich zachovává rozumný a ověřitelný stav.
Necommituj přístupové tokeny, hesla ani soukromé klíče. Pokud se secret dostane do commitu, co nejdřív ho odvolej nebo rotuj. Úprava historie může omezit další šíření, ale sama nevrátí údaj z cizích klonů, cache nebo logů.
Kontrolní seznam
Co zkontrolovat před commitem
Cílem není splnit formální počet commitů, ale zanechat historii, se kterou se dá bezpečně pracovat.
- git diff a git diff --staged ukazují přesně zamýšlený obsah
- zpráva stručně popisuje účel změny, ne jen název souboru
- relevantní testy a statické kontroly běží nad změnou
- v commitu nejsou secrets, lokální konfigurace ani omylem přidané soubory
- přepis historie se týká jen vlastní nepublikované práce nebo je domluvený s týmem
Časté otázky
Commit bez častých záměn
Je commit totéž co uložení souboru?
Ne. Uložení změní pracovní kopii. Commit uloží do Git historie pouze obsah, který jsi předem vybral do staging area.
Je commit vidět ostatním hned?
Ne nutně. Commit je nejprve lokální. Ostatní ho běžně uvidí až po pushi do sdíleného remote repozitáře nebo po jiném předání historie.
Proč se po amendu nebo rebase mění hash?
Hash commitu závisí na jeho obsahu a místě v historii včetně rodičů. Amend vytvoří nový commit a rebase přehrává commity na jiný základ, takže původní identifikátory neplatí.
Stačí secret z commitu smazat v dalším commitu?
Ne. Starší commit jej stále může obsahovat a mohl už být stažený. Nejdřív přístupový údaj odvolej nebo rotuj a podle situace řeš i historii a přístup k repozitáři.
Jak pracuji se změnami v praxi
Historie kódu má být čitelná i ve chvíli, kdy se něco pokazí.
V hlavních znalostech popisuji práci s PHP aplikacemi, testováním a udržitelnou architekturou, které na kvalitní práci se změnami navazují.