Accueil > Formations > DevOps, Automation & SRE > CI/CD & Usine Logicielle > Git Avancé : Internals, réécriture d’historique et dépôts complexes
Formation Git Avancé : Internals, réécriture d’historique et dépôts complexes
Allez sous le capot de Git pour maîtriser les scénarios que le quotidien ne suffit pas à enseigner : réécriture d'historique, conflits récurrents, gros dépôts et dépendances inter-projets.
Vue d'ensemble
- Maîtrise des commandes Git du quotidien : `add`, `commit`, `push`, `pull`, `fetch`, `stash`, `cherry-pick`
- Pratique régulière du travail en branches : création, switch, merge, rebase interactif (squash/fixup), résolution de conflits
- Expérience du travail collaboratif distant : pull/merge request, revue de code, workflow d'équipe
- Avoir suivi la formation Sparks Git de niveau 1 ou disposer d'une expérience Git équivalente en production
Objectifs pédagogiques
Programme détaillé
Modèle objet et internals de Git
– Anatomie du dossier `.git` : objects, refs, HEAD, index, packfiles — où vit réellement le code
– Les quatre objets de Git : blob, tree, commit, tag — au-delà du survol, lecture brute avec les commandes de plomberie
– Commandes plumbing vs porcelain : `cat-file`, `hash-object`, `ls-tree`, `rev-parse` — diagnostiquer sans magie
– Refs et refspecs : branches locales, branches de suivi, tags, refs distantes — lecture et manipulation fine
– Packfiles et garbage collection : `gc`, `prune`, `fsck` — entretenir un dépôt et comprendre la compression
– Reachability et orphan commits : ce que Git « voit » et ce qu’il efface — fondement de la récupération d’historique
– Reconstitution manuelle d’un commit à partir de blobs et trees avec les commandes plumbing
– Manipulation d’un refspec personnalisé pour ne récupérer qu’un sous-ensemble de branches distantes
– Diagnostic d’un dépôt corrompu et exécution d’un `gc` agressif
Réécriture et maintenance avancée de l'historique
– reflog` en profondeur : journal local de toutes les manipulations de refs — le filet de sécurité du quotidien
– Récupération d’une branche supprimée ou d’un commit perdu : reconstruction via le reflog et les commits orphelins
– `rebase –autosquash` et `commit –fixup` : workflow propre pour rectifier au fil de l’eau sans rebase manuel
– `rebase –onto` : déplacer une série de commits d’une base à une autre — cas du backport ou du rebranchage
– `git filter-repo` : outil moderne de réécriture d’historique en profondeur (purge de fichier, scission de dépôt, refonte d’identités) — positionné comme remplaçant de `filter-branch` (mention historique uniquement)
– `git bisect` : recherche dichotomique d’une régression dans un historique long — automatisable avec `bisect run`
– Range-diff et `cherry-pick -x` : comparer deux séries de commits, tracer l’origine d’un cherry-pick
– Récupération d’une branche supprimée par erreur via le reflog
– Purge définitive d’un fichier de configuration contenant un secret commit accidentellement, sur tout l’historique
– Chasse automatisée à une régression avec `git bisect run` couplé à un script de test
– Scission d’un sous-dossier d’un dépôt en un dépôt indépendant avec `git filter-repo`
Conflits complexes et stratégies de fusion
– Anatomie d’une fusion : fast-forward, three-way merge, base commune — mécanique sous les marqueurs de conflit
– Stratégies de merge : `recursive`, `ort` (par défaut depuis Git 2.34), `ours`, `theirs` — quand utiliser laquelle
– Options de stratégie : `-X ignore-space-change`, `-X patience`, `-X diff-algorithm` — désamorcer les conflits artificiels
– `git rerere` (reuse recorded resolution) : enregistrer une résolution de conflit pour la rejouer automatiquement lors d’un rebase ou d’une re-fusion
– Annulation propre d’un merge déjà poussé : `revert -m`, ré-application ultérieure et pièges associés
– Diagnostic d’un conflit : `git log –merge`, `git diff –base`, outils de mergetool — comprendre l’origine du désaccord
– Résolution d’un conflit récurrent sur une branche longue avec activation de `rerere`
– Comparaison des résultats d’un même merge avec stratégies et options différentes
– Annulation d’un merge poussé sur main, puis ré-application contrôlée du contenu
Configuration fine au niveau fichier : attributes et notes
– .gitattributes` : principe et portée — règles attachées aux chemins de fichiers
– Gestion des fins de ligne et de l’encodage : `text`, `eol`, `working-tree-encoding` — éviter les diffs parasites en équipe cross-OS
– Diff et merge personnalisés : `diff.driver`, `merge.driver` — rendre lisibles les diffs de fichiers binaires (Word, images) ou de formats structurés
– Filtres `clean` et `smudge` : transformer le contenu à l’entrée/sortie du dépôt — usage pour secrets, formatage, normalisation
– `export-ignore` et `linguist-*` : contrôler les exports d’archive et la détection de langage par GitHub/GitLab
– `git notes` : annoter un commit sans réécrire son hash — usage pour CI, code review, classement par catégorie
– Partage des notes : refspecs dédiées, synchronisation avec un remote
– Mise en place d’un driver de diff lisible pour un fichier Word ou un format JSON ordonné
– Configuration d’un filtre clean/smudge pour normaliser un fichier de configuration avant commit
– Ajout, classement par catégorie et partage de notes sur l’historique d’un dépôt existant
Patches et collaboration hors plateforme
– Pourquoi les patches : scénarios de contribution sans GitHub/GitLab (kernel-style, échange inter-organisations, dépôts cloisonnés)
– `git format-patch` : génération d’une série de patches à partir d’un ou plusieurs commits — anatomie d’un fichier `.patch`
– `git apply` vs `git am` : appliquer un patch sans historique vs intégrer une série en préservant l’auteur et le message
– Workflow complet : préparer une série, l’envoyer, la recevoir, l’appliquer, gérer les conflits
– Bundles Git : `git bundle` pour échanger un dépôt entier ou une portion sans réseau partagé
– Bonnes pratiques : tester un patch avec `–check`, signer un patch, gérer les rejets
– Génération d’une série de patches d’une feature et application sur un dépôt cible avec `git am`
– Création d’un bundle Git pour échanger un sous-ensemble du dépôt
– Gestion d’un conflit lors de l’application d’un patch et résolution avec `git am –continue`
Multi-arborescence et dépôts composites
– git worktree` : plusieurs branches checkout-ées en parallèle sans clone — gain quand on jongle entre hotfix et feature
– Cycle de vie d’un worktree : `add`, `list`, `lock`, `move`, `remove` — entretien et nettoyage
– Sous-modules : intégrer un dépôt dans un dépôt — ajout, clone récursif, mise à jour, suppression propre
– Pièges des sous-modules : commits détachés, mises à jour à coordonner, branches non suivies — pratiques pour les éviter
– Subtrees : alternative aux sous-modules par fusion d’histoires — `git subtree add`, `pull`, `push`, `split`
– Arbitrer sous-module vs subtree vs monorepo : critères de choix (couplage, propriété, fréquence de mise à jour, taille)
– Mise en place d’un worktree pour traiter un hotfix sans abandonner la branche en cours
– Ajout d’un sous-module à un dépôt existant, clonage récursif et mise à jour vers une nouvelle version
– Comparaison sur un même cas concret de l’intégration via sous-module et via subtree
– Choix raisonné sous-module / subtree / monorepo sur un scénario projet donné
Gros dépôts et performance
– Anatomie d’un dépôt qui devient lourd : binaires, longue histoire, monorepo — symptômes (clone lent, opérations qui rament)
– Git LFS (Large File Storage) : principe pointer-store, installation et configuration côté client, `git lfs track`
– Workflow LFS au quotidien : commits, fetch, push, migration d’historique existant vers LFS
– Clones partiels et superficiels : `–depth`, `–shallow-since`, `–single-branch` — quand et comment unshallow
– `–filter=blob:none` et `partial clone` : récupérer la structure sans tous les blobs, fetch à la demande
– `sparse-checkout` : ne matérialiser qu’une partie de l’arborescence — modes cone et non-cone
– Combinaison `partial clone` + `sparse-checkout` : pattern recommandé pour gros monorepos
– Mise en place de Git LFS sur un dépôt contenant des assets binaires et migration de l’historique
– Réalisation d’un partial clone d’un gros dépôt et observation des fetches à la demande
– Configuration d’un `sparse-checkout` pour ne récupérer qu’un sous-projet d’un monorepo
Avis des participants
Formation claire, structurée et directement applicable. Le formateur a pris le temps de répondre à toutes nos questions avec des exemples concrets.
Très bon équilibre entre théorie et pratique. Les exercices permettent de comprendre rapidement les concepts et de les mettre en œuvre.
Un formateur expérimenté, pédagogue et disponible. Je repars avec des méthodes et des outils que je peux utiliser immédiatement dans mon travail.
Le contenu était dense, mais très bien expliqué. Le rythme a été adapté au niveau du groupe et chacun a pu progresser.
Des formateurs experts, reconnus par nos apprenants
Chez Sparks Formation, la qualité de nos formations repose sur l'expertise de nos formateurs et la satisfaction de nos apprenants.
Note moyenne attribuée par les participants à nos formateurs
formateurs experts partenaires
Sparks Formation
sujets IT délivrés chaque jour partout en France
Financement
Cette formation est éligible aux financements OPCO et FNE-Formation. Nos équipes vous accompagnent dans le montage de votre dossier.
En savoir plus sur le financement
Choisissez votre formation
