← Retour au portail

Fiche 3 - Git — Maîtrise avancée

Approfondir Git : rebase interactif, hooks, sous-modules, gestion avancée des conflits, reflog, bisect, et bonnes pratiques pour un workflow professionnel.

Avancé — SISR 2ème année / DevOps ⏱️ 30 min 📁 Autres

🎯 Objectifs de la fiche

  1. Réécriture de l'historique — Rebase interactif, squash, amend, reset
  2. Gestion avancée des conflits — Merge, rebase, résolution avec outils
  3. Git hooks — Automatisation avant/après commit, push
  4. Sous-modules (submodules) — Intégrer des dépôts externes
  5. Recherche et débogage — Bisect, blame, reflog
  6. 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.

ActionDescription
pickGarder le commit tel quel
rewordModifier le message du commit
editModifier le contenu du commit
squashFusionner avec le commit précédent
fixupFusionner sans garder le message
dropSupprimer 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
⛔ Le rebase interactif est puissant mais dangereux : ne l'utilisez JAMAIS sur des commits déjà poussés sur un dépôt partagé, sous peine de casser l'historique pour les autres.

2. Amend (modifier le dernier commit)

CommandeEffet
git commit --amend -m 'Nouveau message'Modifie le message du dernier commit
git add fichier_oublie ; git commit --amend --no-editAjoute 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.

CommandeAction
git statusListe les fichiers en conflit
git mergetoolLance un outil graphique de résolution (meld, kdiff3, etc.)
git merge --abortAnnule le merge et revient à l'état initial
git rebase --abortAnnule le rebase en cours
git diff --name-only --diff-filter=UListe 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
💡 Les hooks sont locaux. Pour une équipe, utilisez un outil comme pre-commit (framework Python) pour gérer des hooks partagés.

5. Sous-modules (submodules)

CommandeEffet
git submodule add <url> <dossier>Ajoute un sous-module
git clone --recurse-submodules <url>Clone un projet avec ses sous-modules
git submodule update --remoteMet à jour tous les sous-modules
git submodule statusAffiche l'état des sous-modules
⚠️ Les sous-modules ajoutent de la complexité. Préférez les gestionnaires de dépendances (npm, pip, etc.) quand c'est possible.

6. Recherche et débogage avancés

CommandeUtilité
git bisect startRecherche 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 reflogAffiche 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

WorkflowDescriptionCas d'usage
Git FlowBranches principales (main, develop) + branches de fonctionnalité, release, hotfix.Projets avec cycles de release longs.
GitHub FlowBranche main + branches de fonctionnalité → Pull Requests → mergeProjets web, déploiement continu.
Trunk-basedTous les développeurs travaillent sur main, commits fréquents.Équipes agiles, CI/CD intense.
💡 Pour la majorité des projets scolaires, le GitHub Flow (une branche principale + branches de fonctionnalité avec PR) est largement suffisant.
Quelle commande permet de fusionner les 3 derniers commits en un seul ?
  • git merge --squash
  • git rebase -i HEAD~3 avec squash
  • git commit --amend
  • git reset --soft HEAD~3 puis git commit

✅ Réponse : git rebase -i HEAD~3 avec squash

Quelle est la règle d'or du rebase ?
  • Toujours rebaser avant chaque push
  • Ne jamais rebaser une branche partagée
  • Rebaser toutes les branches avant de merger
  • Rebaser n'est jamais recommandé

✅ Réponse : Ne jamais rebaser une branche partagée

Quelle commande permet de retrouver un commit apparemment perdu ?
  • git log
  • git reflog
  • git reset
  • git cherry-pick

✅ Réponse : git reflog

À quoi sert un hook pre-commit ?
  • À exécuter des tests avant de pousser
  • À vérifier des règles avant de créer un commit
  • À modifier le message de commit
  • À fusionner automatiquement

✅ 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 ?
  • git clone
  • git submodule add
  • git remote add
  • git fetch

✅ Réponse : git submodule add

🎯 Passer l'évaluation de cette fiche