Retour au cours

branches et fusion dans git : merge et rebase

Objectifs

  • Comprendre l’utilité des branches pour isoler le travail et collaborer.
  • Créer, lister et changer de branche avec git branch et git switch.
  • Fusionner les changements d’une branche dans une autre avec git merge.
  • Comprendre la différence entre un merge “fast-forward” et un “merge commit”.
  • Apercevoir git rebase comme une alternative pour maintenir un historique linéaire.

Pourquoi utiliser des branches ?

Une branche dans Git est une ligne de développement indépendante. C’est comme créer une copie de votre projet où vous pouvez expérimenter, ajouter une nouvelle fonctionnalité, ou corriger un bug, sans jamais toucher à la version principale stable (généralement la branche main).

C’est le concept central qui permet à des équipes entières de travailler en parallèle sur le même projet sans se marcher sur les pieds.

Commandes de gestion des branches

  • git branch : Liste toutes vos branches locales.
  • git branch <nom-de-la-branche> : Crée une nouvelle branche.
  • git switch <nom-de-la-branche> : Change de branche pour commencer à travailler dessus. (La commande moderne qui remplace git checkout <nom>).
  • git switch -c <nom-de-la-branche> : Crée une nouvelle branche et bascule dessus en une seule fois.
  • git branch -d <nom-de-la-branche> : Supprime une branche (uniquement si elle a été fusionnée).

Fusionner des branches avec git merge

Une fois que votre travail sur une branche est terminé et testé, vous voulez l’intégrer à la branche principale (main). C’est le rôle de git merge.

Le processus est le suivant :

  1. On se place sur la branche qui doit recevoir les changements : git switch main.
  2. On lance la commande de fusion : git merge <branche-a-fusionner>.

Fast-forward vs. Merge Commit

  • Fast-forward : Si la branche main n’a reçu aucun nouveau commit pendant que vous travailliez sur votre branche, Git se contente de déplacer le pointeur de main vers le dernier commit de votre branche. L’historique reste une ligne droite. C’est simple, mais on perd l’information qu’un travail a été fait dans une branche séparée.
  • Merge Commit : Si les deux branches ont divergé (chacune a reçu de nouveaux commits), Git crée un nouveau “commit de fusion”. Ce commit spécial a deux parents et unifie l’historique des deux branches. C’est la méthode par défaut dans ce cas. On peut la forcer avec l’option --no-ff (no fast-forward) pour toujours garder une trace de la branche de fonctionnalité.

Alternative : git rebase

git rebase est une autre façon d’intégrer des changements. Au lieu de créer un commit de fusion, il prend vos commits et les “rejoue” un par un au-dessus des derniers changements de la branche main.

  • Avantage : Crée un historique linéaire, plus facile à lire.
  • Inconvénient : Il réécrit l’historique, ce qui est dangereux sur une branche partagée par plusieurs personnes.

Règle simple pour débuter : utilisez merge pour les branches partagées et gardez rebase pour nettoyer votre propre travail en local avant de le partager.

Bonnes pratiques

  • Créez une branche pour chaque tâche, même la plus petite.
  • Nommez vos branches de manière descriptive :
    • feature/ajout-login
    • fix/bug-affichage-mobile
  • Fusionnez et supprimez régulièrement les branches de fonctionnalités une fois qu’elles sont terminées pour garder un dépôt propre.
  • Privilégiez les merge commits (--no-ff) pour les fonctionnalités importantes. Cela rend l’historique plus lisible en regroupant tous les commits d’une feature.

Pièges courants

  • Oublier sur quelle branche on se trouve : Utilisez git branch ou configurez votre prompt de terminal pour toujours afficher la branche active.
  • Fusionner dans le mauvais sens : Assurez-vous d’être bien sur la branche réceptrice (main) avant de lancer git merge.
  • Utiliser git rebase sur une branche partagée : C’est la source de nombreux problèmes pour les équipes. Ne réécrivez l’historique que s’il est local et que vous êtes seul à travailler dessus.

Exercices

  1. Votre première branche :

    • Dans un dépôt existant, créez une branche feature/test-branche.
    • Basculez sur cette branche.
    • Créez un nouveau fichier, ajoutez-le et faites un commit.
    • Utilisez git log --oneline --graph --all pour visualiser les deux branches.
  2. Votre première fusion :

    • Revenez sur la branche main (git switch main).
    • Fusionnez votre branche de feature : git merge feature/test-branche.
    • Observez le message (probablement un fast-forward).
  3. Créer un conflit (volontairement) :

    • Créez une nouvelle branche feature/conflit.
    • Modifiez la première ligne d’un fichier. Faites un commit.
    • Retournez sur main et modifiez la même ligne de manière différente. Faites un commit.
    • Essayez de fusionner feature/conflit dans main. Git s’arrêtera et vous demandera de résoudre le conflit. C’est l’objet de la prochaine leçon !