- Repository : Dossier contenant le code source et l'historique
- Commit : Instantané des modifications
- Branch : Ligne de développement indépendante
- Remote : Dépôt distant (GitHub, GitLab)
- Push/Pull : Synchronisation avec le serveur
Problème : Initialiser un dépôt Git pour un nouveau projet
- Créer un répertoire pour le projet
- Initialiser le dépôt Git
- Configurer les identifiants
- Créer le premier fichier
- Effectuer le premier commit
# Configuration des identifiants utilisateur
git config --global user.name "Élève NSI"
git config --global user.email "eleve.nsi@etablissement.fr"
# Vérification de la configuration
git config --list
# Création du répertoire du projet
mkdir projet-calculatrice
cd projet-calculatrice
# Initialisation du dépôt Git
git init
# Vérification de l'état du dépôt
git status
# Résultat:
# On branch main
# No commits yet
# nothing to commit (create/copy files and use "git add" to track)
# Création du fichier README
echo "# Projet Calculatrice" > README.md
echo "Ce projet implémente une calculatrice basique en Python" >> README.md
# Ajout du fichier au suivi
git add README.md
# Vérification de l'état
git status
# Premier commit
git commit -m "Initial commit: Ajout du README"
Le dépôt est correctement initialisé avec un premier commit contenant le fichier README.
• Configuration globale : git config --global pour les identifiants
• Initialisation : git init dans le répertoire du projet
• Commit initial : Toujours commencer par un README
Problème : Gérer les commits de manière organisée et descriptive
# Création d'un fichier Python pour la calculatrice
cat > calculatrice.py << EOF
def addition(a, b):
"""Fonction pour additionner deux nombres"""
return a + b
def multiplication(a, b):
"""Fonction pour multiplier deux nombres"""
return a * b
# Test des fonctions
print(addition(5, 3))
print(multiplication(4, 6))
EOF
# Ajout du fichier au suivi
git add calculatrice.py
# Vérification de l'état
git status
# Commit des modifications
git commit -m "feat: Ajouter les fonctions d'addition et multiplication"
# Création d'autres modifications
echo "def soustraction(a, b):
\"\"\"Fonction pour soustraire deux nombres\"\"\"
return a - b" >> calculatrice.py
git add calculatrice.py
git commit -m "feat: Ajouter la fonction de soustraction"
# Vérification de l'historique
git log --oneline
# Affichage de l'historique des commits
git log --oneline -5
# Affichage des différences entre commits
git show HEAD
# Comparaison avec le commit précédent
git diff HEAD~1
# Format personnalisé
git log --pretty=format:"%h %an %ar - %s"
# Annuler le dernier commit (sans perdre les modifications)
git reset --soft HEAD~1
# Annuler le dernier commit (en perdant les modifications)
git reset --hard HEAD~1
# Annuler un commit spécifique (sans affecter les suivants)
git revert COMMIT_HASH
# Exemple de message de commit conventionnel:
# feat: nouvelle fonctionnalité
# fix: correction de bogue
# docs: modifications de documentation
# style: changements cosmétiques
# refactor: refactoring sans changement de fonctionnalité
# test: ajout de tests
# chore: tâches diverses
Les commits sont descriptifs et suivent les conventions pour une meilleure lisibilité de l'historique.
• Messages clairs : Utiliser des verbes à l'impératif
• Commits atomiques : Chaque commit représente une modification logique
• Convention : Utiliser des préfixes comme feat:, fix:, etc.
Problème : Gérer les branches pour un développement parallèle
# Vérification des branches existantes
git branch
# Création d'une nouvelle branche pour une fonctionnalité
git checkout -b feature/division
# Ou en une seule commande (Git 2.23+)
git switch -c feature/division
# Liste des branches
git branch -a # -a pour voir les branches distantes aussi
# Ajout de la fonction division
echo "def division(a, b):
\"\"\"Fonction pour diviser deux nombres\"\"\"
if b == 0:
raise ValueError(\"Division par zéro impossible\")
return a / b" >> calculatrice.py
# Ajout et commit sur la branche feature/division
git add calculatrice.py
git commit -m "feat: Ajouter la fonction de division avec gestion d'erreur"
# Vérification de l'état de la branche
git log --oneline -3
# Retour à la branche principale
git checkout main
# Ou avec la nouvelle syntaxe
git switch main
# Vérification que le fichier n'a pas encore la fonction division
cat calculatrice.py # La fonction division n'est pas présente
# Retour sur la branche de fonctionnalité
git checkout feature/division
cat calculatrice.py # La fonction division est présente
# Création d'une autre branche pour un bug fix
git checkout -b bugfix/correction-nom-fonction
# Correction dans la branche bugfix
sed -i 's/def multiplication/def multiply/g' calculatrice.py
git add calculatrice.py
git commit -m "fix: Renommer multiplication en multiply"
# Fusion de la branche de correction dans main
git checkout main
git merge bugfix/correction-nom-fonction
# Suppression de la branche de correction
git branch -d bugfix/correction-nom-fonction
# Vérification des branches existantes
git branch
Les branches permettent un développement parallèle sans interférence entre les différentes fonctionnalités.
• Nommage clair : Utiliser des noms descriptifs comme feature/nom
• Brassage régulier : git merge main pour intégrer les modifications récentes
• Nettoyage : Supprimer les branches inutiles après fusion
Problème : Fusionner des modifications de différentes branches
# Assurer que la branche principale est à jour
git checkout main
git pull origin main # Si travail collaboratif
# Vérification des branches
git branch -v
# Supposons que nous avons deux branches:
# main avec les commits A-B-C
# feature/division avec les commits D-E
# Basculement sur la branche principale
git checkout main
# Fusion de la branche de fonctionnalité
git merge feature/division
# Vérification de l'historique
git log --graph --oneline --all
# Résultat: main contient maintenant A-B-C-D-E-F
# où F est le commit de fusion
# Supposons un conflit dans calculatrice.py
# Lors de la fusion, Git indique:
# Auto-merging calculatrice.py
# CONFLICT (content): Merge conflict in calculatrice.py
# Contenu du fichier avec conflit:
<<<<<<< HEAD
def multiply(a, b):
return a * b
=======
def multiplication(a, b):
return a * b
>>>>>>> feature/division
# Résolution manuelle:
def multiply(a, b):
return a * b
# Après résolution:
git add calculatrice.py
git commit -m "Resolve merge conflict: Keep multiply function name"
# Option 1: Rebase pour un historique linéaire
git checkout feature/division
git rebase main # Applique les commits de feature après ceux de main
git checkout main
git merge feature/division # Fast-forward possible
# Option 2: Squash pour regrouper les commits
git checkout main
git merge --squash feature/division # Combine tous les commits en un seul
git commit -m "feat: Ajouter la fonction de division"
# Option 3: Suppression de la branche après fusion
git branch -d feature/division
Les modifications de la branche de fonctionnalité ont été intégrées dans la branche principale.
• Mise à jour préalable : git pull avant de fusionner
• Résolution des conflits : Vérifier et tester après résolution
• Choix de la stratégie : merge vs rebase selon le contexte
Problème : Synchroniser le dépôt local avec un serveur distant
# Création d'un dépôt sur GitHub/GitLab
# Copie de l'URL HTTPS ou SSH
# Ajout du dépôt distant
git remote add origin https://github.com/utilisateur/calculatrice.git
# Vérification des dépôts distants
git remote -v
# Résultat:
# origin https://github.com/utilisateur/calculatrice.git (fetch)
# origin https://github.com/utilisateur/calculatrice.git (push)
# Pousser la branche principale vers le serveur
git branch -M main # Renomme la branche par défaut en main
git push -u origin main
# -u pour suivre la branche distante
# Ensuite, git push seul suffira
# Pour pousser une branche spécifique
git push origin feature/division
# Récupération des modifications distantes (sans fusion)
git fetch origin
# Récupération et fusion (équivalent à fetch + merge)
git pull origin main
# Récupération et rebasage (alternative à merge)
git pull --rebase origin main
# Vérification des branches distantes
git branch -r # branches distantes
git branch -a # toutes les branches
# Workflow quotidien
# 1. Récupérer les dernières modifications
git checkout main
git pull origin main
# 2. Créer une nouvelle branche de travail
git checkout -b feature/nouvelle-fonction
# 3. Faire les modifications
# ... développement ...
# 4. Commit des modifications
git add .
git commit -m "feat: Ajouter nouvelle fonctionnalité"
# 5. Pousser la branche vers le serveur
git push origin feature/nouvelle-fonction
# 6. Créer une Pull Request/Merge Request sur GitHub/GitLab
# 7. Après approbation et fusion, revenir sur main
git checkout main
git pull origin main # Récupérer la fusion
# 8. Supprimer la branche locale
git branch -d feature/nouvelle-fonction
Le dépôt local est maintenant synchronisé avec le serveur distant pour le travail collaboratif.
• Pull avant de push : Toujours récupérer les modifications avant de pousser
• Protection des branches : Utiliser des règles pour protéger la branche principale
• Communication : Coordonner les changements avec les autres collaborateurs
- Commits atomiques : Chaque commit représente une modification logique
- Messages clairs : Utiliser des verbes à l'impératif
- Branches sémantiques : Noms descriptifs pour les branches
- Fréquence de commit : Commiter régulièrement sans attendre la perfection
- Workflow défini : Suivre un modèle de développement (Git Flow, etc.)
- Ne jamais pousser directement sur la branche principale sans review
- Toujours vérifier l'état du dépôt avant de commencer à travailler
- Utiliser des branches pour isoler les développements
- Ne pas ajouter de fichiers binaires volumineux au dépôt
- Historique : Git conserve un historique complet de toutes les modifications
- Collaboration : Permet à plusieurs développeurs de travailler simultanément
- Sécurité : Possibilité de revenir à n'importe quelle version du code
- Flexibilité : Branches pour développer sans impacter le code principal