komitTakécommitnout, revize, changesetZákladní
Definice
Commit je zapsání skupiny změn tak, aby se staly trvalou a nedělitelnou součástí systému. Ve verzovacím systému jako Git jde o snímek obsahu repozitáře s odkazem na předchozí commit, autorem a popisem. V databázi commit uzavírá transakci a potvrzuje všechny její zápisy najednou.
Nezaměňujte: Commit označuje v systémech správy verzí zápis snímku změn do historie projektu, zatímco v databázích jde o potvrzení a trvalé uložení transakce.
Příklady z praxe
Rozdělení rozpracované práce do dvou commitů
Vývojář opravoval chybu ve validaci formuláře a přitom si přejmenoval pomocnou funkci v jiném souboru. Místo jednoho smíšeného commitu použije staging area a zapíše opravu i přejmenování zvlášť. Když se oprava později ukáže jako chybná, dá se vrátit samostatně, aniž by se zrušilo přejmenování.
git add src/validators/form.ts git commit -m "fix: povolit telefonni cislo s predvolbou +420" git add src/utils/helpers.ts git commit -m "refactor: prejmenovat fmt na formatPhone" git log --oneline -2Dávkový import s commitem po tisíci řádcích
Skript nahrává milion řádků do PostgreSQL. Commit po každém řádku by znamenal milion synchronních zápisů do WAL, jedna transakce přes celý import by zase dlouho držela zdroje a při chybě zahodila veškerou práci. Kompromisem je commit po dávkách, kde se při selhání ztratí jen poslední rozpracovaná dávka.
BEGIN; INSERT INTO orders (id, customer_id, total) VALUES (...); -- dalších 999 řádků dávky COMMIT;
Časté omyly
- MýtusCommit v Gitu ukládá jen rozdíl proti předchozí verzi.
- Ve skutečnostiCommit odkazuje na kompletní strom souborů, tedy na snímek celého obsahu. Rozdíl se dopočítává až při zobrazení a úspora místa vzniká jinde: shodné soubory sdílejí tentýž objekt a Git obsah dodatečně balí do packfiles.
- MýtusCommit znamená, že je změna nahraná na server.
- Ve skutečnostiCommit zapisuje do lokálního repozitáře. Dokud neproběhne push, žádný jiný vývojář ani CI o commitu neví a při ztrátě notebooku je práce pryč.
- MýtusKdyž databáze vrátí úspěch po INSERTu, data jsou uložená natrvalo.
- Ve skutečnostiV transakci se data stanou trvalými až po commitu. Řada klientů sice běží v režimu autocommit, kde se commit provede po každém příkazu automaticky, ale uvnitř explicitního BEGIN platí, že rollback nebo pád spojení všechny zápisy zahodí.
Časté dotazy
- Jak opravit poslední commit, když jsem zapomněl soubor?
- Poslední commit se opravuje příkazem git commit --amend, který k němu přidá obsah indexu a případně upraví zprávu. Amend ale nemění původní objekt: vytvoří nový commit s jiným hashem a starý zůstane osiřelý. Dokud jste commit nikam neposlali, je to bezpečná operace. Pokud už byl publikovaný do sdílené větve, museli byste použít force push a ostatní vývojáři by si museli srovnat historii. Ve sdílených větvích je proto obvykle lepší doplnit opravu novým commitem.
- Co dělá git revert oproti git reset?
- Git revert vytvoří nový commit, který věcně ruší změny vybraného staršího commitu, takže historie zůstává nedotčená a operace je bezpečná i ve sdílené větvi. Git reset naopak posune ukazatel větve zpět a podle režimu (soft, mixed, hard) zachová nebo zahodí změny v indexu a pracovním adresáři. Reset se hodí na lokální úklid před publikováním, revert na nápravu něčeho, co už ostatní stáhli.
- Proč databáze při hromadném importu doporučují méně commitů?
- Každý commit v databázi vynutí zápis a synchronizaci transakčního logu na trvalé úložiště, aby přežil pád serveru. Tato synchronizace je řádově dražší než samotné vložení řádku do paměti, takže commit po každém řádku import několikanásobně zpomalí. Sloučení řádků do dávek po stovkách až tisících tuto režii rozpustí. Přehnaně velká transakce má ale opačný problém: dlouho drží zámky, brzdí úklid starých verzí řádků a při chybě se zahodí celá.
- Jak má vypadat dobrá commit message?
- Dobrá commit message má krátký první řádek v rozkazovacím způsobu, který shrnuje záměr, prázdný řádek a pak volitelný odstavec s vysvětlením, proč změna vznikla a jaké alternativy byly zvažovány. Seznam změněných řádků do zprávy nepatří, ten si nástroj zobrazí sám. Týmy často přidávají prefix podle konvence Conventional Commits, například feat nebo fix, aby se z historie dal automaticky sestavit changelog a odvodit číslo verze.
Zdroje
- git-commit Documentation(otevře se v novém okně)
- Pro Git(otevře se v novém okně)
- PostgreSQL Documentation: COMMIT(otevře se v novém okně)
- PostgreSQL Documentation: Reliability and the Write-Ahead Log(otevře se v novém okně)
- Commit (data management)(otevře se v novém okně)