Sommaire
Approfondir Git : rebase interactif, hooks, sous-modules, gestion avancée des conflits, reflog, bisect, et bonnes pratiques pour un workflow professionnel.
🎯 Objectifs de la fiche
- Réécriture de l'historique — Rebase interactif, squash, amend, reset
- Gestion avancée des conflits — Merge, rebase, résolution avec outils
- Git hooks — Automatisation avant/après commit, push
- Sous-modules (submodules) — Intégrer des dépôts externes
- Recherche et débogage — Bisect, blame, reflog
- Bonnes pratiques et workflows — GitFlow, GitHub Flow, trunk-based
Prérequis
Maîtriser les bases de Git (init, add, commit, branch, merge, push, pull). Avoir déjà utilisé GitHub ou GitLab.
1. Réécriture de l'historique (rebase interactif)
Le rebase interactif (git rebase -i) permet de réorganiser, fusionner, modifier ou supprimer des commits avant de les intégrer à une branche principale.
| Action | Description |
|---|---|
| pick | Garder le commit tel quel |
| reword | Modifier le message du commit |
| edit | Modifier le contenu du commit |
| squash | Fusionner avec le commit précédent |
| fixup | Fusionner sans garder le message |
| drop | Supprimer le commit |
# Rebaser les 3 derniers commits git rebase -i HEAD~3 # Exemple : fusionner les 2 derniers commits pick abc1234 Ajout fonctionnalité A squash def5678 Correction mineure # → un seul commit avec le message du premier
2. Amend (modifier le dernier commit)
| Commande | Effet |
|---|---|
| git commit --amend -m 'Nouveau message' | Modifie le message du dernier commit |
| git add fichier_oublie ; git commit --amend --no-edit | Ajoute des fichiers oubliés au dernier commit |
3. Gestion avancée des conflits
Les conflits surviennent lorsque deux branches modifient les mêmes lignes d'un fichier.
| Commande | Action |
|---|---|
| git status | Liste les fichiers en conflit |
| git mergetool | Lance un outil graphique de résolution (meld, kdiff3, etc.) |
| git merge --abort | Annule le merge et revient à l'état initial |
| git rebase --abort | Annule le rebase en cours |
| git diff --name-only --diff-filter=U | Liste uniquement les fichiers en conflit |
# Résolution manuelle : # Éditer les fichiers (chercher les marqueurs <<<<<<<, =======, >>>>>>>) # Après résolution : git add . git commit # (ou git rebase --continue)
4. Git hooks (automatisation)
Les hooks sont des scripts exécutés automatiquement à certaines étapes (pre-commit, post-commit, pre-push, etc.). Ils sont stockés dans .git/hooks/.
# Exemple de hook pre-commit (vérifier les espaces) # Dans .git/hooks/pre-commit (rendre exécutable) #!/bin/bash if git diff --cached --check; then exit 0 else echo "Espaces en fin de ligne détectés. Corrigez-les." exit 1 fi # Pour partager les hooks avec l'équipe : # - Créer un dossier .githooks/ dans le dépôt # - Configurer git : git config core.hooksPath .githooks
5. Sous-modules (submodules)
| Commande | Effet |
|---|---|
| git submodule add <url> <dossier> | Ajoute un sous-module |
| git clone --recurse-submodules <url> | Clone un projet avec ses sous-modules |
| git submodule update --remote | Met à jour tous les sous-modules |
| git submodule status | Affiche l'état des sous-modules |
6. Recherche et débogage avancés
| Commande | Utilité |
|---|---|
| git bisect start | Recherche binaire du commit qui a introduit un bug |
| git bisect good <hash> | Marque un commit comme bon |
| git bisect bad <hash> | Marque un commit comme mauvais |
| git blame <fichier> | Affiche l'auteur et le commit de chaque ligne |
| git reflog | Affiche l'historique des déplacements de HEAD (permet de retrouver des commits perdus) |
| git cherry-pick <hash> | Applique un commit spécifique sur la branche courante |
# Exemple de bisect git bisect start git bisect bad HEAD # commit actuel est buggé git bisect good abc1234 # commit connu comme bon # Git propose un commit intermédiaire → tester # Répéter jusqu'à trouver le commit fautif
7. Workflows professionnels
| Workflow | Description | Cas d'usage |
|---|---|---|
| Git Flow | Branches principales (main, develop) + branches de fonctionnalité, release, hotfix. | Projets avec cycles de release longs. |
| GitHub Flow | Branche main + branches de fonctionnalité → Pull Requests → merge | Projets web, déploiement continu. |
| Trunk-based | Tous les développeurs travaillent sur main, commits fréquents. | Équipes agiles, CI/CD intense. |
Quelle commande permet de fusionner les 3 derniers commits en un seul ?
✅ Réponse : git rebase -i HEAD~3 avec squash
Quelle est la règle d'or du rebase ?
✅ Réponse : Ne jamais rebaser une branche partagée
Quelle commande permet de retrouver un commit apparemment perdu ?
✅ Réponse : git reflog
À quoi sert un hook pre-commit ?
✅ Réponse : À vérifier des règles avant de créer un commit
Quelle commande intègre un dépôt externe dans votre projet ?
✅ Réponse : git submodule add