[{"data":1,"prerenderedAt":1432},["ShallowReactive",2],{"/fr-fr/blog/keeping-git-commit-history-clean":3,"navigation-fr-fr":647,"banner-fr-fr":1082,"footer-fr-fr":1090,"blog-post-authors-fr-fr-Kushal Pandya":1329,"blog-related-posts-fr-fr-keeping-git-commit-history-clean":1344,"blog-promotions-fr-fr":1369,"next-steps-fr-fr":1423},{"id":4,"title":5,"authors":6,"body":8,"category":625,"date":626,"description":627,"extension":628,"externalUrl":629,"faq":629,"featured":630,"heroImage":631,"meta":632,"navigation":633,"path":634,"seo":635,"slug":639,"stem":640,"tags":641,"template":644,"updatedDate":645,"__hash__":646},"blogPosts/fr-fr/blog/keeping-git-commit-history-clean.md","Commits Git : comment et pourquoi maintenir un historique propre",[7],"Kushal Pandya",{"type":9,"value":10,"toc":612},"minimark",[11,23,28,31,34,37,53,67,70,74,77,80,125,128,166,169,173,179,182,220,230,239,243,249,255,258,268,280,288,291,294,315,318,324,339,348,354,360,363,368,372,375,378,384,391,409,423,426,432,435,441,447,460,465,468,474,478,481,484,491,591,594,598,607],[12,13,14,15,22],"p",{},"Les commits Git sont des éléments fondamentaux d’un ",[16,17,21],"a",{"href":18,"rel":19,"title":20},"https://git-scm.com/book/fr/v2/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git",[],"Dépôt Git","dépôt Git"," (Git Repository), sans oublier les messages de commit qui constituent un véritable journal de bord pour le dépôt. Au fur et à mesure que le projet ou le dépôt évolue dans le temps (avec l’ajout de nouvelles fonctionnalités, la correction de bugs, la refonte de l’architecture), les messages de commit permettent de suivre et de comprendre les modifications apportées. Ces messages doivent donc résumer de manière courte et précise les changements effectués.",[24,25,27],"h2",{"id":26},"quest-ce-quun-commit-git","Qu’est-ce qu’un commit Git ?",[12,29,30],{},"Les messages de commit Git sont les empreintes laissées sur le code que vous modifiez. Lorsque vous consultez votre code un an plus tard, avoir rédigé un message clair vous aide à comprendre plus facilement et rapidement les raisons derrière vos choix de développement. De plus, ces messages facilitent la collaboration avec vos collègues. Avec des commits Git isolés en fonction du contexte, il est plus rapide pour les développeurs et développeuses de détecter un bug introduit par un seul commit et d’y revenir dessus.",[12,32,33],{},"Dans le cadre de projets d’envergure, où de nombreuses parties sont ajoutées, modifiées ou supprimées constamment, s’assurer que les messages de commit soient correctement maintenus peut parfois être une tâche compliquée, particulièrement sur les projets qui s’étendent sur plusieurs semaines ou plusieurs mois.",[12,35,36],{},"Pour vous aider à maintenir un historique de commits Git précis, découvrez dans cet article un certain nombre de situations auxquelles les développeurs et développeuses peuvent être confrontés au quotidien :",[38,39,40,44,47,50],"ul",{},[41,42,43],"li",{},"Situation 1 : Je dois modifier le commit le plus récent",[41,45,46],{},"Situation 2 : Je dois modifier un commit Git spécifique",[41,48,49],{},"Situation 3 : Je dois ajouter, combiner ou supprimer un commit Git",[41,51,52],{},"Situation 4 : Mon historique de commits Git est incohérent, je veux repartir à zéro",[12,54,55,59,60,66],{},[56,57,58],"strong",{},"Remarque :"," cet article suppose que vous ayez déjà des connaissances sur les fondamentaux de Git comme le fonctionnement des branches, l’ajout de modifications non validées d’une branche à l'étape du staging et la validation des modifications. Vous souhaitez en savoir plus sur ces éléments ? Consultez notre ",[16,61,65],{"href":62,"rel":63,"title":64},"https://docs.gitlab.com/topics/git/",[],"Documentation GitLab sur Git","documentation"," avant de continuer la lecture de cet article.",[12,68,69],{},"Avant d’entrer dans le vif du sujet, regardons brièvement à quoi ressemble un workflow de développement dans le cadre d’un projet Ruby on Rails hypothétique.",[24,71,73],{"id":72},"exemple-de-commit-git","Exemple de commit Git",[12,75,76],{},"Dans cet exemple, nous avons besoin d’ajouter une vue de navigation sur la page d’accueil, ce qui implique la mise à jour et l’ajout de nombreux fichiers.",[12,78,79],{},"Voici le déroulement de l’ensemble du processus étape par étape :",[38,81,82,89,95,101,107,122],{},[41,83,84,85],{},"Vous commencez à travailler sur une fonctionnalité avec la mise à jour d’un fichier que nous appelons ",[86,87,88],"code",{},"application_controller.rb",[41,90,91,92],{},"Cette fonctionnalité requiert la mise à jour d’une vue : ",[86,93,94],{},"index.html.haml",[41,96,97,98],{},"Vous avez ajouté un partiel utilisé dans la page d’index : ",[86,99,100],{},"_navigation.html.haml",[41,102,103,104],{},"Les styles de la page doivent également être mis à jour pour refléter le partiel ajouté : ",[86,105,106],{},"styles.css.scss",[41,108,109,110],{},"La fonctionnalité est maintenant prête avec les modifications souhaitées, il est temps de mettre à jour les tests. Les fichiers à mettre à jour sont :",[38,111,112,117],{},[41,113,114],{},[86,115,116],{},"application_controller_spec.rb",[41,118,119],{},[86,120,121],{},"navigation_spec.rb",[41,123,124],{},"Les tests sont mis à jour et fonctionnent comme prévu. Désormais, il est temps de valider les changements.",[12,126,127],{},"Puisque tous les fichiers appartiennent à différentes parties de l’architecture, nous validons les modifications de manière isolée les unes des autres afin d’assurer que chaque commit représente un certain contexte et soit dans le bon ordre. Les changements des commits Git s’ordonnent généralement comme suit : en commençant par le backend, suivi de la couche intermédiaire puis du frontend.",[129,130,131,143,152,159],"ol",{},[41,132,133,135,136,138,139,142],{},[86,134,88],{}," & ",[86,137,116],{}," ; ",[56,140,141],{},"Add routes for navigation",".",[41,144,145,135,147,138,149,142],{},[86,146,100],{},[86,148,121],{},[56,150,151],{},"Page Navigation View",[41,153,154,138,156,142],{},[86,155,94],{},[56,157,158],{},"Render navigation partial",[41,160,161,138,163,142],{},[86,162,106],{},[56,164,165],{},"Add styles for navigation",[12,167,168],{},"Maintenant que nos changements sont validés, il est possible de créer une merge request (requête de fusion) avec la branche. Une fois la merge request ouverte, celle-ci est généralement examinée par un pair avant que les changements ne soient fusionnés dans la branche principale du dépôt Git. Maintenant, observons les différentes situations dans lesquelles vous pouvez vous trouver lors de la révision du code.",[24,170,172],{"id":171},"situation-1-comment-modifier-le-commit-git-le-plus-récent","Situation 1 : comment modifier le commit Git le plus récent ?",[12,174,175,176,178],{},"Imaginez que le relecteur examine le fichier ",[86,177,106],{}," et suggère une modification. Dans ce cas, il est très simple d’effectuer cette modification car les changements de la feuille de style font partie du dernier commit sur votre branche.",[12,180,181],{},"Voici comment s’y prendre :",[38,183,184,190,196,211,217],{},[41,185,186,187,189],{},"Vous effectuez directement les changements nécessaires dans ",[86,188,106],{}," dans votre branche actuelle.",[41,191,192,193,142],{},"Une fois les changements effectués, ajoutez ces modifications au staging; exécutez ",[86,194,195],{},"git add styles.css.scss",[41,197,198,199,142,202],{},"Dès que les changements sont pris en compte, ajoutez-les à votre dernier commit; exécutez la commande ",[86,200,201],{},"git commit --amend",[38,203,204],{},[41,205,206,207,210],{},"Explication de la commande : Ici, nous demandons à la commande ",[86,208,209],{},"git commit"," d’inclure tout ce qui est présent dans le staging au commit le plus récent.",[41,212,213,214,216],{},"Cela ouvrira votre dernier commit dans l’éditeur de texte défini par Git contenant le message de commit « ",[56,215,165],{}," ».",[41,218,219],{},"Comme nous avons seulement mis à jour la déclaration CSS, nous n’avons pas besoin de modifier le message de commit. À ce stade, vous pouvez simplement enregistrer et quitter l’éditeur de texte que Git a ouvert et vos changements apparaîtront dans le commit.",[12,221,222,223,226,227,229],{},"Puisque vous avez modifié un commit Git existant, vous devez pousser ces changements vers le dépôt distant (« remote repository ») grâce à la commande : ",[86,224,225],{},"git push --force-with-lease \u003Cremote_name> \u003Cbranch_name>",". Celle-ci va remplacer le commit ",[86,228,165],{}," sur le dépôt distant, par le commit mis à jour à l’instant dans notre dépôt local.",[12,231,232,233,238],{},"Gardez en tête que lorsque vous travaillez à plusieurs sur la même branche, le fait de pousser un commit de force peut causer des problèmes pour les autres utilisateurs. En effet, ces derniers peuvent rencontrer des difficultés au moment de pousser normalement leurs changements sur une branche distante contenant de nouveaux commits poussés de force. Par conséquent, utilisez cette fonctionnalité avec prudence. Apprenez-en davantage sur les ",[16,234,237],{"href":235,"rel":236,"title":237},"https://git-scm.com/docs/git-push/fr",[],"Git Push"," dans la documentation de Git.",[24,240,242],{"id":241},"situation-2-comment-modifier-les-changements-dun-commit-git-spécifique","Situation 2 : comment modifier les changements d’un commit Git spécifique ?",[12,244,245,246,248],{},"Dans l’exemple précédent, le changement du commit Git était plutôt simple car vous deviez seulement modifier le dernier commit Git. Maintenant, imaginons que le relecteur avait suggéré de modifier un élément dans ",[86,247,100],{},". Dans cette situation, la modification doit se faire au niveau du deuxième commit en partant du haut. Il est donc nécessaire d’employer une autre méthode pour le changer.",[12,250,251,252,142],{},"Chaque fois qu’un commit est effectué dans une branche, il est identifié par une chaîne de caractères représentant un hachage SHA-1. Cet identifiant unique permet de distinguer un commit d’un autre. Vous pouvez voir tous les commits précédents, ainsi que leurs hachages SHA-1 dans une branche en exécutant la commande ",[86,253,254],{},"git log",[12,256,257],{},"Vous obtiendrez alors un résultat qui ressemble à peu près à une liste où les commits les plus récents sont en haut :",[259,260,266],"pre",{"className":261,"code":263,"language":264,"meta":265},[262],"language-text","commit aa0a35a867ed2094da60042062e8f3d6000e3952 (HEAD -> add-page-navigation)\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 15:24:02 2024 +0530\n\n    Add styles for navigation\n\ncommit c22a3fa0c5cdc175f2b8232b9704079d27c619d0\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 08:42:52 2024 +0000\n\n    Render navigation partial\n\ncommit 4155df1cdc7be01c98b0773497ff65c22ba1549f\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 08:42:51 2024 +0000\n\n    Page Navigation View\n\ncommit 8d74af102941aa0b51e1a35b8ad731284e4b5a20\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 08:12:20 2024 +0000\n\n    Add routes for navigation\n\n","text","",[86,267,263],{"__ignoreMap":265},[12,269,270,271,274,275,277,278,142],{},"C’est ici que la commande ",[86,272,273],{},"git rebase"," entre en jeu. Chaque fois que vous souhaitez modifier un commit spécifique avec la commande ",[86,276,273],{},", vous devez d’abord rebaser votre branche en déplaçant le HEAD juste avant le commit que vous souhaitez modifier. Dans le cas présent, nous devons changer le commit ",[86,279,151],{},[12,281,282,287],{},[283,284],"img",{"alt":285,"src":286},"Commit Log","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398597/blog/Content%20Images/keeping-git-commit-history-clean/GitRebase.png","{: .shadow.center.medium}",[12,289,290],{},"Notez ici le hachage du commit qui se trouve juste avant celui que nous souhaitons modifier.",[12,292,293],{},"Copiez le hachage et effectuez les étapes suivantes :",[38,295,296,312],{},[41,297,298,299,302,303],{},"Rebasez la branche pour vous positionner sur le commit précédant votre commit cible. Exécutez ",[86,300,301],{},"git rebase -i 8d74af102941aa0b51e1a35b8ad731284e4b5a20",".\n",[38,304,305],{},[41,306,307,308,311],{},"Explication de la commande Git : ici, vous exécutez la commande ",[86,309,310],{},"rebase"," de Git en mode interactif avec le hachage SHA-1 comme commit sur lequel se rebaser.",[41,313,314],{},"Votre éditeur de texte s’ouvre et affiche tous vos commits effectués après le commit sur lequel vous vous rebasez.",[12,316,317],{},"Ce qui va correspondre à :",[259,319,322],{"className":320,"code":321,"language":264,"meta":265},[262],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\npick aa0a35a867e Add styles for navigation\n\n# Rebase 8d74af10294..aa0a35a867e onto 8d74af10294 (3 commands)\n#\n# Commands:\n# p, pick = use commit\n# r, reword = use commit, but edit the commit message\n# e, edit = use commit, but stop for amending\n# s, squash = use commit, but meld into previous commit\n# f, fixup = like \"squash\", but discard this commit's log message\n# x, exec = run command (the rest of the line) using shell\n# d, drop = remove Git commit\n#\n# These lines can be re-ordered; they are executed from top to bottom.\n#\n# If you remove a line here THAT COMMIT WILL BE LOST.\n#\n# However, if you remove everything, the rebase will be aborted.\n#\n# Note that empty commits are commented out\n",[86,323,321],{"__ignoreMap":265},[12,325,326,327,330,331,334,335,338],{},"Chaque commit est précédé du mot ",[86,328,329],{},"pick",". Ci-dessous, vous retrouverez tous les mots-clés disponibles. Pour éditer un commit, vous devez changer ",[86,332,333],{},"pick 4155df1cdc7 Page Navigation View"," en ",[86,336,337],{},"edit 4155df1cdc7 Page Navigation View",". Sauvegardez les changements et quittez l’éditeur.",[12,340,341,342,344,345,142],{},"Votre branche est désormais rebasée à l’endroit précédent le commit qui incluait ",[86,343,100],{},". Ouvrez le fichier et effectuez les modifications souhaitées selon les retours de vos pairs. Une fois les changements terminés, intégrez-les en exécutant ",[86,346,347],{},"git add _navigation.html.haml",[12,349,350,351,142],{},"Maintenant que les changements sont intégrés, il est temps de ramener la branche HEAD au commit initial (en incluant les modifications apportées). Exécutez ",[86,352,353],{},"git rebase -–continue",[12,355,356,357,359],{},"Votre éditeur par défaut s’ouvrira dans le terminal et affichera le message de commit modifié lors du rebasage : ",[86,358,151],{},". Vous pouvez modifier ce message si vous le souhaitez. Néanmoins, il est préférable de le laisser tel quel. Enregistrez et quittez l’éditeur.",[12,361,362],{},"À ce stade, Git réexécutera tous les commits qui ont suivi après le commit que vous venez de modifier et maintenant la branche HEAD est de retour au commit supérieur que vous aviez initialement. Il inclut également les nouveaux changements que vous avez apportés à l’un des commits.",[12,364,365,366,142],{},"Puisque vous avez modifié un commit déjà présent dans le dépôt distant, vous devez à nouveau pousser de force cette branche en exécutant : ",[86,367,225],{},[24,369,371],{"id":370},"situation-3-comment-ajouter-combiner-ou-supprimer-des-commits-git","Situation 3 : comment ajouter, combiner ou supprimer des commits Git ?",[12,373,374],{},"Il arrive régulièrement que l'on ajoute plusieurs commits pour corriger des éléments déjà validés. Il est possible de les réduire tout en les combinant avec les commits initiaux.",[12,376,377],{},"Pour cela, commencez le rebase interactif comme vous le feriez dans d’autres scénarios :",[259,379,382],{"className":380,"code":381,"language":264,"meta":265},[262],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\npick aa0a35a867e Add styles for navigation\npick 62e858a322 Fix a typo\npick 5c25eb48c8 Ops another fix\npick 7f0718efe9 Fix 2\npick f0ffc19ef7 Argh Another fix!\n",[86,383,381],{"__ignoreMap":265},[12,385,386,387,390],{},"Si vous souhaitez combiner toutes ces modifications dans ",[86,388,389],{},"c22a3fa0c5c Render navigation partial",", vous devez :",[38,392,393,396],{},[41,394,395],{},"Déplacer les corrections afin de les placer juste en-dessous du commit que vous désirez garder à la fin.",[41,397,398,399,334,401,404,405,408],{},"Changer ",[86,400,329],{},[86,402,403],{},"squash"," ou ",[86,406,407],{},"fixup"," pour chacune des modifications.",[12,410,411,415,416,418,419,422],{},[412,413,414],"em",{},"Remarque:"," ",[86,417,403],{}," conserve les messages de commit des corrections dans la description. ",[86,420,421],{},"Fixup"," oublie les messages de commit des corrections et conserve l’original.",[12,424,425],{},"Vous obtenez donc :",[259,427,430],{"className":428,"code":429,"language":264,"meta":265},[262],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\nfixup 62e858a322 Fix a typo\nfixup 5c25eb48c8 Ops another fix\nfixup 7f0718efe9 Fix 2\nfixup f0ffc19ef7 Argh Another fix!\npick aa0a35a867e Add styles for navigation\n",[86,431,429],{"__ignoreMap":265},[12,433,434],{},"Enregistrez les changements et quittez l’éditeur. Voici le résultat :",[259,436,439],{"className":437,"code":438,"language":264,"meta":265},[262],"pick 4155df1cdc7 Page Navigation View\npick 96373c0bcf Render navigation partial\npick aa0a35a867e Add styles for navigation\n",[86,440,438],{"__ignoreMap":265},[12,442,443,444,446],{},"Comme précédemment, vous avez juste besoin d’exécuter ",[86,445,225],{}," et les changements sont appliqués.",[12,448,449,450,453,454,456,457,459],{},"Si vous souhaitez supprimer un commit Git de la branche, utilisez plutôt la commande ",[86,451,452],{},"drop"," ou effacez la ligne. Nous conseillons d’éviter les commandes ",[86,455,403],{}," et ",[86,458,407],{}," pour cela.",[461,462,464],"h3",{"id":463},"comment-éviter-les-conflits-entre-commits","Comment éviter les conflits entre commits ?",[12,466,467],{},"Pour éviter tout conflit, assurez-vous que les commits que vous faites remonter n’impactent pas de fichiers modifiés par des commits suivants.",[259,469,472],{"className":470,"code":471,"language":264,"meta":265},[262],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\nfixup 62e858a322 Fix a typo                 # this changes styles.css\nfixup 5c25eb48c8 Ops another fix            # this changes image/logo.svg\nfixup 7f0718efe9 Fix 2                      # this changes styles.css\nfixup f0ffc19ef7 Argh Another fix!          # this changes styles.css\npick aa0a35a867e Add styles for navigation  # this changes index.html (no conflict)\n",[86,473,471],{"__ignoreMap":265},[24,475,477],{"id":476},"situation-4-mon-historique-de-commits-git-est-incohérent-comment-repartir-à-zéro","Situation 4 : mon historique de commits Git est incohérent, comment repartir à zéro ?",[12,479,480],{},"Pour une fonctionnalité importante, il est courant d'avoir plusieurs corrections et révisions fréquemment validées. Au lieu de rebaser constamment la branche, vous pouvez retarder le nettoyage des commits jusqu'à la fin du développement.",[12,482,483],{},"C'est là que la création de fichiers patch s’avère très utile. En fait, les fichiers patch étaient le moyen principal de partager du code par e-mail lors de la collaboration sur de grands projets open source avant que des services basés sur Git comme GitLab ne soient disponibles pour les développeurs et les développeuses.",[12,485,486,487,490],{},"Imaginez que vous avez une branche (par exemple ",[86,488,489],{},"add-page-navigation",") où il y a des tonnes de commits qui ne transmettent pas clairement les changements sous-jacents. Voici comment vous pouvez créer un fichier patch pour tous les changements apportés dans cette branche :",[38,492,493,500,513,542,545,548,557,567,576,579,585,588],{},[41,494,495,496,499],{},"La première étape pour créer ce fichier patch est de s’assurer que votre branche possède bien tous les changements présents dans la branche ",[86,497,498],{},"master"," et n’a pas de conflits avec celle-ci.",[41,501,502,503,404,506,509,510,512],{},"Vous pouvez exécuter ",[86,504,505],{},"git rebase master",[86,507,508],{},"git merge master"," pendant que vous êtes dans la branche ",[86,511,489],{}," pour obtenir tous les changements de la branche master sur votre branche.",[41,514,515,516,142,519],{},"Maintenant, créez le fichier patch. Pour ce faire, exécutez ",[86,517,518],{},"git diff master add-page-navigation > ~/add_page_navigation.patch",[38,520,521],{},[41,522,523,524,526,527,529,530,533,534,537,538,541],{},"Explication de la commande : nous utilisons la fonctionnalité diff de Git. Nous demandons une diff entre la branche ",[86,525,498],{}," et la branche ",[86,528,489],{},". Nous redirigeons le résultat (via le symbole ",[86,531,532],{},">",") vers un fichier nommé ",[86,535,536],{},"add_page_navigation.patch"," dans notre répertoire personnel (typiquement ",[86,539,540],{},"~/"," dans les systèmes d'exploitation *nix).",[41,543,544],{},"Vous pouvez spécifier n'importe quel chemin où vous souhaitez conserver ce fichier et choisir le nom et l’extension de ce fichier selon vos envies.",[41,546,547],{},"Une fois que la commande est exécutée et que vous ne voyez aucune erreur, votre fichier patch a bien été généré.",[41,549,550,551,553,554,142],{},"Maintenant, vérifiez la branche ",[86,552,498],{},". Exécutez ",[86,555,556],{},"git checkout master",[41,558,559,560,562,563,566],{},"Supprimez la branche ",[86,561,489],{}," du dépôt local. Exécutez ",[86,564,565],{},"git branch -D add-page-navigation",". Souvenez-vous que nous avons déjà effectué les modifications sur cette branche avec la création d’un fichier patch.",[41,568,569,570,572,573,142],{},"Créez une nouvelle branche avec le même nom (pendant que la branche ",[86,571,498],{}," est sélectionnée). Exécutez ",[86,574,575],{},"git checkout -b add-page-navigation",[41,577,578],{},"À ce stade, c'est une nouvelle branche qui n'a aucun de vos changements.",[41,580,581,582,142],{},"Enfin, appliquez vos changements à partir du fichier patch ",[86,583,584],{},"git apply ~/add_page_navigation.patch",[41,586,587],{},"Tous vos changements sont appliqués dans une branche et ils apparaîtront comme non validés, comme si toutes vos modifications avaient été faites, mais aucune d’entre elles n'avait été validées dans la branche.",[41,589,590],{},"Vous pouvez maintenant valider des fichiers individuels ou des fichiers groupés par zone d'impact dans l'ordre que vous souhaitez, avec de courts messages de commit.",[12,592,593],{},"Comme dans les situations précédentes, nous avons essentiellement modifié toute la branche. Il est donc temps de la pousser de force.",[24,595,597],{"id":596},"conclusion-sur-lhistorique-des-commits-git","Conclusion sur l'historique des commits Git",[12,599,600,601,142],{},"Bien que nous ayons couvert la plupart des situations qui surviennent dans un workflow avec Git, la réécriture de l’historique Git reste un vaste sujet. Au fur et à mesure que vous vous familiarisez avec les astuces mentionnées ci-dessus, vous pourrez apprendre des concepts plus avancés sur ce sujet dans la ",[16,602,606],{"href":603,"rel":604,"title":605},"https://git-scm.com/book/fr/v2/Utilitaires-Git-R%C3%A9%C3%A9crire-l%E2%80%99historique",[],"Documentation officielle de Git","documentation officielle de Git",[12,608,609],{},[412,610,611],{},"Photo par pan xiaozhen sur Unsplash.",{"title":265,"searchDepth":613,"depth":613,"links":614},2,[615,616,617,618,619,623,624],{"id":26,"depth":613,"text":27},{"id":72,"depth":613,"text":73},{"id":171,"depth":613,"text":172},{"id":241,"depth":613,"text":242},{"id":370,"depth":613,"text":371,"children":620},[621],{"id":463,"depth":622,"text":464},3,{"id":476,"depth":613,"text":477},{"id":596,"depth":613,"text":597},"engineering","2018-06-07","L’historique des commits Git peut rapidement devenir désorganisé. Dans cet article, vous découvrirez tous nos conseils pour y remédier.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659457/Blog/Hero%20Images/keep-git-commit-history-clean.jpg",{},true,"/fr-fr/blog/keeping-git-commit-history-clean",{"title":5,"description":627,"ogTitle":5,"ogDescription":627,"noIndex":630,"ogImage":631,"ogUrl":636,"ogSiteName":637,"ogType":638,"canonicalUrls":636},"https://about.gitlab.com/blog/keeping-git-commit-history-clean","https://about.gitlab.com","article","keeping-git-commit-history-clean","fr-fr/blog/keeping-git-commit-history-clean",[642,643],"git","workflow","BlogPost","2024-07-11","Pcj4ieDQFTQPqFFQGuoq2d74Q6C9AcBSPNZ_HxTaN6o",{"logo":648,"freeTrial":653,"sales":658,"login":663,"items":668,"search":997,"minimal":1033,"duo":1052,"switchNav":1061,"pricingDeployment":1072},{"config":649},{"href":650,"dataGaName":651,"dataGaLocation":652},"/fr-fr/","gitlab logo","header",{"text":654,"config":655},"Commencer un essai gratuit",{"href":656,"dataGaName":657,"dataGaLocation":652},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":659,"config":660},"Demander une démo",{"href":661,"dataGaName":662,"dataGaLocation":652},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":664,"config":665},"Connexion",{"href":666,"dataGaName":667,"dataGaLocation":652},"https://gitlab.com/users/sign_in/","sign in",[669,698,800,805,919,975],{"text":670,"config":671,"menu":673},"Plateforme",{"dataNavLevelOne":672},"platform",{"type":674,"columns":675},"cards",[676,682,690],{"title":670,"description":677,"link":678},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":679,"config":680},"Explorer notre plateforme",{"href":681,"dataGaName":672,"dataGaLocation":652},"/fr-fr/platform/",{"title":683,"description":684,"link":685},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":686,"config":687},"Découvrir GitLab Duo",{"href":688,"dataGaName":689,"dataGaLocation":652},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":691,"description":692,"link":693},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":694,"config":695},"En savoir plus",{"href":696,"dataGaName":697,"dataGaLocation":652},"/fr-fr/why-gitlab/","why gitlab",{"text":699,"left":633,"config":700,"menu":702},"Produit",{"dataNavLevelOne":701},"solutions",{"type":703,"link":704,"columns":708,"feature":779},"lists",{"text":705,"config":706},"Voir toutes les solutions",{"href":707,"dataGaName":701,"dataGaLocation":652},"/fr-fr/solutions/",[709,734,757],{"title":710,"description":711,"link":712,"items":717},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":713},{"icon":714,"href":715,"dataGaName":716,"dataGaLocation":652},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[718,722,725,730],{"text":719,"config":720},"CI/CD",{"href":721,"dataGaLocation":652,"dataGaName":719},"/fr-fr/solutions/continuous-integration/",{"text":683,"config":723},{"href":688,"dataGaLocation":652,"dataGaName":724},"gitlab duo agent platform - product menu",{"text":726,"config":727},"Gestion du code source",{"href":728,"dataGaLocation":652,"dataGaName":729},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":731,"config":732},"Livraison de logiciels automatisée",{"href":715,"dataGaLocation":652,"dataGaName":733},"Automated software delivery",{"title":735,"description":736,"link":737,"items":742},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":738},{"href":739,"dataGaName":740,"dataGaLocation":652,"icon":741},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[743,747,752],{"text":744,"config":745},"Tests de sécurité des applications",{"href":739,"dataGaName":746,"dataGaLocation":652},"Application security testing",{"text":748,"config":749},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":750,"dataGaLocation":652,"dataGaName":751},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":753,"config":754},"Conformité logicielle",{"href":755,"dataGaName":756,"dataGaLocation":652},"/fr-fr/solutions/software-compliance/","software compliance",{"title":758,"link":759,"items":764},"Mesures",{"config":760},{"icon":761,"href":762,"dataGaName":763,"dataGaLocation":652},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[765,769,774],{"text":766,"config":767},"Visibilité et mesures",{"href":762,"dataGaLocation":652,"dataGaName":768},"Visibility and Measurement",{"text":770,"config":771},"Gestion de la chaîne de valeur",{"href":772,"dataGaLocation":652,"dataGaName":773},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":775,"config":776},"Analyses et informations",{"href":777,"dataGaLocation":652,"dataGaName":778},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":780,"type":703,"items":781},"GitLab",[782,788,794],{"text":783,"config":784},"Entreprises",{"icon":785,"href":786,"dataGaLocation":652,"dataGaName":787},"Building","/fr-fr/enterprise/","enterprise",{"text":789,"config":790},"Pour les PME",{"icon":791,"href":792,"dataGaLocation":652,"dataGaName":793},"Work","/fr-fr/small-business/","small business",{"text":795,"config":796},"Pour le secteur public",{"icon":797,"href":798,"dataGaLocation":652,"dataGaName":799},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":801,"config":802},"Tarifs",{"href":803,"dataGaName":804,"dataGaLocation":652,"dataNavLevelOne":804},"/fr-fr/pricing/","pricing",{"text":806,"config":807,"menu":809},"Ressources",{"dataNavLevelOne":808},"resources",{"type":703,"link":810,"columns":814,"feature":908},{"text":811,"config":812},"Afficher toutes les ressources",{"href":813,"dataGaName":808,"dataGaLocation":652},"/fr-fr/resources/",[815,848,875],{"title":816,"items":817},"Premiers pas",[818,823,828,833,838,843],{"text":819,"config":820},"Installation",{"href":821,"dataGaName":822,"dataGaLocation":652},"/fr-fr/install/","install",{"text":824,"config":825},"Guides de démarrage",{"href":826,"dataGaName":827,"dataGaLocation":652},"/fr-fr/get-started/","quick setup checklists",{"text":829,"config":830},"Apprentissage",{"href":831,"dataGaLocation":652,"dataGaName":832},"https://university.gitlab.com/","learn",{"text":834,"config":835},"Documentation",{"href":836,"dataGaName":837,"dataGaLocation":652},"https://docs.gitlab.com/","product documentation",{"text":839,"config":840},"Vidéos sur les bonnes pratiques",{"href":841,"dataGaName":842,"dataGaLocation":652},"/fr-fr/getting-started-videos/","best practice videos",{"text":844,"config":845},"Intégrations",{"href":846,"dataGaName":847,"dataGaLocation":652},"/fr-fr/integrations/","integrations",{"title":849,"items":850},"Découvrir",[851,856,861,866,870],{"text":852,"config":853},"Témoignages clients",{"href":854,"dataGaName":855,"dataGaLocation":652},"/fr-fr/customers/","customer success stories",{"text":857,"config":858},"Blog",{"href":859,"dataGaName":860,"dataGaLocation":652},"/fr-fr/blog/","blog",{"text":862,"config":863},"Demo Hub",{"href":864,"dataGaName":865,"dataGaLocation":652},"/fr-fr/demo-hub/","demo hub",{"text":867,"config":868},"The Source",{"href":869,"dataGaName":860,"dataGaLocation":652},"/fr-fr/the-source/",{"text":871,"config":872},"Travail à distance",{"href":873,"dataGaName":874,"dataGaLocation":652},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":876,"items":877},"Connecter",[878,883,888,893,898,903],{"text":879,"config":880},"Services GitLab",{"href":881,"dataGaName":882,"dataGaLocation":652},"/fr-fr/services/","services",{"text":884,"config":885},"Contribuer",{"href":886,"dataGaName":887,"dataGaLocation":652},"https://contributors.gitlab.com","contribute",{"text":889,"config":890},"Communauté",{"href":891,"dataGaName":892,"dataGaLocation":652},"/community/","community",{"text":894,"config":895},"Forum",{"href":896,"dataGaName":897,"dataGaLocation":652},"https://forum.gitlab.com/","forum",{"text":899,"config":900},"Événements",{"href":901,"dataGaName":902,"dataGaLocation":652},"/events/","events",{"text":904,"config":905},"Partenaires",{"href":906,"dataGaName":907,"dataGaLocation":652},"/fr-fr/partners/","partners",{"config":909,"title":912,"text":913,"link":914},{"background":910,"textColor":911},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":915,"config":916},"Lire les articles les plus récents",{"href":917,"dataGaName":918,"dataGaLocation":652},"/fr-fr/whats-new/","whats new",{"text":920,"config":921,"menu":923},"Société",{"dataNavLevelOne":922},"company",{"type":703,"columns":924},[925],{"items":926},[927,932,938,940,945,950,955,960,965,970],{"text":928,"config":929},"À propos",{"href":930,"dataGaName":931,"dataGaLocation":652},"/fr-fr/company/","about",{"text":933,"config":934,"footerGa":937},"Carrières",{"href":935,"dataGaName":936,"dataGaLocation":652},"/jobs/","jobs",{"dataGaName":936},{"text":899,"config":939},{"href":901,"dataGaName":902,"dataGaLocation":652},{"text":941,"config":942},"Leadership",{"href":943,"dataGaName":944,"dataGaLocation":652},"/company/team/e-group/","leadership",{"text":946,"config":947},"Manuel",{"href":948,"dataGaName":949,"dataGaLocation":652},"https://handbook.gitlab.com/","handbook",{"text":951,"config":952},"Relations avec les investisseurs",{"href":953,"dataGaName":954,"dataGaLocation":652},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":956,"config":957},"Trust Center",{"href":958,"dataGaName":959,"dataGaLocation":652},"/fr-fr/security/","trust center",{"text":961,"config":962},"Centre pour la transparence de l'IA",{"href":963,"dataGaName":964,"dataGaLocation":652},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":966,"config":967},"Newsletter",{"href":968,"dataGaName":969,"dataGaLocation":652},"/company/contact/#contact-forms","newsletter",{"text":971,"config":972},"Presse",{"href":973,"dataGaName":974,"dataGaLocation":652},"/press/","press",{"text":976,"config":977,"menu":978},"Nous contacter",{"dataNavLevelOne":922},{"type":703,"columns":979},[980],{"items":981},[982,987,992],{"text":983,"config":984},"Contacter l'équipe commerciale",{"href":985,"dataGaName":986,"dataGaLocation":652},"/fr-fr/sales/","talk to sales",{"text":988,"config":989},"Assistance GitLab",{"href":990,"dataGaName":991,"dataGaLocation":652},"https://support.gitlab.com/hc/en-us","support portal",{"text":993,"config":994},"Portail clients GitLab",{"href":995,"dataGaName":996,"dataGaLocation":652},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":998,"login":999,"suggestions":1006},"Fermer",{"text":1000,"link":1001},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1002,"config":1003},"GitLab.com",{"href":666,"dataGaName":1004,"dataGaLocation":1005},"search login","search",{"text":1007,"default":1008},"Suggestions",[1009,1012,1017,1019,1024,1029],{"text":683,"config":1010},{"href":688,"dataGaName":1011,"dataGaLocation":1005},"GitLab Duo Agent Platform",{"text":1013,"config":1014},"Suggestions de code (IA)",{"href":1015,"dataGaName":1016,"dataGaLocation":1005},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":719,"config":1018},{"href":721,"dataGaName":719,"dataGaLocation":1005},{"text":1020,"config":1021},"GitLab sur AWS",{"href":1022,"dataGaName":1023,"dataGaLocation":1005},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1025,"config":1026},"GitLab sur Google Cloud",{"href":1027,"dataGaName":1028,"dataGaLocation":1005},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1030,"config":1031},"Pourquoi utiliser GitLab ?",{"href":696,"dataGaName":1032,"dataGaLocation":1005},"Why GitLab?",{"freeTrial":1034,"mobileIcon":1039,"desktopIcon":1044,"secondaryButton":1047},{"text":1035,"config":1036},"Commencer votre essai gratuit",{"href":1037,"dataGaName":657,"dataGaLocation":1038},"https://gitlab.com/-/trials/new/","nav",{"altText":1040,"config":1041},"Icône GitLab",{"src":1042,"dataGaName":1043,"dataGaLocation":1038},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1040,"config":1045},{"src":1046,"dataGaName":1043,"dataGaLocation":1038},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1048,"config":1049},"Commencer",{"href":1050,"dataGaName":1051,"dataGaLocation":1038},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1053,"mobileIcon":1057,"desktopIcon":1059},{"text":1054,"config":1055},"En savoir plus sur GitLab Duo",{"href":688,"dataGaName":1056,"dataGaLocation":1038},"gitlab duo",{"altText":1040,"config":1058},{"src":1042,"dataGaName":1043,"dataGaLocation":1038},{"altText":1040,"config":1060},{"src":1046,"dataGaName":1043,"dataGaLocation":1038},{"button":1062,"mobileIcon":1067,"desktopIcon":1069},{"text":1063,"config":1064},"/switch",{"href":1065,"dataGaName":1066,"dataGaLocation":1038},"#contact","switch",{"altText":1040,"config":1068},{"src":1042,"dataGaName":1043,"dataGaLocation":1038},{"altText":1040,"config":1070},{"src":1071,"dataGaName":1043,"dataGaLocation":1038},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1073,"mobileIcon":1078,"desktopIcon":1080},{"text":1074,"config":1075},"Retour aux tarifs",{"href":803,"dataGaName":1076,"dataGaLocation":1038,"icon":1077},"back to pricing","GoBack",{"altText":1040,"config":1079},{"src":1042,"dataGaName":1043,"dataGaLocation":1038},{"altText":1040,"config":1081},{"src":1046,"dataGaName":1043,"dataGaLocation":1038},{"title":1083,"button":1084,"config":1088},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":694,"config":1085},{"href":1086,"dataGaName":1087,"dataGaLocation":652},"/fr-fr/gitlab-orbit/","orbit",{"layout":1089,"disabled":630},"release",{"data":1091},{"text":1092,"source":1093,"edit":1099,"contribute":1104,"config":1108,"items":1113,"minimal":1321},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1094,"config":1095},"Afficher le code source de la page",{"href":1096,"dataGaName":1097,"dataGaLocation":1098},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1100,"config":1101},"Modifier cette page",{"href":1102,"dataGaName":1103,"dataGaLocation":1098},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":884,"config":1105},{"href":1106,"dataGaName":1107,"dataGaLocation":1098},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1109,"facebook":1110,"youtube":1111,"linkedin":1112},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1114,1160,1213,1256,1288],{"title":801,"links":1115,"subMenu":1130},[1116,1120,1125],{"text":1117,"config":1118},"Voir les forfaits",{"href":803,"dataGaName":1119,"dataGaLocation":1098},"view plans",{"text":1121,"config":1122},"GitLab Premium",{"href":1123,"dataGaName":1124,"dataGaLocation":1098},"/fr-fr/pricing/premium/","why premium",{"text":1126,"config":1127},"GitLab Ultimate",{"href":1128,"dataGaName":1129,"dataGaLocation":1098},"/fr-fr/pricing/ultimate/","why ultimate",[1131],{"title":976,"links":1132},[1133,1135,1137,1140,1145,1150,1155],{"text":983,"config":1134},{"href":985,"dataGaName":662,"dataGaLocation":1098},{"text":988,"config":1136},{"href":990,"dataGaName":991,"dataGaLocation":1098},{"text":1138,"config":1139},"Portail clients",{"href":995,"dataGaName":996,"dataGaLocation":1098},{"text":1141,"config":1142},"Statut",{"href":1143,"dataGaName":1144,"dataGaLocation":1098},"https://status.gitlab.com/","status",{"text":1146,"config":1147},"Conditions d'utilisation",{"href":1148,"dataGaName":1149,"dataGaLocation":1098},"/terms/","terms of use",{"text":1151,"config":1152},"Politique de confidentialité",{"href":1153,"dataGaName":1154,"dataGaLocation":1098},"/fr-fr/privacy/","privacy statement",{"text":1156,"config":1157},"Gestion des cookies",{"dataGaName":1158,"dataGaLocation":1098,"id":1159,"isOneTrustButton":633},"cookie preferences","ot-sdk-btn",{"title":699,"links":1161,"subMenu":1170},[1162,1166],{"text":1163,"config":1164},"Plateforme DevSecOps",{"href":681,"dataGaName":1165,"dataGaLocation":1098},"devsecops platform",{"text":1167,"config":1168},"Développement assisté par l'IA",{"href":688,"dataGaName":1169,"dataGaLocation":1098},"ai-assisted development",[1171],{"title":1172,"links":1173},"Thèmes",[1174,1178,1183,1188,1193,1198,1203,1208],{"text":719,"config":1175},{"href":1176,"dataGaName":1177,"dataGaLocation":1098},"/fr-fr/topics/ci-cd/","cicd",{"text":1179,"config":1180},"GitOps",{"href":1181,"dataGaName":1182,"dataGaLocation":1098},"/fr-fr/topics/gitops/","gitops",{"text":1184,"config":1185},"DevOps",{"href":1186,"dataGaName":1187,"dataGaLocation":1098},"/fr-fr/topics/devops/","devops",{"text":1189,"config":1190},"Contrôle de version",{"href":1191,"dataGaName":1192,"dataGaLocation":1098},"/fr-fr/topics/version-control/","version control",{"text":1194,"config":1195},"DevSecOps",{"href":1196,"dataGaName":1197,"dataGaLocation":1098},"/fr-fr/topics/devsecops/","devsecops",{"text":1199,"config":1200},"Cloud-native",{"href":1201,"dataGaName":1202,"dataGaLocation":1098},"/fr-fr/topics/cloud-native/","cloud native",{"text":1204,"config":1205},"IA pour la programmation",{"href":1206,"dataGaName":1207,"dataGaLocation":1098},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1209,"config":1210},"IA agentique",{"href":1211,"dataGaName":1212,"dataGaLocation":1098},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1214,"links":1215},"Solutions",[1216,1219,1221,1226,1229,1232,1235,1238,1240,1243,1246,1251],{"text":744,"config":1217},{"href":739,"dataGaName":1218,"dataGaLocation":1098},"Application Security Testing",{"text":731,"config":1220},{"href":715,"dataGaName":716,"dataGaLocation":1098},{"text":1222,"config":1223},"Développement Agile",{"href":1224,"dataGaName":1225,"dataGaLocation":1098},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":726,"config":1227},{"href":728,"dataGaName":1228,"dataGaLocation":1098},"source code management",{"text":719,"config":1230},{"href":721,"dataGaName":1231,"dataGaLocation":1098},"continuous integration & delivery",{"text":770,"config":1233},{"href":772,"dataGaName":1234,"dataGaLocation":1098},"value stream management",{"text":1179,"config":1236},{"href":1237,"dataGaName":1182,"dataGaLocation":1098},"/fr-fr/solutions/gitops/",{"text":783,"config":1239},{"href":786,"dataGaName":787,"dataGaLocation":1098},{"text":1241,"config":1242},"PME",{"href":792,"dataGaName":793,"dataGaLocation":1098},{"text":1244,"config":1245},"Secteur public",{"href":798,"dataGaName":799,"dataGaLocation":1098},{"text":1247,"config":1248},"Éducation",{"href":1249,"dataGaName":1250,"dataGaLocation":1098},"/fr-fr/solutions/education/","education",{"text":1252,"config":1253},"Services financiers",{"href":1254,"dataGaName":1255,"dataGaLocation":1098},"/fr-fr/solutions/finance/","financial services",{"title":806,"links":1257},[1258,1260,1262,1264,1267,1269,1272,1274,1276,1278,1280,1282,1284,1286],{"text":819,"config":1259},{"href":821,"dataGaName":822,"dataGaLocation":1098},{"text":824,"config":1261},{"href":826,"dataGaName":827,"dataGaLocation":1098},{"text":829,"config":1263},{"href":831,"dataGaName":832,"dataGaLocation":1098},{"text":834,"config":1265},{"href":836,"dataGaName":1266,"dataGaLocation":1098},"docs",{"text":857,"config":1268},{"href":859,"dataGaName":860,"dataGaLocation":1098},{"text":1270,"config":1271},"Nouveautés",{"href":917,"dataGaName":918,"dataGaLocation":1098},{"text":852,"config":1273},{"href":854,"dataGaName":855,"dataGaLocation":1098},{"text":871,"config":1275},{"href":873,"dataGaName":874,"dataGaLocation":1098},{"text":879,"config":1277},{"href":881,"dataGaName":882,"dataGaLocation":1098},{"text":884,"config":1279},{"href":886,"dataGaName":887,"dataGaLocation":1098},{"text":889,"config":1281},{"href":891,"dataGaName":892,"dataGaLocation":1098},{"text":894,"config":1283},{"href":896,"dataGaName":897,"dataGaLocation":1098},{"text":899,"config":1285},{"href":901,"dataGaName":902,"dataGaLocation":1098},{"text":904,"config":1287},{"href":906,"dataGaName":907,"dataGaLocation":1098},{"title":920,"links":1289},[1290,1292,1294,1296,1298,1300,1305,1310,1312,1314,1316],{"text":928,"config":1291},{"href":930,"dataGaName":922,"dataGaLocation":1098},{"text":933,"config":1293},{"href":935,"dataGaName":936,"dataGaLocation":1098},{"text":941,"config":1295},{"href":943,"dataGaName":944,"dataGaLocation":1098},{"text":946,"config":1297},{"href":948,"dataGaName":949,"dataGaLocation":1098},{"text":951,"config":1299},{"href":953,"dataGaName":954,"dataGaLocation":1098},{"text":1301,"config":1302},"Développement durable",{"href":1303,"dataGaName":1304,"dataGaLocation":1098},"/sustainability/","Sustainability",{"text":1306,"config":1307},"Diversité, inclusion et appartenance (DIB)",{"href":1308,"dataGaName":1309,"dataGaLocation":1098},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":956,"config":1311},{"href":958,"dataGaName":959,"dataGaLocation":1098},{"text":966,"config":1313},{"href":968,"dataGaName":969,"dataGaLocation":1098},{"text":971,"config":1315},{"href":973,"dataGaName":974,"dataGaLocation":1098},{"text":1317,"config":1318},"Déclaration de transparence sur l'esclavage moderne",{"href":1319,"dataGaName":1320,"dataGaLocation":1098},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1322},[1323,1325,1327],{"text":1146,"config":1324},{"href":1148,"dataGaName":1149,"dataGaLocation":1098},{"text":1156,"config":1326},{"dataGaName":1158,"dataGaLocation":1098,"id":1159,"isOneTrustButton":633},{"text":1151,"config":1328},{"href":1153,"dataGaName":1154,"dataGaLocation":1098},[1330],{"id":1331,"title":7,"body":629,"config":1332,"content":1334,"description":629,"extension":1338,"meta":1339,"navigation":633,"path":1340,"seo":1341,"stem":1342,"__hash__":1343},"blogAuthors/en-us/blog/authors/kushal-pandya.yml",{"template":1333},"BlogAuthor",{"name":7,"config":1335},{"headshot":1336,"ctfId":1337},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659454/Blog/Author%20Headshots/kushalpandya-headshot.png","kushalpandya","yml",{},"/en-us/blog/authors/kushal-pandya",{},"en-us/blog/authors/kushal-pandya","5usuoILmHesSGmSO_7xZlme00WJWoDZxY1ccCfTzrwY",[1345,1353,1361],{"title":1346,"description":1347,"heroImage":1348,"category":625,"date":1349,"authors":1350,"slug":1352,"externalUrl":629},"Green DevOps : l'importance de mesurer le bilan carbone de vos pipelines CI/CD","Les pipelines CI/CD ont un bilan carbone caché. Découvrez pourquoi il est crucial de le mesurer et comment vous lancer avec Eco CI et Carmen dans GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-22",[1351],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1354,"description":1355,"heroImage":1356,"category":625,"date":1357,"authors":1358,"slug":1360,"externalUrl":629},"Comment mettre en place l'observabilité CI/CD à grande échelle","Ce guide pratique consacré à l'analyse des pipelines GitLab aide les utilisateurs de GitLab Self-Managed à obtenir des indicateurs opérationnels exploitables grâce à Prometheus et Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-05-18",[1359],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":1362,"description":1363,"heroImage":1364,"category":625,"date":1365,"authors":1366,"slug":1368,"externalUrl":629},"5 modèles de pipeline GitLab pour résoudre vos enjeux d'ingénierie","Découvrez comment faire évoluer votre approche CI/CD avec des modèles composables pour les monorepos, les microservices, les environnements et la gouvernance.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","2026-05-06",[1367],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":1370},[1371,1385,1397,1409],{"id":1372,"categories":1373,"header":1375,"text":1376,"button":1377,"image":1382},"ai-modernization",[1374],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1378,"config":1379},"Obtenez votre score de maturité IA",{"href":1380,"dataGaName":1381,"dataGaLocation":860},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1383},{"src":1384},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1386,"categories":1387,"header":1389,"text":1376,"button":1390,"image":1394},"devops-modernization",[1388,1197],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1391,"config":1392},"Obtenez votre score de maturité DevOps",{"href":1393,"dataGaName":1381,"dataGaLocation":860},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1395},{"src":1396},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1398,"categories":1399,"header":1401,"text":1376,"button":1402,"image":1406},"security-modernization",[1400],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1403,"config":1404},"Obtenez votre score de maturité en matière de sécurité",{"href":1405,"dataGaName":1381,"dataGaLocation":860},"/fr-fr/assessments/security-modernization-assessment/",{"config":1407},{"src":1408},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1410,"paths":1411,"header":1414,"text":1415,"button":1416,"image":1421},"github-azure-migration",[1412,1413],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":1417,"config":1418},"Découvrez les différences entre GitLab et GitHub",{"href":1419,"dataGaName":1420,"dataGaLocation":860},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1422},{"src":1396},{"header":1424,"blurb":1425,"button":1426,"secondaryButton":1430},"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":654,"config":1427},{"href":1428,"dataGaName":657,"dataGaLocation":1429},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":983,"config":1431},{"href":985,"dataGaName":662,"dataGaLocation":1429},1786803764848]