Git workflow pour TypeScript : comment arrêter d'avoir peur des merge conflicts
\n\nSi vous avez déjà essayé de merger deux branches, où l'une modifiait l'interface User et l'autre ajoutait un nouveau type dans le même module, vous savez ce qu'est une crise existentielle de développeur. TypeScript nous offre un système de types puissant, mais sans un Git workflow approprié, cette puissance se transforme en casse-tête.
Dans cet article, nous allons détailler le Git workflow optimal pour les projets TypeScript — de la configuration des branches à la vérification automatique des types à chaque commit. Rien de superflu, seulement ce qui fonctionne vraiment en production.
\n\nPourquoi TypeScript nécessite-t-il une approche particulière de Git ?
\n\nTypeScript n'est pas simplement « JavaScript avec des types ». C'est un langage où chaque modification peut impacter des dizaines de fichiers via interface, type et les génériques. Une seule modification erronée dans un type de base, et tout le projet cesse de se compiler.
C'est pourquoi un git workflow standard pour TypeScript doit inclure :
\n\n- \n
- Une vérification obligatoire des types avant le commit \n
- Un linter qui empêche de commiter du code non formaté \n
- Une stratégie de branchement claire pour que les merge conflicts ne cassent pas les types \n
- Un CI/CD qui revérifie tout sur le serveur \n
Examinons chaque point dans l'ordre.
\n\n1. Choisir une stratégie de branchement : Git Flow ou Trunk-based ?
\n\nPour les projets TypeScript, je recommande le Trunk-based development avec des branches à courte durée de vie. Pourquoi ? Parce que le code TypeScript est, par essence, du code « brut » qui doit être rapidement vérifié et déployé. Les branches longues entraînent une « divergence » des types.
\n\nStructure de base des branches
\n\nmain — version stable, toujours prête pour le déploiement\ndevelop — branche principale de développement\nfeature/* — nouvelles fonctionnalités (vivent 1-2 jours)\nfix/* — corrections de bugs\nrelease/* — préparation de version (optionnel)\n\n\nExemple pour un projet TypeScript :
\n\ngit checkout -b feature/add-user-validation\n# on travaille...\ngit commit -m "feat: add email validation for User type"\ngit push origin feature/add-user-validation\n# on crée une PR → merge dans develop\n\n\nImportant : ne faites jamais de rebase sur main si le projet contient des types partagés. Utilisez merge — il préserve l'historique et ne casse pas les dépendances.
\n\n2. Git Hooks : protection contre les erreurs (et contre soi-même)
\n\nLe scénario le plus fréquent : vous oubliez de lancer tsc, vous commitez, vous pushez, et le CI échoue. Pour éviter cela, configurons des pre-commit hooks.
Installation de Husky + lint-staged
\n\nHusky est un outil de gestion des Git hooks. lint-staged exécute des commandes uniquement sur les fichiers modifiés.
\n\nnpm install --save-dev husky lint-staged\nnpx husky init\n\n\nCréez le fichier .husky/pre-commit :
#!/usr/bin/env sh\n. "$(dirname -- "$0")/_/husky.sh"\n\nnpx lint-staged\n\n\nDans package.json, ajoutez :
{\n "lint-staged": {\n "*.ts": [\n "eslint --fix",\n "prettier --write",\n "tsc --noEmit"\n ]\n }\n}\n\n\nDésormais, avant chaque commit :
\n- \n
- ESLint s'exécute avec correction automatique \n
- Le code est formaté via Prettier \n
- La compilation TypeScript est vérifiée (
tsc --noEmit) \n
Si une seule étape échoue — le commit est bloqué. Brutal, mais efficace.
\n\n3. Messages de commit corrects : conventional commits
\n\nLes projets TypeScript bénéficient des conventional commits, car :
\n- \n
- Un changelog est généré automatiquement \n
- Il est facile de comprendre quels changements cassent les types \n
- On peut déclencher le CI uniquement sur certains commits \n
Exemples :
\n\nfeat: add UserRole enum and validation\nfix: c