Git - Système de contrôle de version
Vue d’ensemble§
Git est un système de contrôle de version distribué (DVCS) créé par Linus Torvalds en 2005 pour gérer le développement du noyau Linux.
Avantages :
- Décentralisé : chaque développeur a une copie complète de l’historique
- Rapide et efficace
- Branches légères
- Intégrité des données (SHA-1)
- Open source et gratuit
Configuration initiale§
Configuration de base§
# Identité (obligatoire)
git config --global user.name "Votre Nom"
git config --global user.email "[email protected]"
# Éditeur par défaut
git config --global core.editor "vim"
git config --global core.editor "code --wait" # VS Code
# Couleurs
git config --global color.ui auto
# Voir toute la configuration
git config --list
git config --global --list
# Voir un paramètre spécifique
git config user.name
Niveaux de configuration§
- System (
/etc/gitconfig) :--system - Global (
~/.gitconfig) :--global - Local (
.git/configdu dépôt) :--local(par défaut)
La configuration locale surcharge la globale qui surcharge la système.
Commandes de base§
Créer un dépôt§
# Nouveau dépôt local
git init
git init mon-projet
# Cloner un dépôt existant
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git nouveau-nom
git clone --depth 1 https://github.com/user/repo.git # Clone superficiel (shallow)
Workflow de base§
# Voir le statut
git status
git status -s # Version courte
# Ajouter des fichiers à l'index (staging area)
git add fichier.txt
git add *.js
git add . # Tout ajouter
git add -p # Ajouter par morceaux (interactif)
# Créer un commit
git commit -m "Message de commit"
git commit -am "Message" # add + commit (fichiers suivis uniquement)
git commit --amend # Modifier le dernier commit
# Voir l'historique
git log
git log --oneline
git log --graph --oneline --all
git log --since="2 weeks ago"
git log --author="Nom"
git log -- fichier.txt # Historique d'un fichier
git log -p # Avec les diff
git log -3 # 3 derniers commits
# Voir les différences
git diff # Working dir vs staging
git diff --staged # Staging vs dernier commit
git diff HEAD # Working dir vs dernier commit
git diff branche1..branche2
Annuler des modifications§
# Annuler les modifications (working directory)
git restore fichier.txt
git checkout -- fichier.txt # Ancienne syntaxe
# Retirer de la staging area
git restore --staged fichier.txt
git reset HEAD fichier.txt # Ancienne syntaxe
# Annuler un commit (3 méthodes)
git reset --soft HEAD~1 # Garde les changements en staging
git reset --mixed HEAD~1 # Garde les changements (défaut)
git reset --hard HEAD~1 # DANGER : Supprime tout
# Créer un commit qui annule un autre
git revert <commit-hash>
git revert HEAD # Annuler le dernier commit
Branches§
Gestion des branches§
# Lister les branches
git branch # Locales
git branch -a # Toutes (locales + distantes)
git branch -r # Distantes uniquement
# Créer une branche
git branch nouvelle-branche
git branch nouvelle-branche <commit> # À partir d'un commit
# Changer de branche
git checkout branche
git switch branche # Nouvelle syntaxe
# Créer et changer de branche
git checkout -b nouvelle-branche
git switch -c nouvelle-branche # Nouvelle syntaxe
# Renommer une branche
git branch -m ancien-nom nouveau-nom
git branch -m nouveau-nom # Branche actuelle
# Supprimer une branche
git branch -d branche # Sécurisé (refuse si non fusionnée)
git branch -D branche # Force
Fusion (merge)§
# Fusionner une branche dans la branche actuelle
git merge branche-source
# Types de merge
git merge --ff branche # Fast-forward (défaut si possible)
git merge --no-ff branche # Force un commit de merge
git merge --squash branche # Écrase tous les commits en un seul
# En cas de conflit
# 1. Résoudre manuellement les conflits dans les fichiers
# 2. Marquer comme résolu
git add fichier-resolu.txt
# 3. Finaliser le merge
git commit
Rebase§
# Rebaser la branche actuelle sur une autre
git rebase main
git rebase --onto nouvelle-base ancienne-base branche
# Rebase interactif (modifier l'historique)
git rebase -i HEAD~3 # 3 derniers commits
# Options du rebase interactif :
# pick : garder le commit
# reword : modifier le message
# edit : modifier le commit
# squash : fusionner avec le précédent
# fixup : comme squash mais jette le message
# drop : supprimer le commit
# En cas de conflit
git rebase --continue # Après résolution
git rebase --skip # Ignorer ce commit
git rebase --abort # Annuler le rebase
Règle d’or : Ne jamais rebaser des commits déjà pushés sur une branche publique !
Travail avec des dépôts distants§
Gestion des remotes§
# Lister les remotes
git remote
git remote -v # Avec les URLs
# Ajouter un remote
git remote add origin https://github.com/user/repo.git
git remote add upstream https://github.com/original/repo.git
# Modifier un remote
git remote set-url origin https://github.com/user/nouveau-repo.git
# Supprimer un remote
git remote remove origin
# Voir les détails d'un remote
git remote show origin
Push et Pull§
# Push (envoyer vers le remote)
git push origin main
git push -u origin main # Set upstream (première fois)
git push # Si upstream configuré
git push --all # Toutes les branches
git push --tags # Tous les tags
git push --force # DANGER : Force le push (écrase l'historique distant)
git push --force-with-lease # Plus sûr : vérifie avant de forcer
# Pull (récupérer + fusionner)
git pull origin main
git pull # Si upstream configuré
git pull --rebase # Rebase au lieu de merge
# Fetch (récupérer sans fusionner)
git fetch origin
git fetch --all # Tous les remotes
git fetch --prune # Nettoie les références obsolètes
Synchronisation avec upstream§
# Workflow fork/upstream classique
git remote add upstream https://github.com/original/repo.git
git fetch upstream
git checkout main
git merge upstream/main
# ou
git rebase upstream/main
git push origin main
Tags§
# Lister les tags
git tag
git tag -l "v1.*" # Filtre
# Créer un tag léger
git tag v1.0.0
# Créer un tag annoté (recommandé)
git tag -a v1.0.0 -m "Version 1.0.0"
# Tagger un commit spécifique
git tag -a v0.9.0 <commit-hash> -m "Version 0.9.0"
# Voir les détails d'un tag
git show v1.0.0
# Supprimer un tag
git tag -d v1.0.0 # Local
git push origin --delete v1.0.0 # Distant
# Push des tags
git push origin v1.0.0 # Un tag spécifique
git push origin --tags # Tous les tags
Stash (remiser)§
# Mettre de côté les modifications
git stash
git stash save "Message descriptif"
git stash -u # Inclure les fichiers non suivis
# Lister les stash
git stash list
# Appliquer un stash
git stash apply # Le plus récent
git stash apply stash@{2} # Stash spécifique
git stash pop # Apply + drop
# Supprimer un stash
git stash drop stash@{0}
git stash clear # Tous les stash
# Créer une branche depuis un stash
git stash branch nouvelle-branche
Recherche et navigation§
Git grep§
# Rechercher dans le code
git grep "fonction"
git grep -n "fonction" # Avec numéros de ligne
git grep -c "fonction" # Compte les occurrences
git grep "fonction" -- "*.js" # Dans les fichiers .js
Git blame§
# Voir qui a modifié chaque ligne
git blame fichier.txt
git blame -L 10,20 fichier.txt # Lignes 10 à 20
git blame -e fichier.txt # Montrer les emails
Git bisect§
# Trouver le commit qui a introduit un bug (recherche binaire)
git bisect start
git bisect bad # Le commit actuel est mauvais
git bisect good v1.0.0 # Ce commit était bon
# Git checkout des commits, vous testez et marquez :
git bisect good # ou
git bisect bad
# À la fin :
git bisect reset
.gitignore§
Syntaxe§
# Commentaire
# Fichier spécifique
config.local.json
# Extension
*.log
*.tmp
# Dossier
node_modules/
build/
# Tous les .txt sauf important.txt
*.txt
!important.txt
# Tous les .pdf dans doc/ et sous-dossiers
doc/**/*.pdf
# Négation
!important/
Templates utiles§
# Node.js
node_modules/
npm-debug.log
.env
# Python
__pycache__/
*.py[cod]
venv/
.pytest_cache/
# Java
*.class
target/
# IDEs
.vscode/
.idea/
*.swp
# OS
.DS_Store
Thumbs.db
Ignorer après commit§
# Fichier déjà commité qu'on veut ignorer
git rm --cached fichier.txt
git rm --cached -r dossier/
# Puis ajouter à .gitignore et commit
Workflow avancés§
Git Flow§
Branches principales :
- main : Production
- develop : Développement
Branches de support :
- feature/* : Nouvelles fonctionnalités
- release/* : Préparation release
- hotfix/* : Corrections urgentes
# Feature
git checkout -b feature/nouvelle-fonction develop
# ... travail ...
git checkout develop
git merge --no-ff feature/nouvelle-fonction
git branch -d feature/nouvelle-fonction
git push origin develop
# Release
git checkout -b release/1.2.0 develop
# ... préparation (version, changelog) ...
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Version 1.2.0"
git checkout develop
git merge --no-ff release/1.2.0
git branch -d release/1.2.0
# Hotfix
git checkout -b hotfix/1.2.1 main
# ... fix ...
git checkout main
git merge --no-ff hotfix/1.2.1
git tag -a v1.2.1 -m "Hotfix 1.2.1"
git checkout develop
git merge --no-ff hotfix/1.2.1
git branch -d hotfix/1.2.1
GitHub Flow (simplifié)§
- Tout part de
main - Créer une branche descriptive :
fix/bug-login - Commit réguliers
- Ouvrir une Pull Request
- Discussion et review
- Merge dans
main - Deploy immédiat
Trunk-Based Development§
- Une seule branche principale (
mainoutrunk) - Feature flags pour les fonctionnalités en cours
- CI/CD très forte
- Commits fréquents
Commandes utiles§
Alias§
# Créer des alias
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.lg "log --graph --oneline --all"
# Utilisation
git co main
git lg
Cherry-pick§
# Appliquer un commit spécifique sur la branche actuelle
git cherry-pick <commit-hash>
git cherry-pick <hash1> <hash2>
git cherry-pick <hash1>..<hash3> # Range
Reflog§
# Historique de toutes les références (y compris les commits "perdus")
git reflog
git reflog show HEAD
git reflog show branche
# Récupérer un commit perdu
git reflog # Trouver le SHA
git checkout <commit-hash>
git branch branche-recuperee # Créer une branche
Clean§
# Supprimer les fichiers non suivis
git clean -n # Dry run (voir ce qui serait supprimé)
git clean -f # Force
git clean -fd # Fichiers et dossiers
git clean -fx # Inclure les ignorés
Submodules§
# Ajouter un submodule
git submodule add https://github.com/user/lib.git lib/
# Cloner un repo avec submodules
git clone --recurse-submodules https://github.com/user/repo.git
# Mettre à jour les submodules
git submodule update --init --recursive
git submodule update --remote
# Supprimer un submodule
git submodule deinit lib/
git rm lib/
Astuces et bonnes pratiques§
Messages de commit§
Format conventionnel :
type(scope): sujet
Corps du message (optionnel)
Footer (optionnel)
Types :
feat: Nouvelle fonctionnalitéfix: Correction de bugdocs: Documentationstyle: Formatage (pas de changement de code)refactor: Refactoringtest: Ajout/modification de testschore: Maintenance (build, dépendances)
Exemples :
feat(auth): add password reset functionality
fix(api): correct user validation logic
docs: update installation instructions
Commits atomiques§
- Un commit = une modification logique
- Facilite la revue de code
- Facilite les reverts
- Meilleur historique
Branches§
- Noms descriptifs :
feature/user-login,fix/header-bug - Branches courtes (merge rapidement)
- Supprimer les branches mergées
Pull/Rebase§
# Garder un historique propre
git config --global pull.rebase true
# Ou explicitement
git pull --rebase
Vérifier avant de push§
git log origin/main..HEAD # Commits à push
git diff origin/main..HEAD # Différences à push
Dépannage§
Annuler un push§
# SI personne n'a pull
git push --force-with-lease
# SI quelqu'un a pull : créer un revert
git revert <commit-hash>
git push
Récupérer un fichier supprimé§
# Fichier supprimé mais pas commité
git restore fichier.txt
# Fichier supprimé et commité
git log -- fichier.txt # Trouver le commit avant suppression
git checkout <commit>^ -- fichier.txt
Changer l’auteur du dernier commit§
git commit --amend --author="Nom <[email protected]>"
Résoudre les conflits de merge§
# 1. Voir les fichiers en conflit
git status
# 2. Éditer les fichiers (chercher <<<<<<<, =======, >>>>>>>)
# 3. Marquer comme résolu
git add fichier-resolu.txt
# 4. Finaliser
git commit
# ou si en cours de rebase
git rebase --continue
Outils et ressources§
Interfaces graphiques§
- GitKraken : Multi-plateforme, puissant
- SourceTree : Gratuit, Windows/Mac
- GitHub Desktop : Simple, intégré GitHub
- Git GUI : Livré avec Git
- Gitk : Visualiseur d’historique livré avec Git
Extensions VSCode§
- GitLens
- Git Graph
- Git History
Hosting§
- GitHub : Le plus populaire
- GitLab : CI/CD intégré
- Bitbucket : Intégration Atlassian
- Gitea : Auto-hébergé léger
Astuce : Télécharger un dossier d’un repo (SVN)§
Prérequis§
- Package
subversionsur votre distribution
Méthode§
-
Remplacer
tree/masterpartrunkdans l’URL :https://github.com/exemple/exemple/tree/master/test➜https://github.com/exemple/exemple/trunk/test -
Télécharger avec
svn checkout:
svn checkout https://github.com/exemple/exemple/trunk/test
Commandes de référence rapide§
# Configuration
git config --global user.name "Nom"
git config --global user.email "[email protected]"
# Initialisation
git init
git clone <url>
# Changements
git status
git add <fichier>
git commit -m "message"
git diff
# Branches
git branch
git branch <branche>
git checkout <branche>
git merge <branche>
# Remote
git remote add origin <url>
git push -u origin main
git pull
git fetch
# Historique
git log
git log --oneline --graph
git reflog
# Annuler
git restore <fichier>
git reset --soft HEAD~1
git revert <commit>
# Stash
git stash
git stash pop—The Gardener