1. C'est quoi Git ?
Imagine que tu travailles sur un document Word. À chaque modification importante, tu fais une copie : rapport_v1.docx, rapport_v2.docx, rapport_final.docx,rapport_final_VRAI.docx… C'est ingérable.
Git résout ce problème. C'est un outil qui enregistre l'historique complet de tes fichiers. Tu peux à tout moment :
- Voir ce qui a changé entre deux versions
- Revenir en arrière si tu casses quelque chose
- Travailler en équipe sans écraser le travail des autres
- Tester une nouvelle fonctionnalité sans toucher au code qui marche
Git est local : il fonctionne sur ton ordinateur, sans connexion internet. Pour partager ton travail, on utilise une plateforme en ligne comme GitHub, GitLab ou Bitbucket.
2. Installer Git
Windows
Télécharge Git for Windows sur git-scm.com. L'installateur inclut Git Bash (un terminal Linux-like sur Windows). Laisse les options par défaut, elles conviennent très bien.
macOS
# Option 1 — via Homebrew (recommandé)
brew install git
# Option 2 — Git est souvent déjà présent
git --versionLinux (Debian/Ubuntu)
sudo apt update && sudo apt install gitVérifier l'installation
git --version
# git version 2.43.03. Configurer Git
Avant tout, dis à Git qui tu es. Ces infos apparaissent dans chaque commit que tu crées. À faire une seule fois après l'installation.
git config --global user.name "Prénom Nom"
git config --global user.email "toi@exemple.com"
# Définir VS Code comme éditeur par défaut (pour les messages de merge, etc.)
git config --global core.editor "code --wait"
# Vérifier la configuration
git config --listLe flag --global signifie que la config s'applique à tous tes projets sur cet ordinateur. Sans ce flag, la config ne s'applique qu'au projet courant.
Configurer les fins de ligne (important sur Windows)
# Windows
git config --global core.autocrlf true
# macOS / Linux
git config --global core.autocrlf inputWindows utilise CRLF pour les fins de ligne, Linux/Mac utilisent LF. Cette option évite des conflits inutiles dans les fichiers.
4. Les concepts clés
Avant de pratiquer, voici les termes essentiels :
C'est ton projet Git. Un dossier avec tout l'historique de tes fichiers. Il contient un sous-dossier caché .git/ qui stocke tout.
Un "instantané" de ton projet à un moment précis. Chaque commit a un identifiant unique (ex: a3f7c12) et un message décrivant le changement. C'est comme sauvegarder une partie dans un jeu vidéo.
La zone de préparation. Avant de créer un commit, tu "stages" (prépares) les fichiers que tu veux inclure. C'est comme mettre des affaires dans un carton avant de le fermer.
Une ligne de développement indépendante. La branche principale s'appelle main (ou master). Tu crées une branche pour tester quelque chose sans risquer de casser le code principal.
La version de ton dépôt hébergée en ligne (sur GitHub par exemple). "origin" est le nom donné par défaut au dépôt distant.
Télécharger une copie complète d'un dépôt distant sur ton ordinateur, avec tout l'historique.
Les 3 zones de Git :
git add──▶git commit──▶git push──▶5. Créer un dépôt
Option A — Partir d'un dossier existant
# Se placer dans le dossier de ton projet
cd mon-projet
# Initialiser Git (crée un dossier caché .git/)
git init
# Voir ce que Git voit
git statusOption B — Créer un nouveau dossier en même temps
git init mon-nouveau-projet
cd mon-nouveau-projetPremier commit
Après git init, Git surveille ton dossier mais n'enregistre encore rien. Tu dois faire ton premier commit :
# Ajouter tous les fichiers à la zone de stage
git add .
# Créer le premier commit
git commit -m "Initial commit"
# Vérifier l'état — doit être "nothing to commit"
git status. dans git add .signifie "tous les fichiers du dossier courant". Tu peux aussi ajouter un fichier précis : git add index.html6. Le fichier .gitignore
Certains fichiers ne doivent jamais être versionnés : mots de passe, dépendances installées, fichiers de build, etc. Le fichier .gitignore liste tout ce que Git doit ignorer.
Crée un fichier .gitignore à la racine de ton projet :
# Dépendances (Node.js)
node_modules/
# Dossiers de build
dist/
build/
.next/
# Variables d'environnement (JAMAIS versionner les mots de passe !)
.env
.env.local
.env.production
# Fichiers système
.DS_Store # macOS
Thumbs.db # Windows
# IDE
.idea/ # IntelliJ / PhpStorm
.vscode/ # VS Code (optionnel)
# Logs
*.log
logs/
# Cache
.cache/
tmp/Commandes utiles liées au .gitignore :
# Vérifier si un fichier est ignoré
git check-ignore -v mon-fichier.env
# Si tu as déjà commité un fichier par erreur, le retirer du suivi
git rm --cached mon-fichier.env
git commit -m "Retirer .env du suivi Git".env. Des identifiants publiés sur GitHub peuvent être exploités en quelques minutes par des bots automatisés.7. Workflow quotidien
Voici le cycle que tu répéteras des centaines de fois. Comprendre ces 4 commandes, c'est déjà maîtriser l'essentiel de Git.
Étape 1 — Voir l'état du dépôt
git status
# Exemple de sortie :
# On branch main
# Changes not staged for commit:
# modified: src/app.js
# Untracked files:
# src/nouveau-fichier.jsModified = fichier déjà suivi, modifié depuis le dernier commit.
Untracked = nouveau fichier que Git ne suit pas encore.
Étape 2 — Voir les modifications en détail
# Voir les lignes modifiées (fichiers non stagés)
git diff
# Voir les lignes modifiées (fichiers déjà stagés)
git diff --stagedÉtape 3 — Stager les fichiers
# Ajouter un fichier précis
git add src/app.js
# Ajouter tous les fichiers modifiés
git add .
# Ajouter interactivement (choisir quelles lignes inclure)
git add -pÉtape 4 — Créer le commit
git commit -m "Ajouter la page de connexion"
# Astuce : stager ET commiter les fichiers déjà suivis en une commande
git commit -am "Corriger le bug d'affichage du menu"- ✅
Ajouter la validation du formulaire de contact - ✅
Corriger le crash au démarrage sur iOS - ❌
fix— trop vague - ❌
wip— ne décrit rien
Commence par un verbe à l'infinitif, sois précis, reste concis.
8. Consulter l'historique
# Liste complète des commits
git log
# Version compacte (une ligne par commit)
git log --oneline
# Avec un graphe des branches
git log --oneline --graph --all
# Les 5 derniers commits
git log -5 --oneline
# Commits d'un fichier précis
git log --oneline -- src/app.js
# Voir ce qui a changé dans un commit précis
git show a3f7c12Chaque commit a un hash (ex: a3f7c12). C'est son identifiant unique. Tu n'as besoin que des 7 premiers caractères pour le référencer.
9. Annuler des erreurs
Git te permet de revenir en arrière à plusieurs niveaux :
Annuler des modifications non stagées
# Restaurer un fichier à son état au dernier commit
git restore src/app.js
# Restaurer tous les fichiers modifiés
git restore .Retirer un fichier du stage (désindexer)
# Tu as fait git add par erreur ? Annule sans perdre les modifs
git restore --staged src/app.jsModifier le dernier commit (non encore poussé)
# Corriger le message du dernier commit
git commit --amend -m "Nouveau message corrigé"
# Ajouter un fichier oublié dans le dernier commit
git add fichier-oublie.js
git commit --amend --no-editAnnuler un commit (de façon sûre)
# Crée un nouveau commit qui annule le commit ciblé
# (n'efface pas l'historique — méthode recommandée)
git revert a3f7c12Revenir à un commit précédent (dangereux)
# ⚠ Efface les commits APRÈS le hash ciblé
# Utilise uniquement si ces commits ne sont PAS encore sur GitHub
git reset --hard a3f7c12git reset --hard est irréversible. Si tu as déjà poussé (push) ces commits sur GitHub, préfère toujours git revert.10. Les branches
Une branche, c'est une copie indépendante de ton code. Tu travailles dessus sans affecter la branche principale (main). C'est la fonctionnalité la plus puissante de Git.
# Voir toutes les branches (étoile = branche courante)
git branch
# Créer une nouvelle branche
git branch ma-fonctionnalite
# Basculer sur une branche existante
git checkout ma-fonctionnalite
# Créer ET basculer en une commande (recommandé)
git checkout -b ma-fonctionnalite
# Syntaxe moderne (Git 2.23+)
git switch -c ma-fonctionnalite
# Voir sur quelle branche on est
git branch --show-current
# Renommer une branche
git branch -m ancien-nom nouveau-nom
# Supprimer une branche locale (fusionnée)
git branch -d ma-fonctionnalite
# Forcer la suppression (non fusionnée)
git branch -D ma-fonctionnalitefeature/page-contact, fix/crash-login, hotfix/xss-formulaire. Le préfixe aide à comprendre l'intention.11. Fusionner (merge)
Quand ta fonctionnalité est prête, tu la ramènes dans main. C'est le merge.
# 1. Retourner sur main
git checkout main
# 2. Récupérer les dernières modifs distantes
git pull origin main
# 3. Fusionner ta branche
git merge ma-fonctionnalite
# 4. Supprimer la branche devenue inutile
git branch -d ma-fonctionnaliteFast-forward vs Merge commit
Si main n'a pas bougé pendant que tu travaillais sur ta branche, Git fait un fast-forward (il déplace juste le pointeur, pas de commit de merge). Sinon, il crée un commit de merge.
# Forcer un commit de merge même si fast-forward possible
# (garde une trace de la branche dans l'historique)
git merge --no-ff ma-fonctionnalite12. Résoudre les conflits
Un conflit survient quand deux branches ont modifié les mêmes lignesd'un fichier. Git ne sait pas quelle version garder et te demande de trancher.
Git marque les zones en conflit ainsi :
<<<<<<< HEAD
// Ton code sur main
const message = "Bonjour";
=======
// Le code de ta branche feature
const message = "Hello";
>>>>>>> ma-fonctionnalitePour résoudre :
- Ouvre le fichier en conflit dans ton éditeur
- Supprime les marqueurs
<<<,===,>>> - Garde la version correcte (ou combine les deux)
- Stage le fichier résolu et commite
# Après avoir édité manuellement le fichier :
git add src/app.js
git commit -m "Résoudre conflit sur src/app.js"
# Annuler le merge en cours (pour repartir de zéro)
git merge --abort13. Dépôt distant (GitHub)
Pour partager ton code, tu dois le pousser sur un dépôt distant. Voici comment relier ton dépôt local à GitHub.
Créer la connexion
# Lier ton dépôt local à GitHub
# (après avoir créé le repo vide sur github.com)
git remote add origin https://github.com/tonuser/ton-repo.git
# Vérifier la connexion
git remote -v
# origin https://github.com/tonuser/ton-repo.git (fetch)
# origin https://github.com/tonuser/ton-repo.git (push)SSH vs HTTPS
# HTTPS — plus simple, demande mot de passe ou token
git remote add origin https://github.com/tonuser/ton-repo.git
# SSH — plus pratique au quotidien, pas de mot de passe
git remote add origin git@github.com:tonuser/ton-repo.git
# Changer l'URL (ex: passer de HTTPS à SSH)
git remote set-url origin git@github.com:tonuser/ton-repo.gitConfigurer une clé SSH (recommandé)
# Générer une clé SSH
ssh-keygen -t ed25519 -C "toi@exemple.com"
# Afficher ta clé publique (à copier sur GitHub)
cat ~/.ssh/id_ed25519.pub
# Tester la connexion
ssh -T git@github.com
# Hi tonuser! You've successfully authenticated.Sur GitHub : Settings → SSH and GPG keys → New SSH key → colle ta clé publique.
14. Cloner un projet
Cloner = télécharger un dépôt existant avec tout son historique.
# Cloner (crée un dossier du même nom que le repo)
git clone https://github.com/tonuser/ton-repo.git
# Cloner dans un dossier avec un nom spécifique
git clone https://github.com/tonuser/ton-repo.git mon-dossier
# Cloner uniquement la branche main (plus rapide sur gros projets)
git clone --single-branch --branch main https://github.com/tonuser/ton-repo.git
# Cloner via SSH
git clone git@github.com:tonuser/ton-repo.git15. Pull & Push
Push — envoyer tes commits
# Premier push (définit la branche distante de référence)
git push -u origin main
# Push suivants (plus court grâce à -u)
git push
# Pousser une branche spécifique
git push origin ma-fonctionnalite
# Supprimer une branche distante
git push origin --delete ma-fonctionnalitePull — récupérer les commits distants
# Récupérer et fusionner les commits distants
git pull
# Équivaut à :
git fetch origin # télécharge les commits
git merge origin/main # les intègre
# Pull avec rebase (historique plus propre)
git pull --rebasegit pull avant de commencer à travailler sur un projet partagé. Ça évite les conflits inutiles.17. Git stash
Tu travailles sur quelque chose, et on te demande de corriger un bug urgent sur une autre branche. Ton travail n'est pas prêt pour un commit. Git stash met de côté tes modifications temporairement.
# Mettre de côté les modifications en cours
git stash
# Voir la liste des stash
git stash list
# stash@{0}: WIP on main: abc1234 Dernier commit
# Récupérer le dernier stash (et le supprimer de la liste)
git stash pop
# Récupérer sans le supprimer
git stash apply
# Récupérer un stash précis
git stash apply stash@{1}
# Donner un nom à un stash
git stash push -m "WIP: nouvelle page contact"
# Supprimer un stash
git stash drop stash@{0}
# Vider tous les stash
git stash clear18. Cheat sheet — les commandes essentielles
| Commande | Description |
|---|---|
| git init | Initialiser un dépôt |
| git clone <url> | Cloner un dépôt distant |
| git status | État des fichiers |
| git add . | Stager tous les fichiers |
| git add <fichier> | Stager un fichier précis |
| git commit -m "msg" | Créer un commit |
| git commit -am "msg" | Stager + commiter (fichiers suivis) |
| git log --oneline | Historique compact |
| git diff | Voir les modifications |
| git restore <fichier> | Annuler les modifs d'un fichier |
| git restore --staged <f> | Désindexer un fichier |
| git branch <nom> | Créer une branche |
| git checkout -b <nom> | Créer + basculer sur une branche |
| git merge <branche> | Fusionner une branche |
| git branch -d <nom> | Supprimer une branche locale |
| git remote add origin <url> | Lier à un dépôt distant |
| git push -u origin main | Pousser (premier push) |
| git push | Pousser les commits |
| git pull | Récupérer + fusionner |
| git fetch | Récupérer sans fusionner |
| git stash | Mettre de côté les modifs |
| git stash pop | Restaurer le dernier stash |
| git tag -a v1.0 -m "msg" | Créer un tag annoté |
| git revert <hash> | Annuler un commit (sûr) |
| git reset --hard <hash> | Revenir à un commit (⚠ danger) |