Concepts avancé git
Les Concepts Avancés de Git : Branches, Merge et Rebase 🌳
Section intitulée « Les Concepts Avancés de Git : Branches, Merge et Rebase 🌳 »Les Branches : L’Art de Créer des Univers Parallèles
Section intitulée « Les Branches : L’Art de Créer des Univers Parallèles »Qu’est-ce qu’une Branche VRAIMENT ?
Section intitulée « Qu’est-ce qu’une Branche VRAIMENT ? »Imaginez que votre projet est comme un arbre 🌳. Le tronc principal (main/master) représente votre code stable et fonctionnel. Les branches sont comme… eh bien, des branches ! Chacune explore une direction différente.
Mais techniquement, une branche c’est quoi ?
- Juste un pointeur mobile vers un commit spécifique
- Quand vous commitez sur une branche, le pointeur avance automatiquement
- Créer une branche = créer un nouveau pointeur (0 coût en performance !)
# Visualisons celagit log --oneline --graph --allLe Cycle de Vie d’une Branche
Section intitulée « Le Cycle de Vie d’une Branche »1. Naissance 👶
# Depuis maingit checkout maingit checkout -b feature/nouvelle-fonctionnalite
# Ou plus modernegit switch -c feature/nouvelle-fonctionnalite2. Développement 💪
# Travaillez tranquillementecho "nouveau code" >> fichier.txtgit add fichier.txtgit commit -m "Ajout fonctionnalité géniale"3. Synchronisation (importante !)
# Récupérez les dernières modifs de maingit checkout maingit pull origin maingit checkout feature/nouvelle-fonctionnalitegit merge main # ou git rebase main (on y vient !)4. Intégration 🤝
git checkout maingit merge feature/nouvelle-fonctionnalite5. Nettoyage 🧹
git branch -d feature/nouvelle-fonctionnaliteMerge : La Fusion des Mondes 🌍➕🌎
Section intitulée « Merge : La Fusion des Mondes 🌍➕🌎 »Les Types de Merge
Section intitulée « Les Types de Merge »1. Fast-Forward Merge (le plus simple)
Avant :main: A---B---Cfeature: D---E
Après merge :main: A---B---C---D---EÇa arrive quand main n’a pas bougé depuis la création de la branche. Git dit : “Facile, je déplace juste le pointeur !”
2. Three-Way Merge (le classique)
Avant :main: A---B---C---F \feature: D---E
Après merge :main: A---B---C---F---G \ /feature: D---E---/Git crée un commit de merge (G) qui a deux parents !
3. Merge avec Conflits (l’aventure commence !)
# Scénario : deux personnes modifient la même ligne# Branch main : "Prix: 3€"# Branch feature : "Prix: 2.5€"
git merge feature/prix-reduits# CONFLICT! 🚨Git vous montre quelque chose comme ça :
Prix:<<<<<<< HEAD3€=======2.5€>>>>>>> feature/prix-reduitsComment résoudre :
- Éditez le fichier manuellement
- Supprimez les marqueurs
<<<<<<<,=======,>>>>>>> - Gardez ce que vous voulez
git addle fichier résolugit commit(Git prépare automatiquement le message)
Strategies de Merge
Section intitulée « Strategies de Merge »# Merge classique (crée toujours un commit de merge)git merge --no-ff feature-branch
# Squash merge (écrase tous les commits en un seul)git merge --squash feature-branchgit commit -m "Fonctionnalité complète en un commit"Rebase : La Réécriture de l’Histoire ✨
Section intitulée « Rebase : La Réécriture de l’Histoire ✨ »Qu’est-ce que le Rebase ?
Section intitulée « Qu’est-ce que le Rebase ? »Le rebase, c’est comme dire à Git : “Fais comme si ma branche avait été créée à partir du dernier commit de main, MÊME si ce n’est pas vrai historiquement.”
Avant rebase :main: A---B---C---F \feature: D---E
Après rebase :main: A---B---C---F \feature: D'---E'Les commits D et E sont réécrits (D’ et E’) pour s’appliquer après F !
Rebase vs Merge : Le Grand Débat 🥊
Section intitulée « Rebase vs Merge : Le Grand Débat 🥊 »Team Merge dit :
- “L’histoire vraie compte ! On voit quand les branches ont été créées”
- “Plus sûr, on ne réécrit pas l’histoire”
- “Les commits de merge documentent les intégrations”
Team Rebase dit :
- “Histoire linéaire = plus facile à lire”
- “Pas de commits de merge parasites”
- “On dirait que tout a été développé séquentiellement”
Rebase Interactif : Le Couteau Suisse 🛠️
Section intitulée « Rebase Interactif : Le Couteau Suisse 🛠️ »git rebase -i HEAD~3 # Modifier les 3 derniers commitsGit vous ouvre un éditeur avec quelque chose comme :
pick a1b2c3d Ajout du menupick e4f5g6h Correction typopick i7j8k9l Ajout descriptions
# Commands:# p, pick = utiliser le commit# r, reword = utiliser le commit mais modifier le message# e, edit = utiliser le commit mais s'arrêter pour modification# s, squash = utiliser le commit mais le fusionner avec le précédent# d, drop = supprimer le commitCas d’usage magiques :
- Corriger un message de commit pourri
- Fusionner plusieurs petits commits en un seul
- Supprimer un commit embarrassant
- Réorganiser l’ordre des commits
Le Rebase du Quotidien
Section intitulée « Le Rebase du Quotidien »Scenario typique :
# Vous travaillez sur une featuregit checkout feature/awesome-stuff
# Pendant ce temps, main a évolué# Au lieu de merger main dans votre branche...git rebase main
# Résultat : votre branche semble avoir été créée depuis le dernier commit de main !Les Règles d’Or ⚖️
Section intitulée « Les Règles d’Or ⚖️ »Quand Utiliser Merge
Section intitulée « Quand Utiliser Merge »- Intégrer une branche de feature dans main
- Préserver l’historique exact du travail collaboratif
- Quand vous travaillez sur une branche partagée
Quand Utiliser Rebase
Section intitulée « Quand Utiliser Rebase »- Nettoyer votre branche avant de la merger
- Synchroniser votre branche locale avec main
- Réorganiser vos commits locaux (pas encore pushés !)
LA RÈGLE ULTIME 🚨
Section intitulée « LA RÈGLE ULTIME 🚨 »NEVER REBASE SHARED HISTORY ! Ne rebasez JAMAIS une branche qui a été pushée et sur laquelle d’autres personnes travaillent. Vous allez créer un chaos temporel !
Exemples Pratiques 🧪
Section intitulée « Exemples Pratiques 🧪 »Workflow avec Merge
Section intitulée « Workflow avec Merge »git checkout maingit pull origin maingit checkout -b feature/login-system
# Développement...git add .git commit -m "Ajout système de login"git commit -m "Tests pour le login"git commit -m "Correction bug login"
# Intégrationgit checkout maingit pull origin main # Au cas où main ait évoluégit merge feature/login-systemgit push origin maingit branch -d feature/login-systemWorkflow avec Rebase
Section intitulée « Workflow avec Rebase »git checkout maingit pull origin maingit checkout -b feature/login-system
# Développement...git add .git commit -m "WIP: login en cours"git commit -m "Presque fini"git commit -m "Login fonctionnel"
# Nettoyage avant intégrationgit rebase -i HEAD~3 # Squash en un seul commit propregit rebase main # Mettre à jour par rapport à main
# Intégration propregit checkout maingit merge feature/login-system # Fast-forward !Résolution de Conflits en Rebase
Section intitulée « Résolution de Conflits en Rebase »git rebase main# CONFLICT!
# Résolvez le conflit dans les fichiersgit add fichier-resolu.txtgit rebase --continue
# Si vous voulez abandonnergit rebase --abortCommandes de Debug et Visualisation 🔍
Section intitulée « Commandes de Debug et Visualisation 🔍 »# Voir l'arbre des branchesgit log --oneline --graph --all --decorate
# Voir d'où vient une branchegit merge-base main feature-branch
# Voir les commits uniquement dans une branchegit log main..feature-branch
# Voir qui a modifié quoigit blame fichier.txt
# Visualiser les différencesgit diff main...feature-branch # Trois points = depuis le point de divergenceAnti-Patterns et Erreurs Communes ⚠️
Section intitulée « Anti-Patterns et Erreurs Communes ⚠️ »❌ Ne jamais faire :
# Rebase une branche publiquegit checkout maingit rebase feature # NON ! main est partagée !
# Merge main dans votre branche de feature repetitivementgit checkout featuregit merge main # Crée des commits de merge pollués✅ Mieux faire :
# Garder votre branche à jourgit checkout featuregit rebase main # Propre et linéaire
# Ou si vous préférez mergegit checkout maingit merge feature # Une seule fois, à la fin