Conventional Commits: Transformando tu Historial Git en una Herramienta Poderosa

¿Qué son los Conventional Commits?

Los Conventional Commits son una especificación para dar estructura a los mensajes de commit. Proporcionan un conjunto sencillo de reglas para crear un historial de commits explícito, lo que facilita la escritura de herramientas automatizadas.

Formato básico

<tipo>[ámbito opcional]: <descripción>

[cuerpo opcional]

[nota(s) al pie opcionales]

Tipos de Commits Principales

Ámbitos (Scopes) Comunes en Android

Los ámbitos ayudan a identificar qué parte del código se ve afectada:

Implementación Práctica

1. Configuración de Git Hooks

Podemos usar herramientas como commitizen para forzar el formato:

# Instalar commitizen
npm install -g commitizen
npm install -g cz-conventional-changelog

# Configurar en el proyecto
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

# Usar git cz en lugar de git commit
git cz

2. Automatización con GitHub Actions

name: Validate Commits
on: [push, pull_request]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Validate commit messages
        uses: wagoid/commitlint-github-action@v5
        with:
          configFile: .commitlintrc.json

3. Configuración de commitlint

// .commitlintrc.json
{
  "extends": ["@commitlint/config-conventional"],
  "rules": {
    "type-enum": [2, "always", [
      "feat", "fix", "docs", "style",
      "refactor", "test", "chore", "perf"
    ]],
    "scope-enum": [2, "always", [
      "ui", "api", "db", "auth", "gradle",
      "manifest", "core", "utils"
    ]]
  }
}

Generación Automática de Changelogs

Una de las mayores ventajas es la generación automática de changelogs:

Con standard-version

# Instalar standard-version
npm install --save-dev standard-version

# Añadir script en package.json
{
  "scripts": {
    "release": "standard-version"
  }
}

# Generar nueva versión y changelog
npm run release

Resultado del changelog generado

# Changelog

## [1.2.0] - 2025-08-22

### Features
* **auth**: add biometric authentication support
* **ui**: implement dark mode theme
* **api**: add offline data synchronization

### Bug Fixes
* **db**: fix memory leak in database connections
* **ui**: resolve crash on device rotation

### Performance Improvements
* **api**: optimize network request caching

Integración con Semantic Release

Semantic Release automatiza todo el proceso de versionado:

// .releaserc.json
{
  "branches": ["main"],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    "@semantic-release/npm",
    "@semantic-release/github"
  ]
}

Commits con Breaking Changes

Para cambios que rompen la compatibilidad:

feat(api)!: change user authentication method

BREAKING CHANGE: The authentication API now requires
OAuth 2.0 instead of API keys. All existing integrations
must be updated to use the new authentication flow.

Beneficios en Proyectos Android

1. Claridad en el historial

El historial de commits se convierte en una documentación viva del proyecto:

2. Automatización del release

Integración perfecta con Google Play Console:

3. Mejor colaboración en equipo

Los desarrolladores pueden entender rápidamente:

Herramientas y Extensiones

Casos de Uso Avanzados

Monorepos con Android

feat(mobile/android): add new payment module
fix(mobile/ios): resolve memory leak in camera
docs(shared/api): update authentication docs

Versionado por módulos

feat(core): add new data encryption utilities
feat(ui-components): implement custom progress bar
fix(networking): resolve timeout issues in HTTP client

Conclusión

Los Conventional Commits transforman la forma en que trabajamos con Git, convirtiendo algo mundano como escribir mensajes de commit en una herramienta poderosa para la automatización y documentación.

En proyectos Android, donde el ciclo de releases es crítico y la colaboración en equipo es esencial, adoptar esta práctica puede marcar la diferencia entre un proyecto caótico y uno bien organizado.