La création de branches est fondamentale pour isoler le développement. Pour démarrer une nouvelle ligne de travail, on initialise une branche puis on s'y positionne.
git branch develop
git checkout develop
# Commande équivalente en une étape :
# git checkout -b develop
Pour lister toutes les branches, y compris celles des dépôts distants, on utilise :
git branch -a
La branche active est signalée par un astérisque (*).
Sur la nouvelle branche, on effectue des modifications, on les indexe et on les valide.
git add readme.md
git commit -m "Implémentation du module d'authentification"
Une branche locale devenue inutile peut être supprimée :
git branch -d nom-de-la-branche
Fusion de branches
Fusion rapide (Fast-forward)
Pour intégrer les changements de la branche develop dans main :
git checkout main
git merge develop
git branch -d develop
Ce type de fusion, appelé Fast-forward, déplace simplement le pointeur de main vers la pointe de develop. L'historique linéaire est conservé.
Résolution des conflits
Un conflit survient lorsque des modifications concurrentes touchent aux mêmes lignes d'un fichier.
CONFLICT (content): Merge conflict in src/app.js
Automatic merge failed; fix conflicts and then commit the result.
Il faut alors éditer manuellement les fichiers concernés. Git insère des marqueurs pour indiquer les sections en conflit :
<<<<<<< HEAD
console.log('Version de main');
=======
console.log('Version de develop');
>>>>>>> develop
Après avoir choisi ou combiné le code, on marque la résolution et on finalise :
git add src/app.js
git commit -m "Résolution du conflit dans app.js"
Pour visualiser l'historique sous forme de graphe, incluant les fusions :
git log --graph --oneline --decorate --all
Stratégie de gestion des branches
Le mode Fast-forward (par défaut) efface l'historique des branches. Pour forcer la création d'un commit de fusion et préserver cette information :
git merge --no-ff -m "Fusion de develop dans main" develop
L'option --no-ff désactive le Fast-forward, créant ainsi un commit de fusion dédié.
Modèle de travail recommandé : La branche main reste stable, servant uniquement aux livraisons. Le développement actif a lieu sur une branche develop intégratrice. Chaque développeur travaille sur ses propres branches fonctionnelles, les fusionnant fréquemment dans develop, et cette dernière n'est intégrée dans main que lors des publications.
Gestion des correctifs urgents
Lorsqu'un bug critique doit être corrigé alors que le travail en cours n'est pas terminé, on utilise une fonctionnalité de suspension de l'espace de travail.
git stash
Cette commande sauvegarde l'état des fichiers modifiés mais non validés. On peut ensuite passer sur la branche stable (ex: main), créer une branche de correction, et appliquer le fix.
git checkout main
git checkout -b hotfix-bug123
# ... corrections et commit ...
git checkout main
git merge --no-ff hotfix-bug123
git branch -d hotfix-bug123
On retourne ensuite sur la branche de développement.
git checkout develop
git status # L'espace de travail est propre
Pour récupérer le travail suspendu :
git stash pop # Restaure et supprime la dernière sauvegarde
# ou
git stash apply stash@{0} # Restaure sans supprimer
L'historique des suspensions se consulte avec git stash list.
Banches fonctionnelles
Pour développer une nouvelle fonctionnalité, on évite de polluer les branches principales avec du code expérimental.
git checkout -b feature/nouveau-api
# ... développement, commits ...
git checkout develop
git merge --no-ff feature/nouveau-api
git branch -d feature/nouveau-api
Si la fonctionnalité doit être abandonnée avant fusion, la suppression classique (-d) refusera car elle contient des commits non fusionnés. La suppression forcée se fait avec l'option -D (majuscule) :
git branch -D feature/nouveau-api