Git
Navigation

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.

En résumé : Git = l'outil installé sur ton PC. GitHub = le site web qui héberge ton code en ligne. Les deux sont différents !

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 --version

Linux (Debian/Ubuntu)

sudo apt update && sudo apt install git

Vérifier l'installation

git --version
# git version 2.43.0

3. 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 --list

Le 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 input

Windows 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 :

Repository (dépôt)

C'est ton projet Git. Un dossier avec tout l'historique de tes fichiers. Il contient un sous-dossier caché .git/ qui stocke tout.

Commit

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.

Stage / Index

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.

Branch (branche)

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.

Remote (origine)

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.

Clone

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 :

Working directory
Tes fichiers
──git add──▶
Stage (Index)
Prêts à commit
──git commit──▶
Repository
Historique Git
──git push──▶
Remote
GitHub

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 status

Option B — Créer un nouveau dossier en même temps

git init mon-nouveau-projet
cd mon-nouveau-projet

Premier 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
💡 Conseil : Le point . dans git add .signifie "tous les fichiers du dossier courant". Tu peux aussi ajouter un fichier précis : git add index.html

6. 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"
🔒 Sécurité : N'oublie jamais d'ignorer tes fichiers .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.js

Modified = 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"
💡 Bons messages de commit :
  • 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 a3f7c12

Chaque 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.js

Modifier 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-edit

Annuler 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 a3f7c12

Revenir à 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 a3f7c12
⚠ Attention : git 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.

main: A ── B ── C ──────────────── F (merge)
feature: └── D ── E ──┘
# 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-fonctionnalite
💡 Bonne pratique : nomme tes branches de façon explicite. Ex: feature/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-fonctionnalite

Fast-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-fonctionnalite

12. 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-fonctionnalite

Pour résoudre :

  1. Ouvre le fichier en conflit dans ton éditeur
  2. Supprime les marqueurs <<<, ===, >>>
  3. Garde la version correcte (ou combine les deux)
  4. 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 --abort
💡 Astuce : VS Code et la plupart des éditeurs modernes affichent les conflits avec une interface graphique (boutons "Accept Current", "Accept Incoming", etc.) bien plus pratique que l'édition manuelle.

13. 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.git

Configurer 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.git

15. 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-fonctionnalite

Pull — 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 --rebase
💡 Bonne habitude : toujours faire git pull avant de commencer à travailler sur un projet partagé. Ça évite les conflits inutiles.

16. Les tags (versions)

Les tags marquent des points importants dans l'historique, généralement des versions livrées (v1.0.0, v2.3.1…).

# Créer un tag annoté (recommandé pour les releases)
git tag -a v1.0.0 -m "Version 1.0.0 — première mise en ligne"

# Créer un tag léger (simple pointeur)
git tag v1.0.0

# Lister les tags
git tag

# Voir les détails d'un tag
git show v1.0.0

# Pousser les tags sur GitHub
git push origin v1.0.0        # un seul tag
git push origin --tags        # tous les tags

# Supprimer un tag local
git tag -d v1.0.0

# Supprimer un tag distant
git push origin --delete v1.0.0

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 clear

18. Cheat sheet — les commandes essentielles

CommandeDescription
git initInitialiser 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 --onelineHistorique compact
git diffVoir 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 mainPousser (premier push)
git pushPousser les commits
git pullRécupérer + fusionner
git fetchRécupérer sans fusionner
git stashMettre de côté les modifs
git stash popRestaurer 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)