Approfondir Git : rebase interactif, hooks, sous-modules, gestion avancée des conflits, reflog, bisect, et bonnes pratiques pour un workflow professionnel.
Maîtriser les bases de Git (init, add, commit, branch, merge, push, pull). Avoir déjà utilisé GitHub ou GitLab.
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
| 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 |
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)
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
| 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 |
| 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
| 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. |
✅ Réponse : git rebase -i HEAD~3 avec squash
✅ Réponse : Ne jamais rebaser une branche partagée
✅ Réponse : git reflog
✅ Réponse : À vérifier des règles avant de créer un commit
✅ Réponse : git submodule add