Conventional Commits et Releases
Vue d'ensemble
Les messages de commit sont une interface lisible par machine, pas seulement de la prose. Le versionnement automatisé et la génération de changelogs les analysent ; un message mal formé produit une version publique erronée ou une release cassée. La discipline dans le petit (un message bien formé) offre gratuitement la correction dans le grand (changelog précis, bon bump de version).
Le format
<type>(<scope>): <description>
| Type | Effet / utilisation |
|---|---|
feat | Nouvelle fonctionnalité — bump minor |
fix | Correction de bug — bump patch |
docs | Documentation uniquement |
chore | Maintenance, dépendances, configuration |
refactor | Changement de code sans changement de comportement |
test | Tests uniquement |
ci / build | Modifications du pipeline / système de build |
- Impératif : « ajoute X », pas « a ajouté X » ou « ajoute X ».
- Breaking changes :
feat!:ou un footerBREAKING CHANGE:— déclenche un bump major. - Scope facultatif mais encouragé :
feat(auth):,fix(db):.
Détails importants
- Le lien type↔version signifie qu'un
featoufixmal typé livre une version erronée. Choisissez le type délibérément : « ajouter » = nouvelle fonction, « mettre à jour » = amélioration d'existant, « corriger » = bug. - Squash-merge : le titre de la PR devient le commit qui est livré. Il doit lui-même être un Conventional Commit valide, sinon la release est fausse.
- Voix humaine. Pas d'attribution IA/assistant, pas de ligne
Co-authored-by, pas de pied de page généré par. Les commits doivent se lire comme écrits par un humain.
Rationalisations courantes
| Excuse | Réalité |
|---|---|
| « Le message n'a pas vraiment d'importance » | Il pilote le changelog et le numéro de version. Il compte mécaniquement. |
« chore est assez proche pour cette fonctionnalité » | chore ne bump pas la version ; les utilisateurs ne recevront pas votre fonctionnalité dans une release. Utilisez le bon type. |
| « Je corrigerai le titre de la PR plus tard » | En squash-merge, le titre est définitif à la fusion. Corrigez-le avant. |
« Un trailer Co-authored-by est inoffensif » | La règle du projet interdit l'attribution IA. Aucune exception. |
Drapeaux rouges — ARRÊTEZ-VOUS
- Un message de commit sans préfixe de type
- Utiliser
chore/docspour quelque chose qui ajoute ou corrige un comportement utilisateur - Un titre de PR squash qui n'est pas un conventional commit valide
- Toute attribution IA ou ligne
Co-authored-by
Application :
- Titre de PR — validé dans la CI, bloquant (
amannn/action-semantic-pull-request). En squash-merge, le titre est le commit livré, donc c'est la barrière importante. - Attribution IA — un job bloquant
No AI Attributionrejette les lignesCo-authored-bynommant Claude/Anthropic et les pieds de pageGenerated with [Claude…], à la fois dans les commits de la branche et dans le corps de la PR (le corps devient le corps du commit squash). Les lignesCo-authored-byhumaines ne sont pas affectées. - Corps des commits de branche — délibérément non lintés. Le squash-merge les jette, donc ils n'atteignent jamais le changelog. Si vous passez aux merge commits, ajoutez commitlint.
Faiblesse connue : si un commit est authored par un compte agent, GitHub compose un
Co-authored-by au moment du squash — après l'exécution du check de PR.
La barrière ci-dessus ne peut pas le voir. Ne committez pas en tant qu'identité agent.
Raison détaillée : Article III de la constitution, embarqué dans engineering-constitution/references/engineering-constitution.md.