Conventional Commits 1.0.0
Summary
Specifikacija Conventional Commits predstavlja laganu konvenciju zasnovanu na porukama commit-ova. Ona obezbeđuje jednostavan skup pravila za kreiranje eksplicitne istorije commit-ova, što olakšava pisanje automatizovanih alata iznad nje. Ova konvencija se prirodno uklapa sa SemVer-om, jer opisuje funkcionalnosti, ispravke i ključne promene uvedene u commit porukama.
Poruka commita treba da bude strukturirana na sledeći način:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Commit sadrži sledeće strukturalne elemente, kako bi se jasno komunicirala namera korisnicima vaše biblioteke:
- fix: commit tipa
fixispravlja grešku u vašoj bazi koda (odgovaraPATCHnivou u Semantic Versioning-u). - feat: commit tipa
featuvodi novu funkcionalnost u kod (odgovaraMINORnivou u Semantic Versioning-u). - BREAKING CHANGE: commit koji ima fusnotu
BREAKING CHANGE:, ili dodaje znak!nakon type/scope segmenta, uvodi „breaking“ promenu API-ja (odgovaraMAJORnivou u Semantic Versioning-u). BREAKING CHANGE može postojati u commit-ovima bilo kog tipa. - tipovi osim
fix:ifeat:su dozvoljeni; na primer @commitlint/config-conventional (baziran na Angular konvenciji) preporučuje tipovebuild:,chore:,ci:,docs:,style:,refactor:,perf:,test:, itd. - fusnote osim
BREAKING CHANGE: <opis>su dozvoljene i slede konvenciju sličnu git trailer formatu.
Dodatni tipovi nisu obavezni po ovoj specifikaciji i nemaju implicitno značenje u Semantic Versioning-u (osim ako sadrže BREAKING CHANGE).
Opciona oblast (scope) može biti dodata tipu commit-a kako bi pružila dodatni kontekst, i piše se u zagradi, npr.: feat(parser): add ability to parse arrays.
Primeri
Commit sa opisom i BREAKING CHANGE fusnotom
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
Commit poruka sa ! znakom koji ukazuje na breaking promenu
feat!: send an email to the customer when a product is shipped
Commit poruka sa scope-om i ! znakom
feat(api)!: send an email to the customer when a product is shipped
Commit poruka sa ! znakom i BREAKING CHANGE fusnotom
chore!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.
Commit poruka bez tela poruke
docs: correct spelling of CHANGELOG
Commit poruka sa scope-om
feat(lang): add Serbian language
Commit poruka sa multi-paragraf telom i više fusnota
fix: prevent racing of requests
Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.
Remove timeouts which were used to mitigate the racing issue but are
obsolete now.
Reviewed-by: Z
Refs: #123
Specifikacija
Ključne reči “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY” i “OPTIONAL” u ovom dokumentu tumače se u skladu sa RFC 2119.
- Commit-ovi MORAJU imati prefiks tipa (imenica), kao što su
feat,fixitd., opcionim scope-om, opcionim!, i obaveznim dvotačkom i razmakom nakon toga. - Tip
featse MORA koristiti kada commit dodaje novu funkcionalnost. - Tip
fixse MORA koristiti kada commit ispravlja grešku. - Scope MOŽE biti dodat posle tipa. Scope MORA biti imenica koja opisuje deo kodne baze i mora biti u zagradi, npr.
fix(parser): - Opis MORA odmah slediti posle dvotačke i razmaka. Opis je kratak rezime promena koda npr.: fix: array parsing issue when multiple spaces were contained in string.
- Duže telo commit-a MOŽE biti dato posle opisa, pružajući dodatne kontekstualne informacije o promenama koda. Telo MORA početi posle jednog praznog reda.
- Telo commit-a je slobodnog formata i može sadržati proizvoljan broj pasusa.
- Jedna ili više fusnota MOŽE biti dodata posle još jednog praznog reda. Svaka fusnota MORA imati token, zatim
:<space>ili<space>#, pa vrednost stringa (inspirisano od strane git trailer convention). - Token fusnota MORA koristiti crticu
-umesto razmaka, npr.,Acked-by(ovo pomaže u razlikovanju fusnota od tela koje se sastoji od više pasusa). Izuzetak je napravljen zaBREAKING CHANGE, koji se takođe MOŽE koristiti kao token. - Vrednost fusnote MOŽE sadržati razmake i nove redove; parsiranje MORA da se završi kada se primeti sledeći važeći par tokena/separatora u fusnoti.
- Breaking promene MORAJU biti naznačene u type/scope prefiksu ili kao fusnota.
- Ako je uključena kao fusnota, ključna promena MORA da sadrži tekst napisan velikim slovima BREAKING CHANGE, nakon čega slede dvotačka, razmak i opis, npr. BREAKING CHANGE: environment variables now take precedence over config files.
- Ako je u prefiksu (type/scope), ključne izmene MORAJU biti označene znakom
!pre dvotačke:. Ako se koristi znak!, MOŽE se izostavitiBREAKING CHANGEiz fusnote, a opis izmene se MORA koristiti za opis ključne izmene. - Tipovi koji nisu
featifixMOGU se koristiti u vašim commit porukama, npr. docs: update ref docs. - Jedinice informacija koje čine konvencionalne commit-ove NE SMEJU biti tretirane kao osetljive na velika i mala slova od strane implementatora, sa izuzetkom BREAKING CHANGE koje MORA biti velikim slovima.
- BREAKING-CHANGE MORA biti sinonim za BREAKING CHANGE, kada se koristi kao token u fusnoti.
Zašto koristiti Conventional Commits
- Automatsko generisanje CHANGELOG-ova
- Automatsko određivanje semantičke nadogradnje verzije (na osnovu tipova commit-a).
- Saopštavanje promena kolegama, javnosti i drugim zainteresovanim stranama.
- Okidanje build i publish procesa
- Olakšava doprinos novim saradnicima i održava organizovan commit istorijat.
Česta pitanja (FAQ)
Kako da pristupim commit porukama u ranoj fazi razvoja?
Preporučujemo da se ponašate kao da je proizvod već objavljen. Neko već koristi vaš softver i želi da zna šta je ispravljeno i šta se menja.
Da li tip commit-a u naslovu treba da bude malim ili velikim slovima?
Može bilo kako, ali je najbolje biti dosledan.
Šta da radim ako commit odgovara više od jednog tipa commit-a?
Vratite se i napravite višestruke commit-ove kad god je to moguće. Deo prednosti Conventional Commits je njihova sposobnost da nas podstaknu da pravimo organizovanije commit-ove i PR-eve.
Da li ovo usporava razvoj?
Sprečava samo haotično kretanje. Dugoročno ubrzava rad na više projekata sa različitim timovima.
Da li ovo ograničava programere u izboru tipova?
Conventional Commits nas podstiče da pravimo više određenih vrsta commit-ova, kao što su ispravke. Osim toga, fleksibilnost Conventional Commits omogućava vašem timu da osmisli sopstvene tipove i da ih menja tokom vremena.
Kako se ovo odnosi na SemVer?
Commit-ovi tipa fix treba da se prevedu na izdanja PATCH. Commit-ovi tipa feat treba da se prevedu na izdanja MINOR. Commit-ovi sa BREAKING CHANGE u commit-u, bez obzira na tip, treba da se prevedu na izdanja MAJOR.
Kako treba da verzionišem svoje ekstenzije prema specifikaciji Conventional Commits-a, npr. @jameswomack/conventional-commit-spec?
Preporučujemo korišćenje SemVer-a za objavljivanje sopstvenih ekstenzija prema ovoj specifikaciji (i ohrabrujemo vas da ih napravite!).
Šta da radim ako slučajno koristim pogrešan tip commit-a?
Kada ste koristili tip koji je iz specifikacije, ali nije ispravan tip, npr. fix umesto feat
Pre merge-a ili objavljivanja greške, preporučujemo da koristite git rebase -i za uređivanje istorije izmena. Nakon objavljivanja, čišćenje će biti drugačije u zavisnosti od alata i procesa koje koristite.
Kada ste koristili tip koji nije iz specifikacije, npr. feet umesto feat
U najgorem slučaju, nije kraj sveta ako se commit završi tako što ne ispunjava specifikaciju Conventional Commits-a. To jednostavno znači da će alati zasnovani na toj specifikaciji propustiti taj commit.
Da li svi moji saradnici moraju da koriste specifikaciju konvencionalnih commit-a?
Ne! Ako koristite tok rada zasnovan na squash-u na Git-u, glavni održavaoci mogu da očiste poruke o commit-ovima dok se merge-uju - bez dodatnog opterećenja za povremene korisnike. Uobičajeni tok rada za ovo je da vaš Git sistem automatski squash-uje commit-ove iz zahteva za pull i predstavi obrazac glavnom održavaocu da unese odgovarajuću Git poruku o commit-ovima za merge.
Kako Conventional Commits postupaju sa vraćanjem izmena?
Vraćanje koda može biti komplikovano: da li vraćate više izmena (commit)? Ako vraćate funkciju, da li bi sledeće izdanje trebalo da bude zakrpa (patch)?
Conventional Commits ne pokušava izričito da definiše ponašanje prilikom vraćanja izmena (revert). Umesto toga, prepuštamo autorima alata da iskoriste fleksibilnost types i footers kako bi razvili sopstvenu logiku za rukovanje vraćanjem commit‑ova.
Jedna od preporuka je da se koristi tip revert i fusnota koji referencira SHA oznake commit‑ova koji se vraćaju:
revert: let us never again speak of the noodle incident
Refs: 676104e, a215868