- Git : Système de gestion de versions distribué
- GitHub/GitLab : Plateformes de collaboration
- Branches : Développement parallèle
- Commits : Historique des modifications
- Merge : Intégration des modifications
Problème : Configurer un dépôt Git pour un projet collaboratif
- Installer Git sur la machine locale
- Configurer les identifiants utilisateur
- Créer un dépôt distant (GitHub/GitLab)
- Initialiser un dépôt local
- Connecter le dépôt local au distant
# Configuration des informations utilisateur
git config --global user.name "Alice Martin"
git config --global user.email "alice.martin@example.com"
# Vérification de la configuration
git config --list
# Création du répertoire du projet
mkdir projet-bibliotheque
cd projet-bibliotheque
# Initialisation du dépôt Git
git init
# Création d'un fichier README
echo "# Projet de gestion de bibliothèque" > README.md
# Ajout des fichiers au suivi
git add README.md
# Premier commit
git commit -m "Initial commit: Ajout du README"
# Sur GitHub, créer un dépôt nommé "projet-bibliotheque"
# Copier l'URL du dépôt (HTTPS ou SSH)
# Ajouter le dépôt distant
git remote add origin https://github.com/alice-martin/projet-bibliotheque.git
# Pousser le premier commit vers le dépôt distant
git branch -M main
git push -u origin main
# Vérification de la connexion
git remote -v
Le dépôt local est correctement configuré et connecté au dépôt distant pour le travail collaboratif.
• Configurer les identifiants : Nom et email pour les commits
• Initialiser le dépôt : git init dans le répertoire du projet
• Connecter au distant : git remote add origin URL
Problème : Gérer les branches et les fusions dans un projet collaboratif
# Création d'une nouvelle branche pour une fonctionnalité
git checkout -b feature-gestion-utilisateurs
# Vérification de la branche active
git branch
# Ou en une seule commande (Git 2.23+)
git switch -c feature-gestion-utilisateurs
# Création d'un fichier pour la fonctionnalité
echo "def creer_utilisateur(nom, email):
# Fonction pour créer un nouvel utilisateur
utilisateur = {'nom': nom, 'email': email}
return utilisateur" > gestion_utilisateurs.py
# Ajout et commit des modifications
git add gestion_utilisateurs.py
git commit -m "Ajout de la fonction de création d'utilisateur"
# Basculement vers la branche principale
git checkout main
# Mise à jour depuis le dépôt distant
git pull origin main
# Fusion de la branche feature
git merge feature-gestion-utilisateurs
# Pousser les modifications vers le dépôt distant
git push origin main
# Suppression de la branche locale (optionnel)
git branch -d feature-gestion-utilisateurs
# Suppression de la branche distante (optionnel)
git push origin --delete feature-gestion-utilisateurs
# Si un conflit survient pendant la fusion
# Git indiquera les fichiers en conflit
# Exemple de conflit dans un fichier
<<<<<<< HEAD
def fonction_existant():
return "ancienne version"
=======
def fonction_existant():
return "nouvelle version"
>>>>>>> feature-gestion-utilisateurs
# Résolution manuelle du conflit, puis :
git add fichier_conflit.py
git commit -m "Résolution du conflit dans fonction_existant"
Les branches permettent un développement parallèle et une intégration contrôlée des modifications.
• Créer des branches pour chaque fonctionnalité : git checkout -b nom-branche
• Mettre à jour avant la fusion : git pull origin main
• Gérer les conflits : Résoudre manuellement les conflits de fusion
Problème : Synchroniser les modifications entre plusieurs collaborateurs
# Avant de commencer à travailler, récupérer les dernières modifications
git pull origin main
# Cela combine git fetch et git merge
# fetch télécharge les modifications distantes
# merge les intègre dans la branche locale
# Alice travaille sur la gestion des livres
git checkout -b feature-gestion-livres
echo "def ajouter_livre(titre, auteur):
# Fonction pour ajouter un livre
livre = {'titre': titre, 'auteur': auteur}
return livre" > gestion_livres.py
git add gestion_livres.py
git commit -m "Ajout de la fonction d'ajout de livre"
# Bob travaille sur la recherche
git checkout -b feature-recherche
echo "def rechercher_livre(critere, valeur):
# Fonction pour rechercher un livre
resultats = []
# Logique de recherche
return resultats" > recherche.py
git add recherche.py
git commit -m "Ajout de la fonction de recherche"
# Alice termine sa fonctionnalité
git checkout main
git pull origin main # Récupère les modifications de Bob
git merge feature-gestion-livres
git push origin main
# Bob récupère les modifications d'Alice avant de fusionner
git checkout main
git pull origin main # Récupère les modifications d'Alice
git merge feature-recherche
git push origin main
# Si un conflit survient, résolution manuelle
# Exemple : deux personnes ont modifié le même fichier
# Bonnes pratiques :
# 1. Pull avant de pousser
git pull origin main && git push origin main
# 2. Utiliser rebase pour un historique propre
git checkout feature-xyz
git rebase main # Applique les commits de feature après ceux de main
git checkout main
git merge feature-xyz
# 3. Synchronisation fréquente pour éviter les gros conflits
# 4. Communication entre collaborateurs pour coordonner les changements
La synchronisation régulière et la communication entre collaborateurs permettent d'éviter les conflits majeurs.
• Pull avant de push : Toujours récupérer les dernières modifications
• Commits fréquents : Partager le travail régulièrement
• Communication : Coordonner les changements avec les autres collaborateurs
Problème : Effectuer une revue de code collaborative et donner des feedbacks constructifs
# Alice termine sa branche et la pousse
git checkout feature-gestion-emprunts
git add .
git commit -m "Implémentation complète de la gestion des emprunts"
git push origin feature-gestion-emprunts
# Sur GitHub, créer une Pull Request
# Titre: "feat: Ajouter la gestion des emprunts"
# Description:
# - Fonctionnalité complète de gestion des emprunts
# - Ajout des tests unitaires
# - Documentation mise à jour
# Reviewers: bob.doe, charlotte.lee
# Code proposé par Alice
def gerer_emprunt(utilisateur_id, livre_isbn):
"""
Gère l'emprunt d'un livre par un utilisateur
"""
# Vérifier si l'utilisateur existe
utilisateur = rechercher_utilisateur(utilisateur_id)
if utilisateur is None:
raise ValueError("Utilisateur non trouvé")
# Vérifier si le livre existe
livre = rechercher_livre(livre_isbn)
if livre is None:
raise ValueError("Livre non trouvé")
# Vérifier la disponibilité
if livre['disponible'] == False:
raise ValueError("Livre non disponible")
# Enregistrer l'emprunt
emprunt = {
'utilisateur_id': utilisateur_id,
'livre_isbn': livre_isbn,
'date_emprunt': datetime.now(),
'date_retour_prevue': datetime.now() + timedelta(days=14)
}
sauvegarder_emprunt(emprunt)
return emprunt
Commentaires de Bob:
- ✅ Bonne gestion des erreurs
- ⚠️ Manque de validation des dates
- 💡 Ajouter un commentaire sur la durée de l'emprunt (14 jours)
- 🔄 Suggestion: Extraire la logique de vérification dans des fonctions séparées
Commentaires de Charlotte:
- ✅ Structure claire et lisible
- ❓ Est-ce que l'utilisateur peut avoir plusieurs emprunts ?
- 🔧 Suggestion: Ajouter un champ 'statut' à l'emprunt
def gerer_emprunt(utilisateur_id, livre_isbn):
"""
Gère l'emprunt d'un livre par un utilisateur
Args:
utilisateur_id: ID de l'utilisateur
livre_isbn: ISBN du livre à emprunter
Returns:
dict: Dictionnaire contenant les détails de l'emprunt
Raises:
ValueError: Si l'utilisateur ou le livre n'existe pas
ou si le livre n'est pas disponible
"""
# Vérifier si l'utilisateur existe
utilisateur = rechercher_utilisateur(utilisateur_id)
if utilisateur is None:
raise ValueError("Utilisateur non trouvé")
# Vérifier si l'utilisateur a atteint la limite d'emprunts
nb_emprunts = compter_emprunts_actifs(utilisateur_id)
if nb_emprunts >= MAX_EMPRUNTS_PAR_UTILISATEUR:
raise ValueError(f"L'utilisateur a atteint la limite de {MAX_EMPRUNTS_PAR_UTILISATEUR} emprunts")
# Vérifier si le livre existe
livre = rechercher_livre(livre_isbn)
if livre is None:
raise ValueError("Livre non trouvé")
# Vérifier la disponibilité
if not livre.get('disponible', False):
raise ValueError("Livre non disponible")
# Enregistrer l'emprunt
emprunt = {
'utilisateur_id': utilisateur_id,
'livre_isbn': livre_isbn,
'date_emprunt': datetime.now(),
'date_retour_prevue': datetime.now() + timedelta(days=DUREE_EMPRUNT_JOURS),
'statut': 'actif' # Ajout du statut de l'emprunt
}
sauvegarder_emprunt(emprunt)
return emprunt
Bob:
✅ Corrections apportées comme demandé
✅ Tests unitaires mis à jour
✅ Documentation améliorée
✅ Approve
Charlotte:
✅ Bonne réponse aux commentaires
✅ Gestion des limites d'emprunts ajoutée
✅ Code plus robuste
✅ Approve
Alice:
✅ PR mergée dans la branche principale
✅ Branches de développement supprimées
✅ Ticket de suivi mis à jour
La revue de code permet d'améliorer la qualité du code et de favoriser le partage de connaissances.
• Commentaires constructifs : Suggestions d'amélioration, pas de critiques personnelles
• Respect des conventions : Normes de codage et de documentation
• Validation par plusieurs personnes : Double validation pour les modifications critiques
Problème : Mettre en place un workflow collaboratif complet pour un projet de développement
WORKFLOW COLLABORATIF PROJET BIBLIOTHÈQUE
1. PLANIFICATION
- Création des tickets de fonctionnalités
- Attribution aux membres de l'équipe
- Estimation de la complexité
- Sprint planning (2 semaines)
2. BRANCHING STRATEGY
- main: Code de production stable
- develop: Intégration des fonctionnalités
- feature/*: Développement de nouvelles fonctionnalités
- hotfix/*: Corrections urgentes
- release/*: Préparation des releases
3. PROCESSUS DE DÉVELOPPEMENT
- Chaque fonctionnalité dans une branche dédiée
- Pull Request obligatoire pour merger
- Revue par au moins 2 membres
- Tests automatisés obligatoires
# Matin: Récupération des dernières modifications
git checkout main
git pull origin main
git checkout develop
git merge main
git push origin develop
# Début d'une nouvelle tâche
git checkout -b feature/recherche-avancee develop
# Développement de la fonctionnalité
# ... écriture du code ...
# Commit des modifications
git add .
git commit -m "feat: Ajouter la recherche avancée par catégories"
# Pousser la branche
git push origin feature/recherche-avancee
# Création d'une Pull Request sur GitHub
PROCESSUS DE VALIDATION:
1. La PR est assignée à 2 reviewers
2. Les tests automatisés s'exécutent (CI/CD)
3. Les reviewers examinent le code
4. Feedbacks et suggestions
5. Modifications si nécessaire
6. Approbation par les reviewers
7. Intégration dans la branche develop
8. Tests d'intégration
9. Si OK: Merge dans main pour release
10. Sinon: Retour à l'étape 5
Lundi:
- Alice: feature/gestion-retours
- Bob: feature/recherche-avancee
- Charlotte: refactor:ameliorer-performance
Mardi:
- Alice termine et crée PR #15
- Bob termine et crée PR #16
- Charlotte termine et crée PR #17
Mercredi:
- PR #15: Revue par Bob et Charlotte → Approbation
- PR #16: Revue par Alice et Charlotte → Demande de modifications
- PR #17: Revue par Alice et Bob → Approbation
Jeudi:
- Bob corrige PR #16
- PR #15 et #17 mergées dans develop
- PR #16 revue à nouveau et approuvée
Vendredi:
- Toutes les PRs mergées dans main
- Release de la version 1.2.0
Le workflow collaboratif assure une qualité de code élevée et une coordination efficace entre les membres de l'équipe.
• Processus clair : Chaque étape est bien définie et comprise
• Revues obligatoires : Toutes les modifications sont revues
• Tests automatisés : Vérification de la qualité avant l'intégration
- Commits atomiques : Chaque commit représente une modification logique
- Messages clairs : Messages de commit descriptifs et conventionnels
- Branches sémantiques : Noms de branches qui décrivent la fonctionnalité
- Revues de code : Validation par des pairs avant l'intégration
- Documentation : Maintenir la documentation à jour
- Ne jamais pousser directement sur la branche principale
- Toujours faire une Pull Request pour les modifications
- Respecter les conventions de codage de l'équipe
- Écrire des tests pour chaque nouvelle fonctionnalité
- Communication : La clé d'une collaboration efficace est la communication ouverte
- Automatisation : Utilisez des outils pour automatiser les tâches répétitives
- Flexibilité : Adaptez le workflow selon les besoins du projet
- Qualité : Priorisez la qualité du code sur la rapidité d'exécution