À la fin de ce module, vous saurez :
- ✅ Créer et initialiser un dépôt Git
- ✅ Utiliser les commandes de base (add, commit, status, log)
- ✅ Créer et gérer des branches
- ✅ Fusionner des branches
- ✅ Résoudre des conflits simples
Format : Théorie + Pratique intensive
Méthode 1 : Nouveau projet
# Créer un dossier pour le projet
mkdir mon-projet-arduino
cd mon-projet-arduino
# Initialiser Git
git init
# Résultat
# Initialized empty Git repository in /path/to/mon-projet-arduino/.git/Méthode 2 : Projet existant
# Aller dans le dossier du projet
cd mon-projet-existant
# Initialiser Git
git initQue se passe-t-il ?
- Création du dossier
.git/(caché) - Ce dossier contient toute la base de données Git
- Le projet est maintenant un dépôt Git
.git/
├── HEAD # Pointeur vers la branche actuelle
├── config # Configuration du dépôt
├── description # Description du projet
├── hooks/ # Scripts automatiques
├── objects/ # Base de données des objets
├── refs/ # Références (branches, tags)
└── index # Zone de staging
.git/
git statusInformations fournies :
- Branche actuelle
- Fichiers modifiés
- Fichiers en staging
- Fichiers non suivis
Exemple de sortie :
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
modified: src/main.cpp
Untracked files:
src/sensor.cpp
no changes added to commit
💡 Conseil : Utilisez git status fréquemment !
Ajouter un fichier spécifique :
git add main.cppAjouter plusieurs fichiers :
git add main.cpp sensor.cpp config.hAjouter tous les fichiers modifiés :
git add .
# ou
git add -AAjouter par extension :
git add *.cpp
git add src/*.hAjouter de manière interactive :
git add -p # Permet de choisir les modifications à ajouterCommit avec message en ligne :
git commit -m "Ajout du support du capteur DHT22"Commit avec éditeur (message détaillé) :
git commit
# Ouvre l'éditeur configuréCommit rapide (add + commit) :
git commit -am "Correction du bug de lecture I2C"
# Fonctionne uniquement pour les fichiers déjà suivisModifier le dernier commit :
git commit --amend
# Permet de modifier le message ou ajouter des fichiers oubliésFormat recommandé :
Type: Résumé court (50 caractères max)
Description détaillée si nécessaire (72 caractères par ligne)
- Point 1
- Point 2
Références: #123
Types courants :
feat:Nouvelle fonctionnalitéfix:Correction de bugdocs:Documentationrefactor:Refactorisationtest:Ajout de testschore:Tâches de maintenance
Exemples :
git commit -m "feat: Ajout du support WiFi pour ESP32"
git commit -m "fix: Correction de la lecture du capteur de température"
git commit -m "docs: Mise à jour du README avec instructions de build"Log basique :
git logLog compact (une ligne par commit) :
git log --onelineLog avec graphe :
git log --oneline --graph --allLog avec statistiques :
git log --statLog d'un fichier spécifique :
git log main.cppLog avec recherche :
git log --grep="capteur"
git log --author="Jean"$ git log --oneline --graph --all
* a3f5b2c (HEAD -> main) feat: Ajout support DHT22
* 7d8e9f1 fix: Correction lecture I2C
* 2c4d6e8 docs: Mise à jour README
* 9a1b3c5 feat: Implémentation communication série
* 5e7f9a2 Initial commitInformations visibles :
- Hash du commit (identifiant unique)
- Branche actuelle (HEAD)
- Message de commit
- Graphe des branches
Objectif : Créer un projet Arduino simple et faire vos premiers commits
# 1. Créer le projet
mkdir projet-led-blink
cd projet-led-blink
git init
# 2. Créer un fichier
echo "# Projet LED Blink" > README.md
# 3. Vérifier le statut
git status
# 4. Ajouter le fichier
git add README.md
# 5. Faire le premier commit
git commit -m "Initial commit: Ajout du README"
# 6. Vérifier l'historique
git logTemps alloué : 10 minutes
Définition : Une branche est une ligne de développement indépendante
Cas d'usage :
- Développer une nouvelle fonctionnalité
- Corriger un bug sans affecter le code stable
- Expérimenter sans risque
- Travailler en parallèle sur plusieurs tâches
Avantages :
- ✅ Isolation du code
- ✅ Travail en parallèle
- ✅ Facilite la collaboration
- ✅ Retour arrière facile
main ●───●───●───●───●───●
\ /
feature ●───●───●
Lister les branches :
git branch
# * main (l'astérisque indique la branche actuelle)Créer une nouvelle branche :
git branch feature-wifiChanger de branche :
git checkout feature-wifi
# Switched to branch 'feature-wifi'Créer et changer de branche (raccourci) :
git checkout -b feature-wifi
# Équivalent à :
# git branch feature-wifi
# git checkout feature-wifiNouvelle syntaxe (Git 2.23+) :
git switch feature-wifi # Changer de branche
git switch -c feature-wifi # Créer et changer# 1. Créer une branche pour une nouvelle fonctionnalité
git checkout -b feature-capteur-temperature
# 2. Faire des modifications
vim src/temperature.cpp
git add src/temperature.cpp
git commit -m "feat: Ajout du capteur de température"
# 3. Faire d'autres commits si nécessaire
vim src/temperature.cpp
git commit -am "fix: Correction de la calibration"
# 4. Retourner sur main
git checkout main
# 5. Fusionner la branche
git merge feature-capteur-temperature
# 6. Supprimer la branche (optionnel)
git branch -d feature-capteur-temperatureLister toutes les branches :
git branch -aVoir les branches avec leur dernier commit :
git branch -vVoir les branches fusionnées :
git branch --mergedVoir les branches non fusionnées :
git branch --no-mergedGraphe visuel :
git log --oneline --graph --all --decorateTypes de fusion :
1. Fast-forward (avance rapide)
main ●───●
\
feature ●───●
Après merge:
main ●───●───●───●
2. Three-way merge (fusion à trois points)
main ●───●───●
\ \
feature ●───●─●
Après merge:
main ●───●───●───●
\ /
feature ●───●
Commande :
git checkout main
git merge feature-capteurSituation de conflit :
- Deux branches modifient la même ligne
- Git ne sait pas quelle version garder
Exemple de conflit :
<<<<<<< HEAD
int temperature = readSensor();
=======
float temperature = getSensorValue();
>>>>>>> feature-capteurMarqueurs de conflit :
<<<<<<< HEAD: Version de la branche actuelle=======: Séparateur>>>>>>> feature-capteur: Version de la branche à fusionner
Étapes :
- Identifier les fichiers en conflit
git status
# Both modified: src/main.cpp- Ouvrir le fichier et choisir la version
// Supprimer les marqueurs et garder le bon code
float temperature = getSensorValue();- Marquer comme résolu
git add src/main.cpp- Finaliser la fusion
git commit -m "Merge feature-capteur: Résolution des conflits"💡 Conseil : Utilisez un outil de merge visuel (VS Code, Meld, KDiff3)
Avant le commit final :
git merge --abort
# Annule la fusion et revient à l'état précédentAprès le commit :
# Revenir au commit précédent
git reset --hard HEAD~1
# Ou créer un commit qui annule la fusion
git revert -m 1 HEADgit reset --hard supprime les modifications non commitées
Supprimer une branche fusionnée :
git branch -d feature-capteur
# Deleted branch feature-capteurForcer la suppression (branche non fusionnée) :
git branch -D feature-experimental
# Deleted branch feature-experimental (was a3f5b2c)Supprimer une branche distante :
git push origin --delete feature-capteur💡 Bonne pratique : Supprimer les branches après fusion pour garder un dépôt propre
Objectif : Créer des branches et les fusionner
# 1. Créer une branche pour une nouvelle fonctionnalité
git checkout -b feature-led-rgb
# 2. Créer un fichier
echo "// Code pour LED RGB" > led_rgb.cpp
git add led_rgb.cpp
git commit -m "feat: Ajout support LED RGB"
# 3. Retourner sur main
git checkout main
# 4. Créer une autre branche
git checkout -b feature-buzzer
echo "// Code pour buzzer" > buzzer.cpp
git add buzzer.cpp
git commit -m "feat: Ajout support buzzer"
# 5. Fusionner les branches
git checkout main
git merge feature-led-rgb
git merge feature-buzzer
# 6. Voir l'historique
git log --oneline --graph --allTemps alloué : 15 minutes
Différences non stagées :
git diffDifférences stagées :
git diff --staged
# ou
git diff --cachedDifférences entre branches :
git diff main feature-capteurDifférences d'un fichier spécifique :
git diff main.cppStatistiques des différences :
git diff --statCréer un .gitignore :
# Fichiers compilés
*.o
*.hex
*.bin
*.elf
# Dossiers de build
build/
.pio/
# Fichiers IDE
.vscode/
.idea/
# Fichiers système
.DS_Store
Thumbs.db
# Fichiers temporaires
*.tmp
*.bak
*~
# Secrets
.env
secrets.hAppliquer le .gitignore :
git add .gitignore
git commit -m "chore: Ajout du .gitignore"Arduino/PlatformIO :
# PlatformIO
.pio/
.pioenvs/
.piolibdeps/
# Arduino
*.hex
*.eep
*.elf
*.map
# Build
build/
*.o
*.aKiCad :
# KiCad
*.bak
*.kicad_pcb-bak
*-save.kicad_pcb
fp-info-cache
*.net
# Gerber
gerber/Ressource : https://github.com/github/gitignore
Annuler les modifications non stagées :
git checkout -- main.cpp
# ou (Git 2.23+)
git restore main.cppRetirer un fichier du staging :
git reset HEAD main.cpp
# ou (Git 2.23+)
git restore --staged main.cppAnnuler le dernier commit (garder les modifications) :
git reset --soft HEAD~1Annuler le dernier commit (supprimer les modifications) :
git reset --hard HEAD~1--hard supprime définitivement les modifications
Voir le dernier commit :
git showVoir un commit spécifique :
git show a3f5b2cVoir un fichier à un commit donné :
git show a3f5b2c:src/main.cppVoir les modifications d'un commit :
git show --stat a3f5b2cRenommer un fichier :
git mv ancien_nom.cpp nouveau_nom.cppSupprimer un fichier :
git rm fichier.cppVoir qui a modifié chaque ligne :
git blame main.cppRechercher dans l'historique :
git log -S "fonction_recherchee"Nettoyer les fichiers non suivis :
git clean -n # Voir ce qui serait supprimé
git clean -f # Supprimer réellementCréer des alias :
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all"Utilisation :
git st # au lieu de git status
git co main # au lieu de git checkout main
git lg # log formatéAlias complexes :
git config --global alias.last "log -1 HEAD"
git config --global alias.unstage "reset HEAD --"Objectif : Créer un projet Arduino avec branches et .gitignore
# 1. Créer le projet
mkdir projet-station-meteo
cd projet-station-meteo
git init
# 2. Créer le .gitignore
cat > .gitignore << EOF
*.hex
*.elf
build/
.pio/
EOF
# 3. Créer le fichier principal
cat > main.ino << EOF
void setup() {
Serial.begin(9600);
}
void loop() {
// TODO
}
EOF
# 4. Premier commit
git add .
git commit -m "Initial commit: Structure du projet"
# 5. Créer une branche pour le capteur
git checkout -b feature-dht22
# Ajouter du code...
git commit -am "feat: Ajout capteur DHT22"
# 6. Fusionner
git checkout main
git merge feature-dht22Temps alloué : 15 minutes
Commits :
- ✅ Faire des commits atomiques (une fonctionnalité = un commit)
- ✅ Écrire des messages descriptifs
- ✅ Commiter régulièrement
- ❌ Ne pas commiter de code non fonctionnel sur main
Branches :
- ✅ Utiliser des noms descriptifs (
feature/wifi,bugfix/i2c) - ✅ Créer une branche par fonctionnalité
- ✅ Fusionner régulièrement
- ❌ Ne pas garder des branches trop longtemps
Général :
- ✅ Utiliser .gitignore dès le début
- ✅ Vérifier avec
git statusavant de commiter - ✅ Tester avant de fusionner
- ❌ Ne jamais commiter de secrets (mots de passe, clés API)
✅ Commandes de base
git init,git add,git commitgit status,git log,git diff
✅ Gestion des branches
- Créer, changer, fusionner des branches
- Résoudre des conflits
- Supprimer des branches
✅ Outils pratiques
- .gitignore
- Alias
- Annulation de modifications
✅ Bonnes pratiques
- Messages de commit
- Organisation des branches
- Workflow efficace
Points à clarifier ?
- Commandes pas claires ?
- Problèmes rencontrés dans les exercices ?
- Cas d'usage spécifiques ?
Prochaine étape : Module 3 - Collaboration avec GitHub
Avant de continuer :
- Assurez-vous d'avoir un dépôt Git fonctionnel
- Testez les commandes apprises
- Préparez vos questions
Rendez-vous dans 10 minutes pour le Module 3 !
- Slides 1-10 : Commandes de base (20 min)
- Slides 11-20 : Branches et fusion (25 min)
- Slides 21-28 : Commandes avancées (15 min)
- Vérifier que tous suivent les exercices
- Montrer les commandes en live
- Encourager la pratique
- Aider à résoudre les conflits
- Créer un conflit volontaire pour pratiquer la résolution
- Utiliser git log avec différentes options
- Expérimenter avec les branches
- Cheat sheet Git à distribuer
- Exemples de projets Arduino