[{"data":1,"prerenderedAt":828},["ShallowReactive",2],{"/fr-fr/blog/journey-through-gits-20-year-history":3,"navigation-fr-fr":39,"banner-fr-fr":465,"footer-fr-fr":475,"blog-post-authors-fr-fr-Patrick Steinhardt":713,"blog-related-posts-fr-fr-journey-through-gits-20-year-history":728,"blog-promotions-fr-fr":765,"next-steps-fr-fr":819},{"id":4,"title":5,"authorSlugs":6,"authors":8,"body":10,"category":11,"categorySlug":11,"config":12,"content":16,"date":23,"description":17,"extension":25,"externalUrl":26,"featured":15,"heroImage":19,"isFeatured":15,"meta":27,"navigation":15,"path":28,"publishedDate":23,"rawbody":29,"seo":30,"slug":14,"stem":35,"tagSlugs":36,"tags":37,"template":13,"updatedDate":24,"__hash__":38},"blogPosts/fr-fr/blog/journey-through-gits-20-year-history.md","Git : 20 ans d'histoire",[7],"patrick-steinhardt",[9],"Patrick Steinhardt","Le projet [Git](https://about.gitlab.com/fr-fr/blog/what-is-git/ \"Qu'est-ce que Git ? \") vient de fêter ses 20 ans et depuis, bien des choses ont changé : si le design conceptuel de Git est resté globalement le même, la manière dont les utilisateurs s'en servent, elle, a considérablement évolué. Git est au cœur de notre travail chez GitLab et nous sommes fiers d'être liés à son histoire.\n\nRemontez le temps avec nous pour retracer les grandes étapes de son évolution.\n\n## Le premier commit\n\nLe premier commit a été effectué le 7 avril 2005 par Linus Torvalds, le créateur du noyau Linux : `e83c5163316 (Initial revision of \"git\", the information manager from hell, 2005-04-07)`.\n\nComme vous pouvez le constater, ce commit ne contient pas beaucoup de fichiers :\n\n```shell\n$ git ls-tree e83c5163316\n100644 blob a6bba79ba1f46a1bbf7773449c3bd2bb9bf48e8b\tMakefile\n100644 blob 27577f76849c09d3405397244eb3d8ae1d11b0f3\tREADME\n100644 blob 98a32a9ad39883c6d05a000a68511d4b1ee2b3c7\tcache.h\n100644 blob 74a0a234dd346fff51c773aa57d82fc4b83a8557\tcat-file.c\n100644 blob 840307af0cfaab31555795ce7175d5e9c9f981a0\tcommit-tree.c\n100644 blob 25dc13fe101b219f74007f3194b787dd99e863da\tinit-db.c\n100644 blob c924a6e0fc4c36bad6f23cb87ee59518c771f936\tread-cache.c\n100644 blob 1b47742d8cbc0d98903777758b7b519980e7499e\tread-tree.c\n100644 blob b8522886a15db861508fb6d03d4d88d6de912a4b\tshow-diff.c\n100644 blob 5085a5cb53ee52e1886ff6d46c609bdb2fc6d6cd\tupdate-cache.c\n100644 blob 921f981353229db0c56103a52609d35aff16f41b\twrite-tree.c\n```\n\nOutre l'infrastructure de compilation, le premier commit fournit sept commandes principales :\n\n- `init-db` pour initialiser un nouveau dépôt Git\n- `update-cache` pour ajouter des fichiers à l'index\n- `write-tree` pour créer un nouvel arbre à partir des éléments de l'index\n- `read-tree` pour lire un objet arbre\n- `commit-tree` pour créer un commit à partir d'un arbre\n- `cat-file` pour lire un objet spécifique dans un fichier temporaire\n\nNotez que la commande `git` n'existait pas encore à ce moment-là. Il fallait dès lors les exécuter directement.\n\nPour vous montrer un exemple concret, créons un nouveau dépôt :\n\n```shell\n$ mkdir repo\n$ cd repo\n$ init-db\ndefaulting to private storage area\n$ ls -a\n.  ..  .dircache\n```\n\nCela peut surprendre : il n'y a pas de répertoire `.git`, mais un répertoire `.dircache`. Ce dernier représentait une zone de stockage privée.\nGit distinguait alors deux types d'espaces de stockage des objets : un espace « privé » et un espace « partagé ». Ceux-ci regroupaient tous vos objets Git : vos commits et vos blobs, par exemple.\n\nPar défaut, `init-db` créait un espace de stockage des objets privé qui n'était utilisé que pour le répertoire géré dans lequel il avait été créé. L'espace de stockage des objets « partagé », quant à lui, permettait de centraliser les objets communs à plusieurs répertoires, ce qui évitait d'avoir à les stocker deux fois.\n\n### Créer un commit\n\nNous disposons maintenant d'un dépôt, mais comment procéder pour créer un commit ? Autant vous dire que ce n'est pas aussi simple qu'avec la commande actuelle `git add . && git commit`. À l'époque, vous deviez :\n\n1. Mettre à jour l'index en appelant `update-cache` pour chaque fichier que vous souhaitiez ajouter. 2. Écrire un nouvel arbre en appelant `write-tree` pour prendre le contenu que vous aviez\n   ajouté à l'index.\n3. Configurer les variables d'environnement pour indiquer à Git que vous en étiez l'auteur.\n4. Créer un objet de commit en appelant `commit-tree`.\n\nCréons un commit dans le dépôt pour illustrer ce processus :\n\n```shell\n$ echo content-1 >file-a\n$ update-cache file-a\n$ echo content-2 >file-b\n$ update-cache file-b\n$ write-tree\n3f143dfb48f2d84936626e2e5402e1f10c2050fb\n$ export COMMITTER_NAME=\"Patrick Steinhardt\"\n$ export COMMITER_EMAIL=ps@pks.im\n$ echo \"commit message\" | commit-tree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\nCommitting initial tree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\n5f8e928066c03cebe5fd0a0cc1b93d058155b969\n```\n\nCertes, ce processus n'est pas très pratique, mais il fonctionne ! Découvrons maintenant le commit généré :\n\n```shell\n$ cat-file 5f8e928066c03cebe5fd0a0cc1b93d058155b969\ntemp_git_file_rlTXtE: commit\n$ cat temp_git_file_rlTXtE\ntree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\nauthor Patrick Steinhardt \u003Cps@pks.im> Wed Mar 26 13:10:16 2025\ncommitter Patrick Steinhardt \u003Cps@pks.im> Wed Mar 26 13:10:16 2025\n\ncommit message\n```\n\nNotez que `cat-file` n'a pas affiché le contenu directement, mais l'a d'abord écrit\ndans un fichier temporaire. Toutefois, le contenu du fichier ressemblait déjà en tous points à\ncelui des commits actuels.\n\n### Apporter des modifications\n\nMaintenant que nous avons des fichiers, comment pouvons-nous obtenir leur statut ? Vous l'aviez peut-être deviné, en utilisant `show-diff` :\n\n```shell\n$ show-diff\nfile-a: ok\nfile-b: ok\n\n$ echo modified-content >file-a\n$ show-diff\n--- -\t2025-03-26 13:14:53.457611094 +0100\n+++ file-a\t2025-03-26 13:14:52.230085756 +0100\n@@ -1 +1 @@\n-content-1\n+modified-content\nfile-a:  46d8be14cdec97aac6a769fdbce4db340e888bf8\nfile-b: ok\n```\n\nÉtonnamment, la commande `show-diff` permettait déjà de générer des diffs entre l'ancien et le nouvel état des fichiers modifiés ! Et pour l'anecdote, Git accomplissait cette tâche en exécutant simplement l'outil Unix diff(1).\n\nEn somme, tout était encore rudimentaire, mais suffisant pour assurer le suivi de l'historique. À ce stade, Git était encore très limité :\n\n- Il était impossible de passer facilement d'un commit à un autre.\n- Il était impossible d'afficher les logs.\n- Il n'y avait pas de branches, de tags ou même de références. Les utilisateurs devaient manuellement conserver une trace des ID d'objet.\n- Il était impossible de synchroniser deux dépôts. Par conséquent,\n  les utilisateurs devaient utiliser rsync(1) pour synchroniser les répertoires `.dircache`.\n- Il était impossible de fusionner des modifications.\n\n## Git 0.99\n\nLa version 0.99 de Git a été la première à entrer en phase de test. Celle-ci a été publiée seulement deux mois après le commit initial, mais contenait déjà 1 076 commits. Près de 50 développeurs différents ont participé à son développement. À ce stade, Linus Torvalds était encore le principal contributeur, talonné de près par Junio Hamano, qui est aujourd'hui le chargé de maintenance.\n\nDe nombreuses améliorations avaient été mises en place depuis le premier commit :\n\n- Git avait commencé à suivre différentes branches de développement à l'aide de références, ce qui, dans la grande majorité des cas, dispensait les utilisateurs de suivre les ID d'objets manuellement.\n- Un nouveau protocole distant permettait désormais à deux dépôts d'échanger\n  des objets entre eux.\n- Le répertoire `.dircache` avait été renommé `.git`.\n- Il était désormais possible de fusionner des fichiers uniques entre eux.\n\nMais le changement le plus marquant a sans doute été l'arrivée de\nla commande principale `git` et de ses nombreuses sous-commandes. C'est aussi à cette occasion\nqu'est née la distinction entre les commandes dites de « plomberie » (plumbing) et de « porcelaine » (porcelain) :\n\n- Les outils de « plomberie » sont les commandes de bas niveau qui accèdent au dépôt Git\n sous-jacent.\n- Les outils de « porcelaine » sont des scripts shell qui encapsulent les commandes de « plomberie » pour fournir une interface utilisateur plus conviviale et performante.\n\nCette distinction existe encore aujourd'hui, comme expliqué dans\n[`git(1)`](https://git-scm.com/docs/git/fr#_commandes_de_haut_niveau_porcelaine), mais avec\nla réécriture en C de nombreuses commandes de « porcelaine » initialement en shell, la frontière entre ces deux catégories a commencé à s'estomper significativement.\n\n## Linus Torvalds passe la main\n\nLinus Torvalds n'a jamais créé Git par passion pour les systèmes de [contrôle de version](https://about.gitlab.com/fr-fr/topics/version-control/ \"Qu'est-ce que le contrôle de version\"), mais parce qu'il était nécessaire de remplacer BitKeeper pour le développement du noyau Linux. Dès le départ, il n'avait pas l'intention d'en assurer la maintenance indéfiniment, mais juste le temps de trouver quelqu'un de confiance pour reprendre le flambeau.\nEt cette personne fut Junio Hamano. Junio a rejoint Git une semaine à peine après le premier  commit de Linus Torvalds et comptait déjà plusieurs centaines de commits dans l'historique au moment de la sortie de la version 0.99. Ainsi, le 26 juillet 2005, [Linus Torvalds l'a désigné comme nouveau chargé de maintenance du projet Git](https://lore.kernel.org/git/Pine.LNX.4.58.0507262004320.3227@g5.osdl.org/). Même si Linus Torvalds a continué à contribuer à Git, son implication s'est progressivement réduite, ce qui n'a rien de surprenant, vu ses responsabilités à la tête du projet Linux.\nA ce jour, Junio Hamano dirige toujours le projet Git.\n## Git 1.0\n\nLa première version majeure de Git est sortie le 21 décembre 2005 par Junio Hamano. Fait intéressant : pas moins de 34 nouvelles versions ont été publiées entre la version 0.99 et la version 1.0 : 0.99.1 à 0.99.7, 0.99.7a à 0.99.7d, 0.99.8 à 0.99.8g, et 0.99.9 jusqu'à 0.99.9n.\n\nParmi les évolutions majeures depuis la version 0.99, l'une des plus importantes a sans doute été l'introduction de la commande `git-merge(1)` pour fusionner deux arbres. Un changement radical par rapport à la version précédente, dans laquelle chaque merge devait être effectuée manuellement, fichier par fichier.\n\n### Dépôts distants\n\nUn autre changement majeur a été l'introduction de la notation abrégée pour\nles dépôts distants. Git savait déjà communiquer avec eux, mais jusque-là,\nles utilisateurs devaient entrer l'URL complète à chaque\nrécupération de modifications. Ce processus était plutôt contraignant, car dans la grande majorité des cas, les utilisateurs interagissaient toujours avec le même dépôt distant.\nAujourd'hui, vous connaissez probablement le fonctionnement des dépôts distants,\nmais à l'époque, le mécanisme était encore très différent. Il n'existait pas de commande `git-remote(1)`  pour les gérer. Ils n'étaient même pas stockés  dans votre fichier`.git/config` file. À vrai dire, lorsque les dépôts distants ont fait leur apparition dans\nla version 0.99.2, Git ne *disposait* même pas encore de fichiers de configuration.\nPour les configurer, il fallait créer un fichier dans le\nrépertoire `.git/branches`, un mécanisme qui semble aujourd'hui plutôt contre-intuitif. Mais  il fonctionne encore aujourd'hui :\n\n```shell\n$ git init repo --\nInitialized empty Git repository in /tmp/repo/.git/\n$ cd repo\n$ mkdir .git/branches\n$ echo https://gitlab.com/git-scm/git.git >.git/branches/origin\n$ git fetch origin refs/heads/master\n```\n\nEt ce n'est pas tout ! Le répertoire a été renommé en « dépôts distants » dès la version 0.99.5 de Git. Aujourd'hui, il existe donc trois méthodes distinctes pour configurer des dépôts distants dans un client Git actuel.\nMais soyons honnêtes : la plupart d'entre vous n'ont sans doute jamais eu à utiliser `.git/branches` ni `.git/remotes`,\ndeux mécanismes devenus obsolètes en 2005 et 2011,\nrespectivement. Ces répertoires seront d'ailleurs définitivement supprimés dans la version Git 3.0.\n\n## Image de marque de Git\n\nEn 2007, Git créé son premier logo. Le terme « logo » est peut-être un peu excessif : il ne s'agissait en réalité que de trois signes moins rouges au-dessus de trois signes plus verts, une référence visuelle directement inspirée de la sortie de `git diff` :\n\n![trois signes moins rouges au-dessus de trois signes plus verts, référence visuelle inspirée de la sortie de `git diff`](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750097387927.png)\n\nLe site web [git-scm.com](https://git-scm.com) voit quant à lui le jour en 2008 :\n\n![page de destination pour git-scm.com en 2006](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image4_aHR0cHM6_1750097387930.png)\n\nEn 2012, le site web de Git est [remanié](https://lore.kernel.org/git/CAP2yMaJy=1c3b4F72h6jL_454+0ydEQNXYiC6E-ZeQQgE0PcVA@mail.gmail.com/) par Scott Chacon et Jason Long et son design ne changera que très peu par la suite :\n\n![site web git remanié en 2012](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750097387932.png)\n\nCette refonte du site arbore le nouveau logo rouge-orange conçu par Jason Long, qui est encore utilisé aujourd'hui :\n\n![logo git](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750097387934.png)\n\n## Git 2.0\n\nDès la version 1.0, Git ressemblait déjà fortement à la version d'aujourd'hui,\nc'est pourquoi nous allons faire un grand saut dans le temps et passer directement à une autre étape clé de son histoire : Git 2.0. Publiée environ dix ans après Git 1.0,\ncette version a été la première à\nintroduire délibérément des changements non compatibles avec les versions précédentes dans les workflows principaux.\n\n### Comportement par défaut de `git-push(1)`\n\nLe changement le plus déroutant de cette version a sans doute été\nl'ajustement du comportement par défaut de la commande  `git-push(1)`.\n\nSi vous réalisiez un push dans un dépôt distant sans en indiquer explicitement l'objet,\nGit pouvait réagir de plusieurs façons :\n\n- Refuser d'agir et vous inviter à préciser l'objet de votre push.\n- Effectuer un push de la branche actuellement extraite.\n- Effectuer un push de la branche actuellement extraite, mais uniquement s'il détectait une branche correspondante dans le dépôt distant.\n- Effectuer un push de toutes vos branches disposant d'un équivalent dans le dépôt distant.\n\nAujourd’hui, le comportement par défaut de Git suit la stratégie dite « simple », c'est-à-dire la\ntroisième option mentionnée ci-dessus. Mais avant Git 2.0, le comportement par défaut était la stratégie de « correspondance », soit la dernière option.\n\nLa stratégie de « correspondance » était nettement plus risquée. Avant le push, vous deviez toujours vous assurer que vous vouliez vraiment effectuer un push de toutes vos branches locales disposant d'un équivalent dans le dépôt distant. Dans le cas contraire, vous risquiez d'envoyer des modifications par erreur. C'est pourquoi Git a opté pour la stratégie dite « simple », afin de limiter les risques et de faciliter la prise en main pour les nouveaux utilisateurs.\n\n### `git-add(1)`\n\nLe comportement par défaut de `git-add(1)` vis-à-vis des fichiers supprimés\na lui aussi connu une évolution importante. Avant Git 2.0, la commande `git-add(1)` ne\nprenait pas en compte les fichiers supprimés : il fallait les ajouter manuellement\navec `git-rm(1)` pour qu'ils soient inclus dans un commit. À partir de la version 2.0, la commande `git-add(1)` détecte également les suppressions de fichiers et les ajoute à l’index.\n\n## La communauté Git à l'honneur\n\nNous n'allons pas entrer dans les détails du fonctionnement actuel de Git : vous l'utilisez probablement déjà au quotidien, et dans le cas contraire, de nombreux tutoriels existent pour bien débuter. Prenons plutôt un moment pour célébrer et remercier la communauté Git, qui a permis à ce système de rester aussi performant après deux décennies.\n\nAu fil du temps, Git a :\n\n- Accumulé 56 721 commits depuis [Git 2.49.0](https://about.gitlab.com/fr-fr/blog/whats-new-in-git-2-49-0/ \"Git 2.49.0\")\n- Reçu des contributions de plus de 2 000 personnes différentes.\n- Publié 60 nouvelles versions majeures.\n\nLe projet Git continue aussi de se renouveler grâce à l'arrivée régulière de nouveaux contributeurs, notamment par le biais des programmes [Google Summer of Code](https://summerofcode.withgoogle.com/) et [Outreachy](https://www.outreachy.org/). Ce sont eux qui assurent la pérennité du projet Git.\n## L'avenir de Git\n\nGit s'est clairement imposé comme le grand gagnant dans la course aux systèmes de contrôle de version. Il domine largement le marché et il est rare aujourd'hui de voir un projet [open source](https://about.gitlab.com/fr-fr/blog/what-is-open-source/ \"Qu'est-ce que l'open source ?\") qui n'utilise pas Git. C'est bien la preuve que Git a su faire les bons choix.\n\nCela dit, le développement de Git est loin d'être terminé et de nombreux défis restent à relever. Sur le plan technique :\n- la modernisation d'un code base vieillissant  - la mise à l'échelle face à la croissance continue des monorepos  - la gestion plus efficace des fichiers binaires volumineux\n\nSur le plan communautaire :\n- l'amélioration de la convivialité de Git  - la promotion de la communauté Git pour garantir la pérennité du\nprojet\n\nLe travail ne s'arrête pas là et chez GitLab, nous sommes fiers de contribuer activement à faire en sorte que Git reste un système de contrôle de version de référence pour les vingt années à venir.\n\n## En savoir plus sur Git\n\n- [Git fête ses 20 ans : entretien avec son créateur Linus Torvalds](https://about.gitlab.com/fr-fr/blog/celebrating-gits-20th-anniversary-with-creator-linus-torvalds/) - [Format reftable de Git : guide pour les débutants](https://about.gitlab.com/fr-fr/blog/a-beginners-guide-to-the-git-reftable-format/)\n- [Git fetch vs git pull : quelle est la différence entre ces deux commandes Git ?](https://about.gitlab.com/fr-fr/blog/git-pull-vs-git-fetch-whats-the-difference/ \"Git fetch vs git pull \")\n- [Commits Git : comment et pourquoi maintenir un historique propre](https://about.gitlab.com/fr-fr/blog/keeping-git-commit-history-clean/ \"Commits Git\") - [Git en ligne de commande sous Windows avec Git Bash](https://about.gitlab.com/fr-fr/blog/git-bash/ \"Git Bash\")  - [Améliorez votre workflow avec Git rebase](https://about.gitlab.com/fr-fr/blog/take-advantage-of-git-rebase/ \"Git rebase\")","open-source",{"template":13,"slug":14,"featured":15},"BlogPost","journey-through-gits-20-year-history",true,{"title":5,"description":17,"authors":18,"heroImage":19,"tags":20,"category":11,"date":23,"updatedDate":24,"body":10},"Revivez les débuts du projet Git, avec le tout premier commit, découvrez les particularités des premières versions et replongez dans la confusion qu'a provoquée le changement du comportement par défaut de git-push(1).",[9],"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097380/Blog/Hero%20Images/Blog/Hero%20Images/git-20-years-opt2_TWNsNk8KH43b3jP0KLD0U_1750097380123.png",[21,22],"open source","git","2025-04-14","2025-04-25","md",null,{},"/fr-fr/blog/journey-through-gits-20-year-history","---\nseo:\n  title: \"Git : 20 ans d'histoire\"\n  description: >-\n    Revivez les débuts du projet Git, avec le tout premier commit, découvrez les\n    particularités des premières versions et replongez dans la confusion qu'a\n    provoquée le changement du comportement par défaut de git-push(1).\n  ogTitle: \"Git : 20 ans d'histoire\"\n  ogDescription: >-\n    Revivez les débuts du projet Git, avec le tout premier commit, découvrez les\n    particularités des premières versions et replongez dans la confusion qu'a\n    provoquée le changement du comportement par défaut de git-push(1).\n  noIndex: false\n  ogImage: >-\n    https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097380/Blog/Hero%20Images/Blog/Hero%20Images/git-20-years-opt2_TWNsNk8KH43b3jP0KLD0U_1750097380123.png\n  ogUrl: https://about.gitlab.com/blog/journey-through-gits-20-year-history\n  ogSiteName: https://about.gitlab.com\n  ogType: article\n  canonicalUrls: https://about.gitlab.com/blog/journey-through-gits-20-year-history\ntitle: \"Git : 20 ans d'histoire\"\ndescription: Revivez les débuts du projet Git, avec le tout premier commit, découvrez les particularités des premières versions et replongez dans la confusion qu'a provoquée le changement du comportement par défaut de git-push(1).\nauthors:\n  - Patrick Steinhardt\nheroImage: https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097380/Blog/Hero%20Images/Blog/Hero%20Images/git-20-years-opt2_TWNsNk8KH43b3jP0KLD0U_1750097380123.png\ntags:\n  - open source\n  - git\ncategory: open-source\ndate: '2025-04-14'\nupdatedDate: '2025-04-25'\nslug: journey-through-gits-20-year-history\nfeatured: true\ntemplate: BlogPost\n---\n\nLe projet [Git](https://about.gitlab.com/fr-fr/blog/what-is-git/ \"Qu'est-ce que Git ? \") vient de fêter ses 20 ans et depuis, bien des choses ont changé : si le design conceptuel de Git est resté globalement le même, la manière dont les utilisateurs s'en servent, elle, a considérablement évolué. Git est au cœur de notre travail chez GitLab et nous sommes fiers d'être liés à son histoire.\n\nRemontez le temps avec nous pour retracer les grandes étapes de son évolution.\n\n## Le premier commit\n\nLe premier commit a été effectué le 7 avril 2005 par Linus Torvalds, le créateur du noyau Linux : `e83c5163316 (Initial revision of \"git\", the information manager from hell, 2005-04-07)`.\n\nComme vous pouvez le constater, ce commit ne contient pas beaucoup de fichiers :\n\n```shell\n$ git ls-tree e83c5163316\n100644 blob a6bba79ba1f46a1bbf7773449c3bd2bb9bf48e8b\tMakefile\n100644 blob 27577f76849c09d3405397244eb3d8ae1d11b0f3\tREADME\n100644 blob 98a32a9ad39883c6d05a000a68511d4b1ee2b3c7\tcache.h\n100644 blob 74a0a234dd346fff51c773aa57d82fc4b83a8557\tcat-file.c\n100644 blob 840307af0cfaab31555795ce7175d5e9c9f981a0\tcommit-tree.c\n100644 blob 25dc13fe101b219f74007f3194b787dd99e863da\tinit-db.c\n100644 blob c924a6e0fc4c36bad6f23cb87ee59518c771f936\tread-cache.c\n100644 blob 1b47742d8cbc0d98903777758b7b519980e7499e\tread-tree.c\n100644 blob b8522886a15db861508fb6d03d4d88d6de912a4b\tshow-diff.c\n100644 blob 5085a5cb53ee52e1886ff6d46c609bdb2fc6d6cd\tupdate-cache.c\n100644 blob 921f981353229db0c56103a52609d35aff16f41b\twrite-tree.c\n```\n\nOutre l'infrastructure de compilation, le premier commit fournit sept commandes principales :\n\n- `init-db` pour initialiser un nouveau dépôt Git\n- `update-cache` pour ajouter des fichiers à l'index\n- `write-tree` pour créer un nouvel arbre à partir des éléments de l'index\n- `read-tree` pour lire un objet arbre\n- `commit-tree` pour créer un commit à partir d'un arbre\n- `cat-file` pour lire un objet spécifique dans un fichier temporaire\n\nNotez que la commande `git` n'existait pas encore à ce moment-là. Il fallait dès lors les exécuter directement.\n\nPour vous montrer un exemple concret, créons un nouveau dépôt :\n\n```shell\n$ mkdir repo\n$ cd repo\n$ init-db\ndefaulting to private storage area\n$ ls -a\n.  ..  .dircache\n```\n\nCela peut surprendre : il n'y a pas de répertoire `.git`, mais un répertoire `.dircache`. Ce dernier représentait une zone de stockage privée.\nGit distinguait alors deux types d'espaces de stockage des objets : un espace « privé » et un espace « partagé ». Ceux-ci regroupaient tous vos objets Git : vos commits et vos blobs, par exemple.\n\nPar défaut, `init-db` créait un espace de stockage des objets privé qui n'était utilisé que pour le répertoire géré dans lequel il avait été créé. L'espace de stockage des objets « partagé », quant à lui, permettait de centraliser les objets communs à plusieurs répertoires, ce qui évitait d'avoir à les stocker deux fois.\n\n### Créer un commit\n\nNous disposons maintenant d'un dépôt, mais comment procéder pour créer un commit ? Autant vous dire que ce n'est pas aussi simple qu'avec la commande actuelle `git add . && git commit`. À l'époque, vous deviez :\n\n1. Mettre à jour l'index en appelant `update-cache` pour chaque fichier que vous souhaitiez ajouter. 2. Écrire un nouvel arbre en appelant `write-tree` pour prendre le contenu que vous aviez\n   ajouté à l'index.\n3. Configurer les variables d'environnement pour indiquer à Git que vous en étiez l'auteur.\n4. Créer un objet de commit en appelant `commit-tree`.\n\nCréons un commit dans le dépôt pour illustrer ce processus :\n\n```shell\n$ echo content-1 >file-a\n$ update-cache file-a\n$ echo content-2 >file-b\n$ update-cache file-b\n$ write-tree\n3f143dfb48f2d84936626e2e5402e1f10c2050fb\n$ export COMMITTER_NAME=\"Patrick Steinhardt\"\n$ export COMMITER_EMAIL=ps@pks.im\n$ echo \"commit message\" | commit-tree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\nCommitting initial tree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\n5f8e928066c03cebe5fd0a0cc1b93d058155b969\n```\n\nCertes, ce processus n'est pas très pratique, mais il fonctionne ! Découvrons maintenant le commit généré :\n\n```shell\n$ cat-file 5f8e928066c03cebe5fd0a0cc1b93d058155b969\ntemp_git_file_rlTXtE: commit\n$ cat temp_git_file_rlTXtE\ntree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\nauthor Patrick Steinhardt \u003Cps@pks.im> Wed Mar 26 13:10:16 2025\ncommitter Patrick Steinhardt \u003Cps@pks.im> Wed Mar 26 13:10:16 2025\n\ncommit message\n```\n\nNotez que `cat-file` n'a pas affiché le contenu directement, mais l'a d'abord écrit\ndans un fichier temporaire. Toutefois, le contenu du fichier ressemblait déjà en tous points à\ncelui des commits actuels.\n\n### Apporter des modifications\n\nMaintenant que nous avons des fichiers, comment pouvons-nous obtenir leur statut ? Vous l'aviez peut-être deviné, en utilisant `show-diff` :\n\n```shell\n$ show-diff\nfile-a: ok\nfile-b: ok\n\n$ echo modified-content >file-a\n$ show-diff\n--- -\t2025-03-26 13:14:53.457611094 +0100\n+++ file-a\t2025-03-26 13:14:52.230085756 +0100\n@@ -1 +1 @@\n-content-1\n+modified-content\nfile-a:  46d8be14cdec97aac6a769fdbce4db340e888bf8\nfile-b: ok\n```\n\nÉtonnamment, la commande `show-diff` permettait déjà de générer des diffs entre l'ancien et le nouvel état des fichiers modifiés ! Et pour l'anecdote, Git accomplissait cette tâche en exécutant simplement l'outil Unix diff(1).\n\nEn somme, tout était encore rudimentaire, mais suffisant pour assurer le suivi de l'historique. À ce stade, Git était encore très limité :\n\n- Il était impossible de passer facilement d'un commit à un autre.\n- Il était impossible d'afficher les logs.\n- Il n'y avait pas de branches, de tags ou même de références. Les utilisateurs devaient manuellement conserver une trace des ID d'objet.\n- Il était impossible de synchroniser deux dépôts. Par conséquent,\n  les utilisateurs devaient utiliser rsync(1) pour synchroniser les répertoires `.dircache`.\n- Il était impossible de fusionner des modifications.\n\n## Git 0.99\n\nLa version 0.99 de Git a été la première à entrer en phase de test. Celle-ci a été publiée seulement deux mois après le commit initial, mais contenait déjà 1 076 commits. Près de 50 développeurs différents ont participé à son développement. À ce stade, Linus Torvalds était encore le principal contributeur, talonné de près par Junio Hamano, qui est aujourd'hui le chargé de maintenance.\n\nDe nombreuses améliorations avaient été mises en place depuis le premier commit :\n\n- Git avait commencé à suivre différentes branches de développement à l'aide de références, ce qui, dans la grande majorité des cas, dispensait les utilisateurs de suivre les ID d'objets manuellement.\n- Un nouveau protocole distant permettait désormais à deux dépôts d'échanger\n  des objets entre eux.\n- Le répertoire `.dircache` avait été renommé `.git`.\n- Il était désormais possible de fusionner des fichiers uniques entre eux.\n\nMais le changement le plus marquant a sans doute été l'arrivée de\nla commande principale `git` et de ses nombreuses sous-commandes. C'est aussi à cette occasion\nqu'est née la distinction entre les commandes dites de « plomberie » (plumbing) et de « porcelaine » (porcelain) :\n\n- Les outils de « plomberie » sont les commandes de bas niveau qui accèdent au dépôt Git\n sous-jacent.\n- Les outils de « porcelaine » sont des scripts shell qui encapsulent les commandes de « plomberie » pour fournir une interface utilisateur plus conviviale et performante.\n\nCette distinction existe encore aujourd'hui, comme expliqué dans\n[`git(1)`](https://git-scm.com/docs/git/fr#_commandes_de_haut_niveau_porcelaine), mais avec\nla réécriture en C de nombreuses commandes de « porcelaine » initialement en shell, la frontière entre ces deux catégories a commencé à s'estomper significativement.\n\n## Linus Torvalds passe la main\n\nLinus Torvalds n'a jamais créé Git par passion pour les systèmes de [contrôle de version](https://about.gitlab.com/fr-fr/topics/version-control/ \"Qu'est-ce que le contrôle de version\"), mais parce qu'il était nécessaire de remplacer BitKeeper pour le développement du noyau Linux. Dès le départ, il n'avait pas l'intention d'en assurer la maintenance indéfiniment, mais juste le temps de trouver quelqu'un de confiance pour reprendre le flambeau.\nEt cette personne fut Junio Hamano. Junio a rejoint Git une semaine à peine après le premier  commit de Linus Torvalds et comptait déjà plusieurs centaines de commits dans l'historique au moment de la sortie de la version 0.99. Ainsi, le 26 juillet 2005, [Linus Torvalds l'a désigné comme nouveau chargé de maintenance du projet Git](https://lore.kernel.org/git/Pine.LNX.4.58.0507262004320.3227@g5.osdl.org/). Même si Linus Torvalds a continué à contribuer à Git, son implication s'est progressivement réduite, ce qui n'a rien de surprenant, vu ses responsabilités à la tête du projet Linux.\nA ce jour, Junio Hamano dirige toujours le projet Git.\n## Git 1.0\n\nLa première version majeure de Git est sortie le 21 décembre 2005 par Junio Hamano. Fait intéressant : pas moins de 34 nouvelles versions ont été publiées entre la version 0.99 et la version 1.0 : 0.99.1 à 0.99.7, 0.99.7a à 0.99.7d, 0.99.8 à 0.99.8g, et 0.99.9 jusqu'à 0.99.9n.\n\nParmi les évolutions majeures depuis la version 0.99, l'une des plus importantes a sans doute été l'introduction de la commande `git-merge(1)` pour fusionner deux arbres. Un changement radical par rapport à la version précédente, dans laquelle chaque merge devait être effectuée manuellement, fichier par fichier.\n\n### Dépôts distants\n\nUn autre changement majeur a été l'introduction de la notation abrégée pour\nles dépôts distants. Git savait déjà communiquer avec eux, mais jusque-là,\nles utilisateurs devaient entrer l'URL complète à chaque\nrécupération de modifications. Ce processus était plutôt contraignant, car dans la grande majorité des cas, les utilisateurs interagissaient toujours avec le même dépôt distant.\nAujourd'hui, vous connaissez probablement le fonctionnement des dépôts distants,\nmais à l'époque, le mécanisme était encore très différent. Il n'existait pas de commande `git-remote(1)`  pour les gérer. Ils n'étaient même pas stockés  dans votre fichier`.git/config` file. À vrai dire, lorsque les dépôts distants ont fait leur apparition dans\nla version 0.99.2, Git ne *disposait* même pas encore de fichiers de configuration.\nPour les configurer, il fallait créer un fichier dans le\nrépertoire `.git/branches`, un mécanisme qui semble aujourd'hui plutôt contre-intuitif. Mais  il fonctionne encore aujourd'hui :\n\n```shell\n$ git init repo --\nInitialized empty Git repository in /tmp/repo/.git/\n$ cd repo\n$ mkdir .git/branches\n$ echo https://gitlab.com/git-scm/git.git >.git/branches/origin\n$ git fetch origin refs/heads/master\n```\n\nEt ce n'est pas tout ! Le répertoire a été renommé en « dépôts distants » dès la version 0.99.5 de Git. Aujourd'hui, il existe donc trois méthodes distinctes pour configurer des dépôts distants dans un client Git actuel.\nMais soyons honnêtes : la plupart d'entre vous n'ont sans doute jamais eu à utiliser `.git/branches` ni `.git/remotes`,\ndeux mécanismes devenus obsolètes en 2005 et 2011,\nrespectivement. Ces répertoires seront d'ailleurs définitivement supprimés dans la version Git 3.0.\n\n## Image de marque de Git\n\nEn 2007, Git créé son premier logo. Le terme « logo » est peut-être un peu excessif : il ne s'agissait en réalité que de trois signes moins rouges au-dessus de trois signes plus verts, une référence visuelle directement inspirée de la sortie de `git diff` :\n\n![trois signes moins rouges au-dessus de trois signes plus verts, référence visuelle inspirée de la sortie de `git diff`](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750097387927.png)\n\nLe site web [git-scm.com](https://git-scm.com) voit quant à lui le jour en 2008 :\n\n![page de destination pour git-scm.com en 2006](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image4_aHR0cHM6_1750097387930.png)\n\nEn 2012, le site web de Git est [remanié](https://lore.kernel.org/git/CAP2yMaJy=1c3b4F72h6jL_454+0ydEQNXYiC6E-ZeQQgE0PcVA@mail.gmail.com/) par Scott Chacon et Jason Long et son design ne changera que très peu par la suite :\n\n![site web git remanié en 2012](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750097387932.png)\n\nCette refonte du site arbore le nouveau logo rouge-orange conçu par Jason Long, qui est encore utilisé aujourd'hui :\n\n![logo git](https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750097387934.png)\n\n## Git 2.0\n\nDès la version 1.0, Git ressemblait déjà fortement à la version d'aujourd'hui,\nc'est pourquoi nous allons faire un grand saut dans le temps et passer directement à une autre étape clé de son histoire : Git 2.0. Publiée environ dix ans après Git 1.0,\ncette version a été la première à\nintroduire délibérément des changements non compatibles avec les versions précédentes dans les workflows principaux.\n\n### Comportement par défaut de `git-push(1)`\n\nLe changement le plus déroutant de cette version a sans doute été\nl'ajustement du comportement par défaut de la commande  `git-push(1)`.\n\nSi vous réalisiez un push dans un dépôt distant sans en indiquer explicitement l'objet,\nGit pouvait réagir de plusieurs façons :\n\n- Refuser d'agir et vous inviter à préciser l'objet de votre push.\n- Effectuer un push de la branche actuellement extraite.\n- Effectuer un push de la branche actuellement extraite, mais uniquement s'il détectait une branche correspondante dans le dépôt distant.\n- Effectuer un push de toutes vos branches disposant d'un équivalent dans le dépôt distant.\n\nAujourd’hui, le comportement par défaut de Git suit la stratégie dite « simple », c'est-à-dire la\ntroisième option mentionnée ci-dessus. Mais avant Git 2.0, le comportement par défaut était la stratégie de « correspondance », soit la dernière option.\n\nLa stratégie de « correspondance » était nettement plus risquée. Avant le push, vous deviez toujours vous assurer que vous vouliez vraiment effectuer un push de toutes vos branches locales disposant d'un équivalent dans le dépôt distant. Dans le cas contraire, vous risquiez d'envoyer des modifications par erreur. C'est pourquoi Git a opté pour la stratégie dite « simple », afin de limiter les risques et de faciliter la prise en main pour les nouveaux utilisateurs.\n\n### `git-add(1)`\n\nLe comportement par défaut de `git-add(1)` vis-à-vis des fichiers supprimés\na lui aussi connu une évolution importante. Avant Git 2.0, la commande `git-add(1)` ne\nprenait pas en compte les fichiers supprimés : il fallait les ajouter manuellement\navec `git-rm(1)` pour qu'ils soient inclus dans un commit. À partir de la version 2.0, la commande `git-add(1)` détecte également les suppressions de fichiers et les ajoute à l’index.\n\n## La communauté Git à l'honneur\n\nNous n'allons pas entrer dans les détails du fonctionnement actuel de Git : vous l'utilisez probablement déjà au quotidien, et dans le cas contraire, de nombreux tutoriels existent pour bien débuter. Prenons plutôt un moment pour célébrer et remercier la communauté Git, qui a permis à ce système de rester aussi performant après deux décennies.\n\nAu fil du temps, Git a :\n\n- Accumulé 56 721 commits depuis [Git 2.49.0](https://about.gitlab.com/fr-fr/blog/whats-new-in-git-2-49-0/ \"Git 2.49.0\")\n- Reçu des contributions de plus de 2 000 personnes différentes.\n- Publié 60 nouvelles versions majeures.\n\nLe projet Git continue aussi de se renouveler grâce à l'arrivée régulière de nouveaux contributeurs, notamment par le biais des programmes [Google Summer of Code](https://summerofcode.withgoogle.com/) et [Outreachy](https://www.outreachy.org/). Ce sont eux qui assurent la pérennité du projet Git.\n## L'avenir de Git\n\nGit s'est clairement imposé comme le grand gagnant dans la course aux systèmes de contrôle de version. Il domine largement le marché et il est rare aujourd'hui de voir un projet [open source](https://about.gitlab.com/fr-fr/blog/what-is-open-source/ \"Qu'est-ce que l'open source ?\") qui n'utilise pas Git. C'est bien la preuve que Git a su faire les bons choix.\n\nCela dit, le développement de Git est loin d'être terminé et de nombreux défis restent à relever. Sur le plan technique :\n- la modernisation d'un code base vieillissant  - la mise à l'échelle face à la croissance continue des monorepos  - la gestion plus efficace des fichiers binaires volumineux\n\nSur le plan communautaire :\n- l'amélioration de la convivialité de Git  - la promotion de la communauté Git pour garantir la pérennité du\nprojet\n\nLe travail ne s'arrête pas là et chez GitLab, nous sommes fiers de contribuer activement à faire en sorte que Git reste un système de contrôle de version de référence pour les vingt années à venir.\n\n## En savoir plus sur Git\n\n- [Git fête ses 20 ans : entretien avec son créateur Linus Torvalds](https://about.gitlab.com/fr-fr/blog/celebrating-gits-20th-anniversary-with-creator-linus-torvalds/) - [Format reftable de Git : guide pour les débutants](https://about.gitlab.com/fr-fr/blog/a-beginners-guide-to-the-git-reftable-format/)\n- [Git fetch vs git pull : quelle est la différence entre ces deux commandes Git ?](https://about.gitlab.com/fr-fr/blog/git-pull-vs-git-fetch-whats-the-difference/ \"Git fetch vs git pull \")\n- [Commits Git : comment et pourquoi maintenir un historique propre](https://about.gitlab.com/fr-fr/blog/keeping-git-commit-history-clean/ \"Commits Git\") - [Git en ligne de commande sous Windows avec Git Bash](https://about.gitlab.com/fr-fr/blog/git-bash/ \"Git Bash\")  - [Améliorez votre workflow avec Git rebase](https://about.gitlab.com/fr-fr/blog/take-advantage-of-git-rebase/ \"Git rebase\")\n",{"title":5,"description":17,"ogTitle":5,"ogDescription":17,"noIndex":31,"ogImage":19,"ogUrl":32,"ogSiteName":33,"ogType":34,"canonicalUrls":32},false,"https://about.gitlab.com/blog/journey-through-gits-20-year-history","https://about.gitlab.com","article","fr-fr/blog/journey-through-gits-20-year-history",[11,22],[21,22],"erR6GxebG-ys74KdAaUv_07V-8aCY-EdbQmfZmhdjjg",{"logo":40,"freeTrial":45,"sales":50,"login":55,"items":60,"search":381,"minimal":416,"duo":435,"switchNav":444,"pricingDeployment":455},{"config":41},{"href":42,"dataGaName":43,"dataGaLocation":44},"/fr-fr/","gitlab logo","header",{"text":46,"config":47},"Commencer un essai gratuit",{"href":48,"dataGaName":49,"dataGaLocation":44},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":51,"config":52},"Contacter l'équipe commerciale",{"href":53,"dataGaName":54,"dataGaLocation":44},"/fr-fr/sales/","sales",{"text":56,"config":57},"Connexion",{"href":58,"dataGaName":59,"dataGaLocation":44},"https://gitlab.com/users/sign_in/","sign in",[61,90,192,197,300,361],{"text":62,"config":63,"menu":65},"Plateforme",{"dataNavLevelOne":64},"platform",{"type":66,"columns":67},"cards",[68,74,82],{"title":62,"description":69,"link":70},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":71,"config":72},"Explorer notre plateforme",{"href":73,"dataGaName":64,"dataGaLocation":44},"/fr-fr/platform/",{"title":75,"description":76,"link":77},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":78,"config":79},"Découvrir GitLab Duo",{"href":80,"dataGaName":81,"dataGaLocation":44},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":83,"description":84,"link":85},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":86,"config":87},"En savoir plus",{"href":88,"dataGaName":89,"dataGaLocation":44},"/fr-fr/why-gitlab/","why gitlab",{"text":91,"left":15,"config":92,"menu":94},"Produit",{"dataNavLevelOne":93},"solutions",{"type":95,"link":96,"columns":100,"feature":171},"lists",{"text":97,"config":98},"Voir toutes les solutions",{"href":99,"dataGaName":93,"dataGaLocation":44},"/fr-fr/solutions/",[101,126,149],{"title":102,"description":103,"link":104,"items":109},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":105},{"icon":106,"href":107,"dataGaName":108,"dataGaLocation":44},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[110,114,117,122],{"text":111,"config":112},"CI/CD",{"href":113,"dataGaLocation":44,"dataGaName":111},"/fr-fr/solutions/continuous-integration/",{"text":75,"config":115},{"href":80,"dataGaLocation":44,"dataGaName":116},"gitlab duo agent platform - product menu",{"text":118,"config":119},"Gestion du code source",{"href":120,"dataGaLocation":44,"dataGaName":121},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":123,"config":124},"Livraison de logiciels automatisée",{"href":107,"dataGaLocation":44,"dataGaName":125},"Automated software delivery",{"title":127,"description":128,"link":129,"items":134},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":130},{"href":131,"dataGaName":132,"dataGaLocation":44,"icon":133},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[135,139,144],{"text":136,"config":137},"Tests de sécurité des applications",{"href":131,"dataGaName":138,"dataGaLocation":44},"Application security testing",{"text":140,"config":141},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":142,"dataGaLocation":44,"dataGaName":143},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":145,"config":146},"Conformité logicielle",{"href":147,"dataGaName":148,"dataGaLocation":44},"/fr-fr/solutions/software-compliance/","software compliance",{"title":150,"link":151,"items":156},"Mesures",{"config":152},{"icon":153,"href":154,"dataGaName":155,"dataGaLocation":44},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[157,161,166],{"text":158,"config":159},"Visibilité et mesures",{"href":154,"dataGaLocation":44,"dataGaName":160},"Visibility and Measurement",{"text":162,"config":163},"Gestion de la chaîne de valeur",{"href":164,"dataGaLocation":44,"dataGaName":165},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":167,"config":168},"Données d'analyse et informations clés",{"href":169,"dataGaLocation":44,"dataGaName":170},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":172,"type":95,"items":173},"GitLab",[174,180,186],{"text":175,"config":176},"Pour les entreprises",{"icon":177,"href":178,"dataGaLocation":44,"dataGaName":179},"Building","/fr-fr/enterprise/","enterprise",{"text":181,"config":182},"Pour les PME",{"icon":183,"href":184,"dataGaLocation":44,"dataGaName":185},"Work","/fr-fr/small-business/","small business",{"text":187,"config":188},"Pour le secteur public",{"icon":189,"href":190,"dataGaLocation":44,"dataGaName":191},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":193,"config":194},"Tarifs",{"href":195,"dataGaName":196,"dataGaLocation":44,"dataNavLevelOne":196},"/fr-fr/pricing/","pricing",{"text":198,"config":199,"menu":201},"Ressources",{"dataNavLevelOne":200},"resources",{"type":95,"link":202,"columns":206,"feature":286},{"text":203,"config":204},"Afficher toutes les ressources",{"href":205,"dataGaName":200,"dataGaLocation":44},"/fr-fr/resources/",[207,240,258],{"title":208,"items":209},"Premiers pas",[210,215,220,225,230,235],{"text":211,"config":212},"Installation",{"href":213,"dataGaName":214,"dataGaLocation":44},"/fr-fr/install/","install",{"text":216,"config":217},"Guides de démarrage",{"href":218,"dataGaName":219,"dataGaLocation":44},"/fr-fr/get-started/","quick setup checklists",{"text":221,"config":222},"Apprentissage",{"href":223,"dataGaLocation":44,"dataGaName":224},"https://university.gitlab.com/","learn",{"text":226,"config":227},"Documentation",{"href":228,"dataGaName":229,"dataGaLocation":44},"https://docs.gitlab.com/","product documentation",{"text":231,"config":232},"Vidéos sur les bonnes pratiques",{"href":233,"dataGaName":234,"dataGaLocation":44},"/fr-fr/getting-started-videos/","best practice videos",{"text":236,"config":237},"Intégrations",{"href":238,"dataGaName":239,"dataGaLocation":44},"/fr-fr/integrations/","integrations",{"title":241,"items":242},"Découvrir",[243,248,253],{"text":244,"config":245},"Témoignages clients",{"href":246,"dataGaName":247,"dataGaLocation":44},"/fr-fr/customers/","customer success stories",{"text":249,"config":250},"Blog",{"href":251,"dataGaName":252,"dataGaLocation":44},"/fr-fr/blog/","blog",{"text":254,"config":255},"Travail à distance",{"href":256,"dataGaName":257,"dataGaLocation":44},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":259,"items":260},"Connecter",[261,266,271,276,281],{"text":262,"config":263},"Services GitLab",{"href":264,"dataGaName":265,"dataGaLocation":44},"/fr-fr/services/","services",{"text":267,"config":268},"Communauté",{"href":269,"dataGaName":270,"dataGaLocation":44},"/community/","community",{"text":272,"config":273},"Forum",{"href":274,"dataGaName":275,"dataGaLocation":44},"https://forum.gitlab.com/","forum",{"text":277,"config":278},"Événements",{"href":279,"dataGaName":280,"dataGaLocation":44},"/events/","events",{"text":282,"config":283},"Partenaires",{"href":284,"dataGaName":285,"dataGaLocation":44},"/fr-fr/partners/","partners",{"config":287,"text":290,"image":291,"link":295},{"background":288,"textColor":289},"#2f2a6b","#fff","L'avenir du développement logiciel. Tendances et perspectives.",{"altText":292,"config":293},"carte promo The Source",{"src":294},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":296,"config":297},"Lire les articles les plus récents",{"href":298,"dataGaName":299,"dataGaLocation":44},"/fr-fr/the-source/","the source",{"text":301,"config":302,"menu":304},"Société",{"dataNavLevelOne":303},"company",{"type":95,"columns":305},[306],{"items":307},[308,313,319,321,326,331,336,341,346,351,356],{"text":309,"config":310},"À propos",{"href":311,"dataGaName":312,"dataGaLocation":44},"/fr-fr/company/","about",{"text":314,"config":315,"footerGa":318},"Carrières",{"href":316,"dataGaName":317,"dataGaLocation":44},"/jobs/","jobs",{"dataGaName":317},{"text":277,"config":320},{"href":279,"dataGaName":280,"dataGaLocation":44},{"text":322,"config":323},"Leadership",{"href":324,"dataGaName":325,"dataGaLocation":44},"/company/team/e-group/","leadership",{"text":327,"config":328},"Équipe",{"href":329,"dataGaName":330,"dataGaLocation":44},"/company/team/","team",{"text":332,"config":333},"Manuel",{"href":334,"dataGaName":335,"dataGaLocation":44},"https://handbook.gitlab.com/","handbook",{"text":337,"config":338},"Relations avec les investisseurs",{"href":339,"dataGaName":340,"dataGaLocation":44},"https://ir.gitlab.com/","investor relations",{"text":342,"config":343},"Trust Center",{"href":344,"dataGaName":345,"dataGaLocation":44},"/fr-fr/security/","trust center",{"text":347,"config":348},"Centre pour la transparence de l'IA",{"href":349,"dataGaName":350,"dataGaLocation":44},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":352,"config":353},"Newsletter",{"href":354,"dataGaName":355,"dataGaLocation":44},"/company/contact/#contact-forms","newsletter",{"text":357,"config":358},"Presse",{"href":359,"dataGaName":360,"dataGaLocation":44},"/press/","press",{"text":362,"config":363,"menu":364},"Nous contacter",{"dataNavLevelOne":303},{"type":95,"columns":365},[366],{"items":367},[368,371,376],{"text":51,"config":369},{"href":53,"dataGaName":370,"dataGaLocation":44},"talk to sales",{"text":372,"config":373},"Assistance GitLab",{"href":374,"dataGaName":375,"dataGaLocation":44},"https://support.gitlab.com","support portal",{"text":377,"config":378},"Portail clients GitLab",{"href":379,"dataGaName":380,"dataGaLocation":44},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":382,"login":383,"suggestions":390},"Fermer",{"text":384,"link":385},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":386,"config":387},"GitLab.com",{"href":58,"dataGaName":388,"dataGaLocation":389},"search login","search",{"text":391,"default":392},"Suggestions",[393,395,400,402,407,412],{"text":75,"config":394},{"href":80,"dataGaName":75,"dataGaLocation":389},{"text":396,"config":397},"Suggestions de code (IA)",{"href":398,"dataGaName":399,"dataGaLocation":389},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":111,"config":401},{"href":113,"dataGaName":111,"dataGaLocation":389},{"text":403,"config":404},"GitLab sur AWS",{"href":405,"dataGaName":406,"dataGaLocation":389},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":408,"config":409},"GitLab sur Google Cloud",{"href":410,"dataGaName":411,"dataGaLocation":389},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":413,"config":414},"Pourquoi utiliser GitLab ?",{"href":88,"dataGaName":415,"dataGaLocation":389},"Why GitLab?",{"freeTrial":417,"mobileIcon":422,"desktopIcon":427,"secondaryButton":430},{"text":418,"config":419},"Commencer votre essai gratuit",{"href":420,"dataGaName":49,"dataGaLocation":421},"https://gitlab.com/-/trials/new/","nav",{"altText":423,"config":424},"Icône GitLab",{"src":425,"dataGaName":426,"dataGaLocation":421},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":423,"config":428},{"src":429,"dataGaName":426,"dataGaLocation":421},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":431,"config":432},"Commencer",{"href":433,"dataGaName":434,"dataGaLocation":421},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":436,"mobileIcon":440,"desktopIcon":442},{"text":437,"config":438},"En savoir plus sur GitLab Duo",{"href":80,"dataGaName":439,"dataGaLocation":421},"gitlab duo",{"altText":423,"config":441},{"src":425,"dataGaName":426,"dataGaLocation":421},{"altText":423,"config":443},{"src":429,"dataGaName":426,"dataGaLocation":421},{"button":445,"mobileIcon":450,"desktopIcon":452},{"text":446,"config":447},"/switch",{"href":448,"dataGaName":449,"dataGaLocation":421},"#contact","switch",{"altText":423,"config":451},{"src":425,"dataGaName":426,"dataGaLocation":421},{"altText":423,"config":453},{"src":454,"dataGaName":426,"dataGaLocation":421},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":456,"mobileIcon":461,"desktopIcon":463},{"text":457,"config":458},"Retour aux tarifs",{"href":195,"dataGaName":459,"dataGaLocation":421,"icon":460},"back to pricing","GoBack",{"altText":423,"config":462},{"src":425,"dataGaName":426,"dataGaLocation":421},{"altText":423,"config":464},{"src":429,"dataGaName":426,"dataGaLocation":421},{"title":466,"button":467,"config":472},"Découvrez comment l'IA agentique transforme la livraison logicielle",{"text":468,"config":469},"S'inscrire à GitLab Transcend le 10 juin",{"href":470,"dataGaName":471,"dataGaLocation":44},"/fr-fr/releases/whats-new/#sign-up","transcend event",{"layout":473,"icon":474,"disabled":31},"release","AiStar",{"data":476},{"text":477,"source":478,"edit":484,"contribute":489,"config":494,"items":499,"minimal":704},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":479,"config":480},"Afficher le code source de la page",{"href":481,"dataGaName":482,"dataGaLocation":483},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":485,"config":486},"Modifier cette page",{"href":487,"dataGaName":488,"dataGaLocation":483},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":490,"config":491},"Veuillez contribuer",{"href":492,"dataGaName":493,"dataGaLocation":483},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":495,"facebook":496,"youtube":497,"linkedin":498},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[500,545,598,642,669],{"title":193,"links":501,"subMenu":516},[502,506,511],{"text":503,"config":504},"Voir les forfaits",{"href":195,"dataGaName":505,"dataGaLocation":483},"view plans",{"text":507,"config":508},"GitLab Premium",{"href":509,"dataGaName":510,"dataGaLocation":483},"/fr-fr/pricing/premium/","why premium",{"text":512,"config":513},"GitLab Ultimate",{"href":514,"dataGaName":515,"dataGaLocation":483},"/fr-fr/pricing/ultimate/","why ultimate",[517],{"title":362,"links":518},[519,521,523,525,530,535,540],{"text":51,"config":520},{"href":53,"dataGaName":54,"dataGaLocation":483},{"text":372,"config":522},{"href":374,"dataGaName":375,"dataGaLocation":483},{"text":377,"config":524},{"href":379,"dataGaName":380,"dataGaLocation":483},{"text":526,"config":527},"Statut",{"href":528,"dataGaName":529,"dataGaLocation":483},"https://status.gitlab.com/","status",{"text":531,"config":532},"Conditions d'utilisation",{"href":533,"dataGaName":534,"dataGaLocation":483},"/terms/","terms of use",{"text":536,"config":537},"Politique de confidentialité",{"href":538,"dataGaName":539,"dataGaLocation":483},"/fr-fr/privacy/","privacy statement",{"text":541,"config":542},"Gérer vos cookies",{"dataGaName":543,"dataGaLocation":483,"id":544,"isOneTrustButton":15},"cookie preferences","ot-sdk-btn",{"title":91,"links":546,"subMenu":555},[547,551],{"text":548,"config":549},"Plateforme DevSecOps",{"href":73,"dataGaName":550,"dataGaLocation":483},"devsecops platform",{"text":552,"config":553},"Développement assisté par l'IA",{"href":80,"dataGaName":554,"dataGaLocation":483},"ai-assisted development",[556],{"title":557,"links":558},"Thèmes",[559,563,568,573,578,583,588,593],{"text":111,"config":560},{"href":561,"dataGaName":562,"dataGaLocation":483},"/fr-fr/topics/ci-cd/","cicd",{"text":564,"config":565},"GitOps",{"href":566,"dataGaName":567,"dataGaLocation":483},"/fr-fr/topics/gitops/","gitops",{"text":569,"config":570},"DevOps",{"href":571,"dataGaName":572,"dataGaLocation":483},"/fr-fr/topics/devops/","devops",{"text":574,"config":575},"Contrôle de version",{"href":576,"dataGaName":577,"dataGaLocation":483},"/fr-fr/topics/version-control/","version control",{"text":579,"config":580},"DevSecOps",{"href":581,"dataGaName":582,"dataGaLocation":483},"/fr-fr/topics/devsecops/","devsecops",{"text":584,"config":585},"Cloud-native",{"href":586,"dataGaName":587,"dataGaLocation":483},"/fr-fr/topics/cloud-native/","cloud native",{"text":589,"config":590},"IA pour la programmation",{"href":591,"dataGaName":592,"dataGaLocation":483},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":594,"config":595},"IA agentique",{"href":596,"dataGaName":597,"dataGaLocation":483},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":599,"links":600},"Solutions",[601,604,606,611,614,617,620,623,626,629,632,637],{"text":136,"config":602},{"href":131,"dataGaName":603,"dataGaLocation":483},"Application Security Testing",{"text":123,"config":605},{"href":107,"dataGaName":108,"dataGaLocation":483},{"text":607,"config":608},"Développement Agile",{"href":609,"dataGaName":610,"dataGaLocation":483},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":118,"config":612},{"href":120,"dataGaName":613,"dataGaLocation":483},"source code management",{"text":111,"config":615},{"href":113,"dataGaName":616,"dataGaLocation":483},"continuous integration & delivery",{"text":162,"config":618},{"href":164,"dataGaName":619,"dataGaLocation":483},"value stream management",{"text":564,"config":621},{"href":622,"dataGaName":567,"dataGaLocation":483},"/fr-fr/solutions/gitops/",{"text":624,"config":625},"Entreprises",{"href":178,"dataGaName":179,"dataGaLocation":483},{"text":627,"config":628},"PME",{"href":184,"dataGaName":185,"dataGaLocation":483},{"text":630,"config":631},"Secteur public",{"href":190,"dataGaName":191,"dataGaLocation":483},{"text":633,"config":634},"Éducation",{"href":635,"dataGaName":636,"dataGaLocation":483},"/fr-fr/solutions/education/","education",{"text":638,"config":639},"Services financiers",{"href":640,"dataGaName":641,"dataGaLocation":483},"/fr-fr/solutions/finance/","financial services",{"title":198,"links":643},[644,646,648,650,653,655,657,659,661,663,665,667],{"text":211,"config":645},{"href":213,"dataGaName":214,"dataGaLocation":483},{"text":216,"config":647},{"href":218,"dataGaName":219,"dataGaLocation":483},{"text":221,"config":649},{"href":223,"dataGaName":224,"dataGaLocation":483},{"text":226,"config":651},{"href":228,"dataGaName":652,"dataGaLocation":483},"docs",{"text":249,"config":654},{"href":251,"dataGaName":252,"dataGaLocation":483},{"text":244,"config":656},{"href":246,"dataGaName":247,"dataGaLocation":483},{"text":254,"config":658},{"href":256,"dataGaName":257,"dataGaLocation":483},{"text":262,"config":660},{"href":264,"dataGaName":265,"dataGaLocation":483},{"text":267,"config":662},{"href":269,"dataGaName":270,"dataGaLocation":483},{"text":272,"config":664},{"href":274,"dataGaName":275,"dataGaLocation":483},{"text":277,"config":666},{"href":279,"dataGaName":280,"dataGaLocation":483},{"text":282,"config":668},{"href":284,"dataGaName":285,"dataGaLocation":483},{"title":301,"links":670},[671,673,675,677,679,681,683,688,693,695,697,699],{"text":309,"config":672},{"href":311,"dataGaName":303,"dataGaLocation":483},{"text":314,"config":674},{"href":316,"dataGaName":317,"dataGaLocation":483},{"text":322,"config":676},{"href":324,"dataGaName":325,"dataGaLocation":483},{"text":327,"config":678},{"href":329,"dataGaName":330,"dataGaLocation":483},{"text":332,"config":680},{"href":334,"dataGaName":335,"dataGaLocation":483},{"text":337,"config":682},{"href":339,"dataGaName":340,"dataGaLocation":483},{"text":684,"config":685},"Développement durable",{"href":686,"dataGaName":687,"dataGaLocation":483},"/sustainability/","Sustainability",{"text":689,"config":690},"Diversité, inclusion et appartenance (DIB)",{"href":691,"dataGaName":692,"dataGaLocation":483},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":342,"config":694},{"href":344,"dataGaName":345,"dataGaLocation":483},{"text":352,"config":696},{"href":354,"dataGaName":355,"dataGaLocation":483},{"text":357,"config":698},{"href":359,"dataGaName":360,"dataGaLocation":483},{"text":700,"config":701},"Déclaration de transparence sur l'esclavage moderne",{"href":702,"dataGaName":703,"dataGaLocation":483},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":705},[706,708,711],{"text":531,"config":707},{"href":533,"dataGaName":534,"dataGaLocation":483},{"text":709,"config":710},"Gestion des cookies",{"dataGaName":543,"dataGaLocation":483,"id":544,"isOneTrustButton":15},{"text":536,"config":712},{"href":538,"dataGaName":539,"dataGaLocation":483},[714],{"id":715,"title":9,"body":26,"config":716,"content":718,"description":26,"extension":722,"meta":723,"navigation":15,"path":724,"seo":725,"stem":726,"__hash__":727},"blogAuthors/en-us/blog/authors/patrick-steinhardt.yml",{"template":717},"BlogAuthor",{"name":9,"config":719},{"headshot":720,"ctfId":721},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661952/Blog/Author%20Headshots/pks-gitlab-headshot.png","pksgitlab","yml",{},"/en-us/blog/authors/patrick-steinhardt",{},"en-us/blog/authors/patrick-steinhardt","SV9Yd_vW69UbvntDP-SEOV9NKT_VwUAj5nfftf2ElSw",[729,740,753],{"content":730,"config":738},{"title":731,"description":732,"body":733,"category":11,"tags":734,"date":735,"heroImage":736,"authors":737},"Nouveautés de Git 2.54.0","Découvrez les contributions à cette release de Git 2.54.0, notamment la nouvelle maintenance des dépôts, une nouvelle commande pour modifier l'historique des commits, le remplacement de git-sizer(1) et plus encore.","Le projet Git a récemment publié [Git 2.54.0](https://lore.kernel.org/git/xmqqa4uxsjrs.fsf@gitster.g/T/#u). Passons en revue quelques-unes des nouveautés marquantes de cette release, qui comprend des contributions de l'équipe Git chez GitLab.\n\n\n## Bases de données d'objets modulaires\n\n\n[Git](https://about.gitlab.com/fr-fr/blog/what-is-git/ \"Qu'est-ce que Git ?\") offre déjà la possibilité de stocker les références avec le backend « files » ou avec le [backend « reftable »](https://about.gitlab.com/fr-fr/blog/a-beginners-guide-to-the-git-reftable-format/). Ce scénario est rendu possible grâce à des abstractions appropriées dans Git qui permettent de disposer de différents backends.\n\n\nMais les références ne constituent qu'un des deux types importants de données stockées dans les dépôts, l'autre étant les objets. Les objets sont stockés dans la base de données d'objets, et chaque base de données d'objets est à son tour composée de plusieurs sources d'objets à partir desquelles les objets peuvent être lus ou écrits. Chaque source d'objets stocke soit des objets individuels sous forme d'objets dits « libres », soit compresse plusieurs objets dans un fichier d'empaquetage (« packfile ») dans le répertoire `.git/objects`.\n\n\nJusqu'à présent, cependant, ces sources ne disposaient pas d'une couche d'abstraction appropriée, de sorte que le format de stockage des objets était entièrement codé en dur dans Git. Mais les choses changent enfin avec les bases de données d'objets enfichables. Le concept est simple et similaire à ce qui a été fait pour les références par le passé : au lieu de chemins de code en dur pour le stockage des objets, nous introduisons une couche d'abstraction qui permet de disposer de différents backends pour le stockage des objets.\n\n\nSi l'idée est simple, la mise en œuvre ne l'est pas, car les spécificités des formats de stockage sont codées en dur partout dans Git. En réalité, nous avons commencé à travailler sur ce projet dès Git 2.48, qui a été publié en janvier 2025. Dans un premier temps, nous nous sommes concentrés sur l'encapsulation des sous-systèmes liés aux objets et sur la création de sous-systèmes dédiés pour les backends existants dans Git.\n\n\nAvec Git 2.54, nous franchissons une étape importante : le backend de la base de données d'objets est désormais modulaire. Toutes les fonctionnalités de Git ne sont pas encore couvertes, mais l'introduction d'un backend alternatif capable de gérer un sous-ensemble significatif d'opérations est désormais un objectif réaliste.\n\n\nPour l'instant, seuls les workflows locaux comme la création de commits, l'affichage de graphes de commits ou l'exécution de merges fonctionneront avec une telle implémentation alternative. Cette approche exclut notamment tout ce qui interagit avec un dépôt distant, comme les opérations de récupération ou de push de modifications. Quoi qu'il en soit, il s'agit de l'aboutissement de près de deux ans de travail, répartis sur près de 400 commits fusionnés en amont, et nous continuerons bien entendu à itérer.\n\n\nMais pourquoi ce projet est-il important ? L'objectif est de simplifier l'introduction de nouveaux formats de stockage dans Git. Voici quelques exemples :\n\n- Un format de stockage capable de gérer les fichiers binaires volumineux de manière plus efficace que les fichiers d'empaquetage actuels\n\n- Un format de stockage sur mesure pour GitLab afin de garantir que nous puissions servir les dépôts à nos utilisateurs de manière encore plus efficace qu'actuellement\n\n\nIl s'agit d'un effort à grande échelle qui est susceptible de façonner l'avenir de Git et de GitLab.\n\n\n*Ce projet a été mené par [Patrick Steinhardt](https://gitlab.com/pks-gitlab).*\n\n\n## Modification simplifiée de votre historique de commits\n\n\nDans de nombreux projets de développement logiciel, il est courant pour les développeurs de ne pas seulement peaufiner le code qu'ils souhaitent soumettre, mais aussi de soigner l'historique des commits afin de faciliter la revue. Le résultat est un ensemble de commits petits et atomiques, chacun dédié à une seule tâche, accompagné d'un bon message de commit qui décrit l'intention ainsi que les nuances spécifiques.\n\n\nBien entendu, ces commits atomiques ne sont le plus souvent pas le fruit naturel du processus de développement. L'auteur des modifications acquiert plutôt une meilleure compréhension au fur et à mesure des itérations, et la manière de découper les commits se clarifie avec le temps. De plus, le processus de revue qui s'ensuit peut donner lieu à des retours nécessitant des modifications des commits déjà préparés.\n\n\nPar conséquent, le développeur devra réécrire son historique de commits de nombreuses fois au cours du développement. Git offre depuis longtemps cette possibilité via les [rebasages interactifs](https://git-scm.com/docs/git-rebase#_interactive_mode). Ces rebasages interactifs sont un outil extrêmement puissant : ils permettent de réordonner les commits, de réécrire les messages de commits, de regrouper plusieurs commits ou d'effectuer des modifications arbitraires sur n'importe quel commit.\n\n\nMais ils sont aussi quelque peu obscurs et difficiles à appréhender. L'utilisateur doit identifier le commit de base pour le rebasage, comprendre comment modifier une « feuille d'instructions » assez obscure et connaître le fonctionnement à état du processus de rebasage. Par exemple, les utilisateurs se voient présenter une feuille d'instructions similaire à celle ci-dessous lors du rebasage d'une branche thématique :\n\n```shell\npick b60623f382 # t: detect errors outside of test cases # empty\npick b80cb55882 # t: prepare `test_match_signal ()` calls for `set -e`\npick 5ffe397f30 # t: prepare `test_must_fail ()` for `set -e`\npick 5e9b0cf5e1 # t: prepare `stop_git_daemon ()` for `set -e`\npick 299561e7a2 # t: prepare `git config --unset` calls for `set -e`\npick ed0e7ca2b5 # t: detect errors outside of test cases\n```\n\nAinsi, bien que les rebasages interactifs soient puissants, ils restent assez intimidants pour l'utilisateur moyen.\n\n\nMais ce n'est pas une fatalité. Des outils comme [Jujutsu](https://www.jj-vcs.dev/latest/) offrent des interfaces beaucoup plus simples d'utilisation par rapport à Git, puisqu'il suffit par exemple d'exécuter `jj split` pour diviser un commit en deux. Avec Git et les rebasages interactifs, ce cas d'utilisation requiert de nombreuses étapes avec des arguments en ligne de commande peu explicites.\n\n\nNous nous sommes donc inspirés de Jujutsu et avons introduit dans Git une nouvelle commande git-history(1), qui constitue le socle d'une meilleure modification de l'historique. Pour l'instant, cette commande dispose de deux sous-commandes :\n\n\n- `git history reword` vous permet de réécrire facilement un message de commit. Il vous suffit d'indiquer le commit que vous souhaitez mieux documenter, Git vous demande le nouveau message de commit, et c'est terminé.\n\n- `git history split` vous permet de diviser un commit en deux, à l'image de `jj split`. Vous indiquez un commit, Git vous demande quelles modifications mettre dans quel commit ainsi que les deux messages de commit, et c'est terminé.\n\n\nCe n'est bien sûr qu'un début, et nous souhaitons ajouter des sous-commandes supplémentaires au fil du temps. Par exemple :\n\n\n- `git history fixup` pour prendre les modifications indexées et les intégrer automatiquement à un commit spécifique\n\n- `git history drop` pour supprimer un commit\n\n- `git history reorder` pour réordonner la séquence de commits\n\n- `git history squash` pour regrouper une série de commits\n\n\nMais ce n'est pas tout. En plus de simplifier la modification de l'historique, cette nouvelle commande sait aussi rebaser automatiquement toutes vos branches locales qui incluaient précédemment ce commit. Cela signifie que vous pouvez modifier un commit qui ne se trouve pas sur la branche courante, et toutes les branches contenant ce commit seront réécrites.\n\n\nAu premier abord, il peut sembler surprenant que Git rebase automatiquement les branches dépendantes, car cela constitue une divergence significative par rapport au fonctionnement de git-rebase(1). Mais cela s'inscrit dans un effort plus large visant à améliorer la prise en charge des « diffs empilés » (« Stacked Diffs ») dans Git, une méthode permettant de créer une série de plusieurs branches dépendantes pouvant être revues indépendamment, mais qui concourent ensemble à un objectif plus vaste.\n\n\n*Ce projet a été mené par [Patrick Steinhardt](https://gitlab.com/pks-gitlab) avec le soutien d'[Elijah Newren](https://github.com/newren).*\n\n\n## Remplacement natif de git-sizer(1)\n\n\nLa taille d'un dépôt Git est un facteur important qui détermine la capacité de Git et de GitLab à le gérer efficacement. Mais la taille n'est pas le seul facteur, car les performances d'un dépôt résultent en définitive d'une combinaison de plusieurs aspects :\n\n\n- La taille de l'historique des commits\n\n- La structure de l'arborescence des répertoires\n\n- La taille des fichiers stockés dans le dépôt\n\n- Le nombre de références\n\n\nCe ne sont là que quelques-uns des aspects à prendre en compte pour prédire si Git sera en mesure de gérer correctement un dépôt.\n\n\nBien qu'il soit clair que la simple taille du dépôt est insuffisante, Git ne fournit en soi aucun outil offrant à l'utilisateur une vue d'ensemble claire de ces indicateurs. Les utilisateurs sont contraints de s'appuyer sur des outils tiers comme [git-sizer(1)](https://github.com/github/git-sizer) pour combler cette lacune. Cet outil fait un excellent travail pour afficher ces informations, mais il ne fait pas partie de Git et doit donc être installé séparément.\n\n\nL'observabilité des composants internes d'un dépôt est essentielle chez GitLab. C'est pourquoi nous avons introduit [une nouvelle sous-commande `git repo structure` dans Git 2.52](https://about.gitlab.com/fr-fr/blog/whats-new-in-git-2-52-0/#new-subcommand-for-git-repo1-to-display-repository-metrics) pour afficher les indicateurs du dépôt, que nous avons étendue dans Git 2.53 pour [afficher les tailles décompressées et sur disque des objets par type](https://about.gitlab.com/fr-fr/blog/whats-new-in-git-2-53-0/#more-data-collected-in-git-repo-structure).\n\n\nDans Git 2.54, nous itérons davantage sur cette commande afin de ne pas seulement afficher la taille globale, mais aussi les objets les plus volumineux par type :\n\n```shell\n$ git clone https://gitlab.com/git-scm/git.git\n$ cd git\n$ git repo structure\nCounting objects: 410445, done.\n| Repository structure      | Value       |\n| ------------------------- | ----------- |\n| * References              |             |\n|   * Count                 |    1.01 k   |\n|     * Branches            |       1     |\n|     * Tags                |    1.00 k   |\n|     * Remotes             |       9     |\n|     * Others              |       0     |\n|                           |             |\n| * Reachable objects       |             |\n|   * Count                 |  410.45 k   |\n|     * Commits             |   83.99 k   |\n|     * Trees               |  164.46 k   |\n|     * Blobs               |  161.00 k   |\n|     * Tags                |    1.00 k   |\n|   * Inflated size         |    7.46 GiB |\n|     * Commits             |   57.53 MiB |\n|     * Trees               |    2.33 GiB |\n|     * Blobs               |    5.07 GiB |\n|     * Tags                |  737.48 KiB |\n|   * Disk size             |  181.37 MiB |\n|     * Commits             |   33.11 MiB |\n|     * Trees               |   40.58 MiB |\n|     * Blobs               |  107.11 MiB |\n|     * Tags                |  582.67 KiB |\n|                           |             |\n| * Largest objects         |             |\n|   * Commits               |             |\n|     * Maximum size    [1] |   17.23 KiB |\n|     * Maximum parents [2] |      10     |\n|   * Trees                 |             |\n|     * Maximum size    [3] |   58.85 KiB |\n|     * Maximum entries [4] |    1.18 k   |\n|   * Blobs                 |             |\n|     * Maximum size    [5] | 1019.51 KiB |\n|   * Tags                  |             |\n\n|     * Maximum size    [6] |    7.13 KiB |\n\n[1] f6ecb603ff8af608a417d7724727d6bc3a9dbfdf\n[2] 16d7601e176cd53f3c2f02367698d06b85e08879\n[3] 203ee97047731b9fd3ad220faa607b6677861a0d\n[4] 203ee97047731b9fd3ad220faa607b6677861a0d\n[5] aa96f8bc361fd84a1459440f1e7de02ab0dc3543\n[6] 07e38db6a5a03690034d27104401f6c8ea40f1fc\n```\n\nAvec ces informations, nous sommes désormais presque au niveau de parité fonctionnelle avec git-sizer(1). Nous n'avons cependant pas encore terminé : nous prévoyons à terme d'ajouter des fonctionnalités supplémentaires telles que :\n\n\n- Des niveaux de gravité tels qu'ils existent dans git-sizer(1)\n\n- Des graphes affichant la distribution des tailles d'objets\n\n- La possibilité de scanner les objets accessibles via un sous-ensemble de références\n\n\n*Ce projet a été mené par [Justin Tobler](https://gitlab.com/justintobler).*\n\n\n## Nouvelle infrastructure pour la maintenance des dépôts\n\n\nChaque fois que vous écrivez des données dans un dépôt Git, vous ajoutez généralement de nouveaux objets libres. Sans intervention, vous obtiendrez un grand nombre de fichiers distincts dans votre répertoire `.git/objects/`, ce qui ralentit plusieurs opérations nécessitant l'accès à de nombreux objets simultanément. Git compresse donc régulièrement ces objets dans des fichiers d'empaquetage pour garantir de bonnes performances.\n\n\nCe n'est pas la seule structure de données susceptible de perdre en efficacité au fil du temps : la mise à jour des références peut créer des références libres, les reflogs doivent être allégés, les arbres de travail peuvent devenir obsolètes et les caches comme les graphes de commits doivent être actualisés régulièrement.\n\n\nHistoriquement, toutes ces tâches étaient gérées par [git-gc(1)](https://git-scm.com/docs/git-gc). Cependant, cet outil possède une architecture monolithique, exécutant essentiellement toutes les tâches requises dans un ordre séquentiel. Cette base est difficile à étendre et n'offre pas à l'utilisateur beaucoup de flexibilité s'il souhaite modifier légèrement la façon dont la maintenance est effectuée.\n\n\nLe projet Git a introduit le nouvel outil [git-maintenance(1)](https://git-scm.com/docs/git-maintenance) dans Git 2.29. Contrairement à git-gc(1), git-maintenance(1) n'est pas monolithique mais est structuré autour de tâches. Ces tâches sont librement configurables par l'utilisateur, ce qui lui offre un contrôle beaucoup plus précis sur la maintenance du dépôt.\n\n\nAu bout du compte, Git a migré vers git-maintenance(1) par défaut. Mais au départ, la seule tâche activée par défaut était la tâche git-gc(1) qui, comme vous l'aurez deviné, exécute simplement `git gc`. Pour lancer manuellement la maintenance avec cette nouvelle commande, il suffit d'exécuter `git maintenance run`, mais Git sait l'exécuter automatiquement à la suite de plusieurs autres commandes.\n\n\nAu cours des dernières releases, nous avons implémenté toutes les tâches individuelles prises en charge par git-gc(1) dans git-maintenance(1) afin de garantir la parité fonctionnelle entre ces deux outils.\n\n\nDe plus, nous avons implémenté une nouvelle tâche qui utilise l'architecture moderne de Git pour le rempaquetage d'objets avec le [compactage géométrique](https://git-scm.com/docs/git-repack#Documentation/git-repack.txt---geometricfactor). Le compactage géométrique est bien mieux adapté aux grands monorepos, et grâce à nos efforts, [intégrés dans Git 2.53](https://about.gitlab.com/fr-fr/blog/whats-new-in-git-2-53-0/#geometric-repacking-support-with-promisor-remotes), pour le faire fonctionner avec les clones partiels, il constitue désormais un remplacement complet de notre précédente stratégie de rempaquetage dans Git.\n\n\nAvec Git 2.54, nous avons franchi une autre étape importante : au lieu d'utiliser la stratégie basée sur git-gc(1) par défaut, nous utilisons désormais le rempaquetage géométrique avec des tâches de maintenance individuelles et granulaires. Outre son efficacité accrue pour les grands monorepos, il offre également une base plus facile à partir de laquelle itérer.\n\n\n*L'infrastructure de git-maintenance(1) a été initialement implémentée par [Derrick Stolee](https://github.com/derrickstolee), et la maintenance géométrique a été introduite par [Taylor Blau](https://github.com/ttaylorr). L'effort d'introduction des nouvelles tâches granulaires et de migration vers la nouvelle stratégie de maintenance a été mené par [Patrick Steinhardt](https://gitlab.com/pks-gitlab).*\n\n\n## Pour en savoir plus\n\n\nCet article n'a mis en évidence que quelques-unes des contributions apportées par GitLab et la communauté Git pour cette dernière release. Vous pouvez en apprendre davantage dans l'[annonce de release officielle](https://lore.kernel.org/git/xmqqa4uxsjrs.fsf@gitster.g/T/#u) du projet Git. Consultez également nos [articles de blog précédents sur les releases de Git](https://about.gitlab.com/fr-fr/blog/tags/git/) pour découvrir d'autres contributions des membres de l'équipe GitLab.",[21,22,270],"2026-04-27","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1776711651/sj7xxyyuimlarswbyft5.png",[9],{"featured":31,"template":13,"slug":739},"whats-new-in-git-2-54-0",{"content":741,"config":751},{"title":742,"description":743,"authors":744,"heroImage":746,"date":747,"body":748,"category":11,"tags":749},"GitLab AI Hackathon 2026 : découvrez les gagnants","Près de 7 000 développeurs ont créé plus de 600 agents et flows d'IA sur GitLab Duo Agent Platform. Découvrez les gagnants et leurs projets.",[745],"Nick Veenhof","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22","Il est désormais acquis que l'IA écrit du code. Mais qu'en est-il de la planification, de la sécurité, de la conformité et des déploiements ? Dans ces domaines, des lacunes persistent. Nous organisons des programmes de contribution depuis des années et n'avons jamais vu une communauté réagir à une technologie de cette manière.\n\nC'est pourquoi nous avons lancé [GitLab Duo Agent Platform](https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/) et invité des équipes de développement du monde entier à créer des agents d'IA qui aident les équipes à livrer des logiciels sécurisés plus rapidement. Pas des chatbots qui répondent à des questions, mais des agents qui s'intègrent dans les workflows, réagissent aux événements et agissent en votre nom. Le GitLab AI Hackathon 2026 s'est déroulé du 9 février au 25 mars 2026 sur Devpost, la plateforme dédiée aux hackathons. Google Cloud et Anthropic y ont participé en tant que co-sponsors.\n\nLorsque nous avons préparé ce hackathon avec Google Cloud et Anthropic, nous avons demandé aux juges d'évaluer quatre critères : la qualité technique, le design, l'impact potentiel et l'originalité de l'idée. Nous espérions une forte participation, mais les résultats nous ont tous surpris. Dix-neuf juges ont consacré 18 jours à examiner tous les projets. Google Cloud et Anthropic ont fourni les juges, les prix et un accès cloud. La communauté a créé des centaines d'agents et de flows afin de s'atteler aux lacunes mentionnées plus haut.\n\nPrès de 7 000 développeurs ont répondu à l'appel et créé plus de 600 agents et flows en quelques semaines. Les prix, toutes catégories confondues, totalisaient 65 000 dollars offerts par GitLab, Google Cloud et Anthropic.\n\n\nSi vous avez déjà vu un ingénieur senior quitter une équipe en emportant avec lui la moitié des connaissances de son équipe, vous comprendrez pourquoi le projet gagnant a autant marqué les esprits.\n\nPoursuivez votre lecture pour découvrir ce que les participants ont créé.\n\n## Premier prix : LORE\n\n[LORE](https://devpost.com/software/lore-living-organizational-record-engine), le Living Organizational Record Engine, utilise huit agents avec un routeur qui dirige chaque question vers l'agent approprié, une logique de prévention des boucles circulaires dans le graphe de connaissances, un tableau de bord visuel et un suivi de l'empreinte carbone. L'outil en ligne de commande est livré avec 43 tests (un chiffre inédit dans un projet de hackathon).\n\nLORE résout un problème concret : les connaissances des ingénieurs qui disparaissent lorsque ces derniers quittent l'entreprise. D'après notre expérience, un projet de hackathon avec 43 tests est rare. Un tel nombre en dit long sur l'équipe qui l'a conçu.\n\nApril Guo (Anthropic), membre du jury, a écrit : « On dirait un produit, pas un projet de hackathon. »\n\n\n### Gagnants Google Cloud\n\n[Gitdefender](https://devpost.com/software/gitdefender) a remporté le premier prix Google Cloud. L'outil s'intègre dans les workflows de revue de code afin de détecter et de corriger les vulnérabilités de sécurité. Il identifie les bogues, rédige des correctifs et ouvre la revue de code. Aucune intervention humaine n'est nécessaire.\n\n[Aegis](https://devpost.com/software/aegis-2m1oq0) a remporté le deuxième prix Google Cloud. L'outil fournit des explications assistées par l'IA pour chaque décision prise, qui est déployée sur Google Cloud et prête pour la production.\n\n### Gagnants Anthropic\n\n[GraphDev](https://devpost.com/software/graphdev) a remporté le premier prix Anthropic. L'outil cartographie les liens entre les éléments du code et montre comment les systèmes évoluent au fil du temps. Aboobacker MK (GitLab), membre du jury, a noté que le projet était « en phase avec notre travail sur le graphe de connaissances GitLab ». Ayush Billore (GitLab) a écrit : « J'ai adoré la démo et l'expérience utilisateur, un outil très utile pour comprendre comment le système a évolué et ce qui est impacté par les changements. » Vous pouvez visualiser l'impact complet d'une modification avant de l'autoriser.\n\n[DocSync](https://devpost.com/software/pipeheal) a remporté le deuxième prix Anthropic. L'outil utilise trois agents : Detector, Writer et Reviewer. Si DocSync a confiance dans le correctif, il ouvre une revue de code. Dans le cas contraire, il crée un ticket pour qu'un humain le vérifie.\n\n## Gagnants par catégorie\n\n### Projet le plus impressionnant sur le plan technique\n\nLes migrations de bases de données sont source de problèmes. [Time-Traveler](https://devpost.com/software/time-traveler-w3cxp0) crée une copie sécurisée de votre environnement de production, exécute la migration sur cette copie et génère un rapport. L'outil exécute cinq agents connectés par un pont, avec un déploiement réel sur Google Cloud, de véritables migrations PostgreSQL et des données réelles.\n\n### Projet avec le plus grand impact\n\n[RedAgent](https://devpost.com/software/redagent) vérifie les rapports de sécurité générés par l'IA et comble le fossé de confiance entre les résultats de l'IA et l'action des équipes de développement. Si votre équipe utilise l'IA pour les scans de sécurité, vous connaissez ce problème. Certaines équipes ignorent les résultats de l'IA parce qu'elles ne peuvent pas les vérifier. RedAgent offre aux équipes un moyen de valider les résultats de l'IA avant qu'ils ne parviennent aux équipes de développement.\n\n### Projet le plus facile à utiliser\n\n[Launch Control](https://devpost.com/software/launch-control-bgp8az) offre une expérience utilisateur soignée et une infrastructure solide, avec également de bons résultats en matière de durabilité.\n\n## Le signal de durabilité\n\nCinq projets ont remporté des prix ou des bonus pour leur impact environnemental. La livraison logicielle a un coût carbone lié aux pipelines CI/CD, et désormais les grands modèles de langage (LLM) consomment également des ressources de calcul à grande échelle. Nous avons créé la catégorie Green Agent pour inciter les équipes de développement à mesurer et réduire cette empreinte. Stacy Cline et Kim Buncle, de l'équipe durabilité de GitLab, ont participé au jury de la catégorie Green Agent.\n\n### Prix Green Agent\n\n[GreenPipe](https://devpost.com/software/greenpipe) analyse les pipelines CI/CD pour évaluer leur impact environnemental et produit des rapports d'empreinte carbone. Kim Buncle et Rajesh Agadi (Google), membres du jury, ont tous deux soutenu le projet.\n\n### Prix bonus consacrés au design durable\n\nLes prix bonus consacrés au design durable ont été attribués aux projets ayant adopté des pratiques de durabilité exceptionnelles dans leur conception, des techniques d'optimisation des modèles aux choix d'architecture écoénergétique.\n\n* [BugFlow](https://devpost.com/software/bugflow-ai-regression-detective-ci-optimizer) a transformé un rapport de bogue en 10 correctifs en 20 minutes.\n* [DELTA Cyber Reasoning](https://devpost.com/software/delta-cyber-reasoning-system) propose des tests à données aléatoires automatisés pour la sécurité.\n* [CarbonLint](https://devpost.com/software/carbonlint) applique l'analyse de code à la consommation énergétique.\n* [TFGuardian](https://devpost.com/software/tfguardian) intègre un analyseur d'empreinte carbone, entre autres agents.\n\nFélicitations à tous les lauréats des prix bonus consacrés au design durable !\n\nJens-Joris Decorte (TechWolf), membre du jury, a mentionné que les coûts étaient passés de 556 $ à 18 $ par mois, soit une réduction de 96 % de l'empreinte carbone (une économie mensuelle de 538 $ assortie d'un label de durabilité).\n\n## Mentions honorables et projets remarquables\n\nSix projets ont reçu des mentions honorables :\n\n\n- [SecurityMonkey](https://devpost.com/software/securitymonkey) injecte des vulnérabilités connues dans une branche de test et évalue la capacité de vos scanners de sécurité à les détecter.\n- [stregent](https://devpost.com/software/stregent) surveille les pipelines CI/CD et permet aux équipes de développement d'analyser et de fusionner des correctifs depuis WhatsApp, sans ouvrir un ordinateur portable.\n- [Compliance Sentinel](https://devpost.com/software/compliance-sentinel-autonomous-devsecops-governance) attribue un score de risque de conformité à chaque merge request et bloque le merge si des violations critiques sont détectées.\n- [Carbon Tracker](https://devpost.com/software/carbon-tracker-ij25kf) calcule l'empreinte carbone de chaque job de pipeline CI/CD et publie des conseils d'optimisation sur la merge request.\n- [RepoWarden](https://devpost.com/software/docuguard) est le premier Living Specification Engine, un système d'IA qui capture les raisons pour lesquelles le code a été écrit, et pas seulement ce qu'il fait.\n- [MR Compliance Auditor](https://devpost.com/software/mr-compliance-auditor) collecte des preuves à travers les merge requests, les associe aux contrôles SOC 2 et diffuse les scores de conformité sur un tableau de bord en temps réel.\n\nMa citation préférée du jury vient de Luca Chun Lun Lit (Anthropic), à propos de l'approche axée sur mobile de stregent : « Pouvoir coder depuis son téléphone représente un nouveau cap dans l'expérience d'ingénierie. »\n\n> Explorez les plus de 600 projets dans la [galerie de projets](https://gitlab.devpost.com/project-gallery).\n\n## Et ensuite ?\n\nChaque agent de ce hackathon fonctionnait au sein d'un seul projet. Les résultats obtenus étaient néanmoins impressionnants. Certains participants ont exécuté un graphe de connaissances local en parallèle de leurs agents pour faire émerger les relations et les dépendances au sein du dépôt. LORE capture l'historique du projet. Gitdefender détecte les vulnérabilités. Associer des agents à un contexte local plus riche aide déjà les contributeurs à créer des outils plus performants. Le prochain hackathon s'appuiera sur ce que les contributeurs font déjà avec un contexte enrichi. Inscrivez-vous sur [contributors.gitlab.com](https://contributors.gitlab.com/) pour être informé dès que les détails seront disponibles.\n\n\n## Lancez-vous\n\nUn grand merci à Lee Tickett (GitLab) et Mattias Michaux (GitLab) pour avoir guidé les innovateurs de ce hackathon !\n\nMerci à chaque développeur qui a soumis un projet. Près de 7 000 d'entre vous ont démontré ce que GitLab Duo Agent Platform peut accomplir lorsqu'une communauté décide de créer. Nous sommes fiers de ce que vous avez produit ici et avons hâte de voir ce que vous créerez ensuite.\n\nCréez votre propre agent sur [GitLab Duo Agent Platform](https://docs.gitlab.com/user/duo_agent_platform/). Parcourez les agents créés par la communauté dans le [catalogue d'IA](https://docs.gitlab.com/user/duo_agent_platform/ai_catalog/). Vous orchestrez les agents. L'IA accélère le développement.\n",[750,270],"AI/ML",{"featured":31,"template":13,"slug":752},"gitlab-ai-hackathon-2026-meet-the-winners",{"content":754,"config":763},{"tags":755,"category":11,"body":756,"date":757,"heroImage":758,"authors":759,"description":761,"title":762},[21,22,270],"Le projet Git a récemment publié [Git 2.53.0](https://lore.kernel.org/git/xmqq4inz13e3.fsf@gitster.g/T/#u). Passons en revue quelques points marquants de cette version, qui comprend des contributions de l'équipe Git chez GitLab.\n\n\n## Prise en charge du rempaquetage géométrique avec les dépôts distants promisor\n\n\nLes objets qui viennent d'être créés dans un dépôt Git sont souvent stockés sous forme de fichiers libres individuels. Pour garantir de bonnes performances et une utilisation optimale de l'espace disque, ces objets libres sont régulièrement compressés dans ce qu'on appelle des fichiers d'empaquetage (« packfiles »). Le nombre de fichiers d'empaquetage dans un dépôt augmente au fil du temps en raison des tâches effectuées, comme la création de nouveaux commits ou la récupération depuis un dépôt distant. À mesure que le nombre de fichiers d'empaquetage augmente dans un dépôt, Git doit effectuer davantage de travail pour rechercher des objets individuels. Par conséquent, pour préserver les performances optimales du dépôt, les fichiers d'empaquetage sont périodiquement rempaquetés via git-repack(1) afin de consolider les objets dans un nombre réduit de fichiers d'empaquetage. Lors du rempaquetage, deux stratégies existent : « tout-en-un » et « géométrique ».\n\n\nLa stratégie tout-en-un est assez simple et constitue la stratégie par défaut actuelle. Comme son nom l'indique, tous les objets du dépôt sont empaquetés dans un seul fichier. Cette approche est idéale pour le dépôt d'un point de vue des performances, car Git n'a besoin de parcourir qu'un seul fichier d'empaquetage lors de la recherche d'objets. Le principal inconvénient ? Le calcul d'un fichier d'empaquetage unique pour un dépôt peut prendre beaucoup de temps en cas de dépôt volumineux.\n\n\nLa stratégie géométrique permet d'atténuer ce problème en maintenant une progression géométrique des fichiers d'empaquetage en fonction de leur taille, au lieu de toujours rempaqueter dans un seul fichier. Lors du rempaquetage, Git maintient un ensemble de fichiers d'empaquetage classés par taille, où chaque fichier de la séquence doit avoir au moins deux fois la taille du fichier d'empaquetage précédent. Si un fichier d'empaquetage de la séquence enfreint cette propriété, les fichiers d'empaquetage sont combinés selon les besoins jusqu'à ce que la progression soit rétablie. Cette stratégie permet de limiter le nombre de fichiers d'empaquetage dans un dépôt tout en minimisant également la quantité de travail à effectuer pour la plupart des opérations de rempaquetage.\n\n\nToutefois, la stratégie de rempaquetage géométrique n'était pas compatible avec les clones partiels. Ces derniers permettent de cloner uniquement certaines parties d'un dépôt (par exemple en ignorant tous les blobs de plus de 1 mégaoctet). Cette approche peut réduire considérablement la taille d'un dépôt, et Git sait comment récupérer les objets manquants auxquels il doit accéder ultérieurement.\n\n\nRésultat : nous obtenons un dépôt dans lequel il manque certains objets. Tout objet qui pourrait ne pas être entièrement connecté est stocké dans un fichier d'empaquetage « promisor ». Lors du rempaquetage, cette propriété promisor doit être conservée pour les fichiers d'empaquetage contenant un objet promisor, afin qu'il soit possible de déterminer si un objet manquant est attendu et peut être récupéré depuis le dépôt distant promisor. Avec une stratégie de rempaquetage tout-en-un, Git sait gérer correctement les objets promisor et les stocke dans un fichier d'empaquetage promisor distinct. Malheureusement, la stratégie de rempaquetage géométrique ne savait pas comment accorder un traitement spécial aux fichiers d'empaquetage promisor et les fusionnait avec des fichiers d'empaquetage normaux sans tenir compte de la présence d'objets promisor. Heureusement, en raison d'un bogue, la commande git-pack-objects(1) sous-jacente échoue lors de l'utilisation du rempaquetage géométrique dans un dépôt de clone partiel. Les dépôts dans cette configuration ne pouvaient donc de toute façon pas être rempaquetés. Ce n'est pas idéal, mais c'est un résultat préférable à une corruption du dépôt.\n\n\nAvec la sortie de Git 2.53, le rempaquetage géométrique fonctionne désormais avec les dépôts de clones partiels. Lors d'un rempaquetage géométrique, les fichiers d'empaquetage promisor sont gérés séparément afin de préserver le marqueur promisor et sont rempaquetés selon une progression géométrique distincte. Avec ce correctif, la stratégie géométrique suit une progression logique en vue de s'imposer comme la stratégie de rempaquetage par défaut. Pour plus d'informations, consultez le [fil de discussion de la liste de diffusion](https://lore.kernel.org/git/20260105-pks-geometric-repack-with-promisors-v1-0-c4660573437e@pks.im/) correspondant.\n\n\nCe projet a été mené par [Patrick Steinhardt](https://gitlab.com/pks-gitlab).\n\n\n## git-fast-import(1) : préservation des signatures valides uniquement\n\n\nDans notre [article de blog consacré à la version Git 2.52](https://about.gitlab.com/fr-fr/blog/whats-new-in-git-2-52-0/), nous avons abordé les améliorations liées aux signatures apportées à git-fast-import(1) et git-fast-export(1). Consultez cet article pour une explication plus détaillée de ces commandes, de leur utilisation et des modifications apportées concernant les signatures.\n\n\nPour résumer brièvement, git-fast-import(1) fournit un backend qui permet d'importer efficacement des données dans un dépôt et qui est utilisé par des outils tels que [git-filter-repo(1)](https://github.com/newren/git-filter-repo) pour aider à réécrire l'historique d'un dépôt en masse. Dans la version Git 2.52, git-fast-import(1) a appris l'option `--signed-commits=\u003Cmode>`, qui est similaire à la même option dans git-fast-export(1). Avec cette option, il est devenu possible de conserver ou de supprimer de façon inconditionnelle les signatures des commits et des tags.\n\n\nDans les situations où seule une partie de l'historique du dépôt a été réécrite, toute signature pour les commits ou tags réécrits devient invalide. Cela signifie que git-fast-import(1) est limité : la commande peut soit supprimer toutes les signatures, soit les conserver même si elles sont devenues invalides. Mais conserver des signatures invalides n'est pas vraiment utile, c'est pourquoi la réécriture de l'historique avec git-repo-filter(1) entraîne la suppression de toutes les signatures, même si le commit ou tag sous-jacent n'est pas réécrit. Cette approche n'est pas idéale : si le commit ou tag ne change pas, sa signature est toujours valide et il n'y a donc aucune raison réelle de la supprimer. Nous avons en réalité besoin de préserver les signatures pour les objets inchangés, et de supprimer les signatures invalides.\n\n\nAvec la sortie de Git 2.53, l'option `--signed-commits=\u003Cmode>` de git-fast-import(1) a appris un nouveau mode `strip-if-invalid` qui, lorsqu'il est utilisé, supprime seulement les signatures devenues invalides des commits réécrits. Ainsi, avec cette option, il devient possible de préserver certaines signatures de commits lors de l'utilisation de git-fast-import(1). Il s'agit d'une étape critique vers la mise en place des bases qui permettent à des outils comme git-repo-filter(1) de préserver les signatures valides et, plus tard, de signer à nouveau les signatures invalides.\n\n\nCe projet a été mené par [Christian Couder](https://gitlab.com/chriscool).\n\n\n## Plus de données collectées dans git-repo-structure\n\n\nDans la version Git 2.52, la sous-commande « structure » a été introduite dans git-repo(1). L'objectif de cette commande était de collecter des informations sur le dépôt et de remplacer éventuellement nativement des outils tels que [git-sizer(1)](https://github.com/github/git-sizer). Chez GitLab, nous hébergeons des dépôts extrêmement volumineux, et disposer d'informations sur la structure générale d'un dépôt est essentiel pour comprendre ses performances. Dans cette version, la commande collecte désormais également des informations sur la taille totale des objets accessibles dans un dépôt afin d'aider à comprendre la taille globale du dépôt. Dans les données de sortie ci-dessous, vous pouvez voir que la commande collecte désormais à la fois les tailles totales décompressées et sur disque des objets accessibles par type.\n\n```shell\n$ git repo structure\n\n| Repository structure | Value      |\n| -------------------- | ---------- |\n| * References         |            |\n|   * Count            |   1.78 k   |\n|     * Branches       |      5     |\n|     * Tags           |   1.03 k   |\n|     * Remotes        |    749     |\n|     * Others         |      0     |\n|                      |            |\n| * Reachable objects  |            |\n|   * Count            | 421.37 k   |\n|     * Commits        |  88.03 k   |\n|     * Trees          | 169.95 k   |\n|     * Blobs          | 162.40 k   |\n|     * Tags           |    994     |\n|   * Inflated size    |   7.61 GiB |\n|     * Commits        |  60.95 MiB |\n|     * Trees          |   2.44 GiB |\n|     * Blobs          |   5.11 GiB |\n|     * Tags           | 731.73 KiB |\n|   * Disk size        | 301.50 MiB |\n|     * Commits        |  33.57 MiB |\n|     * Trees          |  77.92 MiB |\n|     * Blobs          | 189.44 MiB |\n|     * Tags           | 578.13 KiB |\n```\n\n\nVous aurez peut-être également remarqué que les valeurs de taille dans le tableau des données de sortie sont désormais également affichées de manière plus conviviale avec des unités. Dans les versions suivantes, nous espérons étendre davantage les données de sortie de cette commande pour fournir des éléments supplémentaires, tels que les objets individuels les plus volumineux du dépôt.\n\n\nCe projet a été mené par [Justin Tobler](https://gitlab.com/justintobler).\n\n\n## Pour en savoir plus\n\n\nCet article n'a mis en évidence que quelques-unes des contributions apportées par GitLab et la communauté Git pour cette dernière version. Vous pouvez en apprendre davantage sur ces contributions dans l'[annonce de version officielle](https://lore.kernel.org/git/xmqq4inz13e3.fsf@gitster.g/T/#u) du projet Git. Consultez également nos [articles de blog précédents sur les versions de Git](https://about.gitlab.com/fr-fr/blog/tags/git/) pour découvrir d'autres contributions des membres de l'équipe GitLab.","2026-02-03","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png",[760],"Justin Tobler","Découvrez les contributions à cette version, notamment les correctifs apportés au rempaquetage géométrique, une évolution des options de gestion des signatures de commits dans git-fast-import(1), et bien plus encore.","Nouveautés de Git 2.53.0",{"featured":31,"template":13,"slug":764},"whats-new-in-git-2-53-0",{"promotions":766},[767,781,793,805],{"id":768,"categories":769,"header":771,"text":772,"button":773,"image":778},"ai-modernization",[770],"ai-ml","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":774,"config":775},"Get your AI maturity score",{"href":776,"dataGaName":777,"dataGaLocation":252},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":779},{"src":780},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":782,"categories":783,"header":785,"text":772,"button":786,"image":790},"devops-modernization",[784,582],"product","Are you just managing tools or shipping innovation?",{"text":787,"config":788},"Get your DevOps maturity score",{"href":789,"dataGaName":777,"dataGaLocation":252},"/assessments/devops-modernization-assessment/",{"config":791},{"src":792},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":794,"categories":795,"header":797,"text":772,"button":798,"image":802},"security-modernization",[796],"security","Are you trading speed for security?",{"text":799,"config":800},"Get your security maturity score",{"href":801,"dataGaName":777,"dataGaLocation":252},"/assessments/security-modernization-assessment/",{"config":803},{"src":804},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":806,"paths":807,"header":810,"text":811,"button":812,"image":817},"github-azure-migration",[808,809],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":813,"config":814},"See how GitLab compares to GitHub",{"href":815,"dataGaName":816,"dataGaLocation":252},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":818},{"src":792},{"header":820,"blurb":821,"button":822,"secondaryButton":826},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":46,"config":823},{"href":824,"dataGaName":49,"dataGaLocation":825},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":51,"config":827},{"href":53,"dataGaName":54,"dataGaLocation":825},1777934830095]