[{"data":1,"prerenderedAt":708},["ShallowReactive",2],{"/fr-fr/blog/keeping-git-commit-history-clean/":3,"navigation-fr-fr":36,"banner-fr-fr":456,"footer-fr-fr":468,"Kushal Pandya":680,"next-steps-fr-fr":693},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":26,"_id":29,"_type":30,"title":31,"_source":32,"_file":33,"_stem":34,"_extension":35},"/fr-fr/blog/keeping-git-commit-history-clean","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Commits Git : comment et pourquoi maintenir un historique propre","L’historique des commits Git peut rapidement devenir désorganisé. Dans cet article, vous découvrirez tous nos conseils pour y remédier.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659457/Blog/Hero%20Images/keep-git-commit-history-clean.jpg","https://about.gitlab.com/blog/keeping-git-commit-history-clean","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Commits Git : comment et pourquoi maintenir un historique propre\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Kushal Pandya\"}],\n        \"datePublished\": \"2018-06-07\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22,"updatedDate":25},[18],"Kushal Pandya","2018-06-07","Les commits Git sont des éléments fondamentaux d’un [dépôt Git](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\") (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.\n\n## Qu’est-ce qu’un commit Git ?\n\nLes 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. \n\nDans 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. \n\nPour 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 : \n\n- Situation 1 : Je dois modifier le commit le plus récent\n- Situation 2 : Je dois modifier un commit Git spécifique\n- Situation 3 : Je dois ajouter, combiner ou supprimer un commit Git \n- Situation 4 : Mon historique de commits Git est incohérent, je veux repartir à zéro\n\n__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 [documentation](https://docs.gitlab.com/ee/topics/git/index.html \"Documentation GitLab sur Git\") avant de continuer la lecture de cet article. \n\nAvant 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. \n\n## Exemple de commit Git\n\nDans 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. \n\nVoici le déroulement de l’ensemble du processus étape par étape : \n\n- Vous commencez à travailler sur une fonctionnalité avec la mise à jour d’un fichier que nous appelons `application_controller.rb`\n\n- Cette fonctionnalité requiert la mise à jour d’une vue : `index.html.haml`\n\n- Vous avez ajouté un partiel utilisé dans la page d’index : `_navigation.html.haml`\n\n- Les styles de la page doivent également être mis à jour pour refléter le partiel ajouté : `styles.css.scss`\n\n- La fonctionnalité est maintenant prête avec les modifications souhaitées, il est temps de mettre à jour les tests. Les fichiers à mettre à jour sont : \n  - `application_controller_spec.rb`\n  - `navigation_spec.rb`\n\n- Les tests sont mis à jour et fonctionnent comme prévu. Désormais, il est temps de valider les changements.\n\nPuisque 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.\n\n1. `application_controller.rb` & `application_controller_spec.rb` ; __Add routes for navigation__.\n2. `_navigation.html.haml` & `navigation_spec.rb` ; __Page Navigation View__.\n3. `index.html.haml` ; __Render navigation partial__.\n4. `styles.css.scss` ; __Add styles for navigation__.\n\nMaintenant 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. \n\n## Situation 1 : comment modifier le commit Git le plus récent ?\n\nImaginez que le relecteur examine le fichier `styles.css.scss` 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. \n\nVoici comment s’y prendre : \n\n- Vous effectuez directement les changements nécessaires dans `styles.css.scss` dans votre branche actuelle. \n\n- Une fois les changements effectués, ajoutez ces modifications au staging; exécutez `git add styles.css.scss`. \n\n- Dès que les changements sont pris en compte, ajoutez-les à votre dernier commit; exécutez la commande `git commit --amend`.\n  - Explication de la commande : Ici, nous demandons à la commande `git commit` d’inclure tout ce qui est présent dans le staging au commit le plus récent.\n\n- Cela ouvrira votre dernier commit dans l’éditeur de texte défini par Git contenant le message de commit « __Add styles for navigation__ ». \n\n- 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. \n\nPuisque vous avez modifié un commit Git existant, vous devez pousser ces changements vers le dépôt distant (« remote repository ») grâce à la commande : `git push --force-with-lease \u003Cremote_name> \u003Cbranch_name>`. Celle-ci va remplacer le commit `Add styles for navigation` sur le dépôt distant, par le commit mis à jour à l’instant dans notre dépôt local.\n\nGardez 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 [Git Push](https://git-scm.com/docs/git-push/fr \"Git Push\") dans la documentation de Git. \n\n## Situation 2 : comment modifier les changements d’un commit Git spécifique ?\n\nDans 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 `_navigation.html.haml`. 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. \n\nChaque 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 `git log`. \n\nVous obtiendrez alors un résultat qui ressemble à peu près à une liste où les commits les plus récents sont en haut :\n\n```\ncommit 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\nC’est ici que la commande `git rebase` entre en jeu. Chaque fois que vous souhaitez modifier un commit spécifique avec la commande `git rebase`, 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 `Page Navigation View`.\n\n![Commit Log](https://about.gitlab.com/images/blogimages/keeping-git-commit-history-clean/GitRebase.png){: .shadow.center.medium}\n\nNotez ici le hachage du commit qui se trouve juste avant celui que nous souhaitons modifier. \n\nCopiez le hachage et effectuez les étapes suivantes : \n\n- Rebasez la branche pour vous positionner sur le commit précédant votre commit cible. Exécutez `git rebase -i 8d74af102941aa0b51e1a35b8ad731284e4b5a20`.\n  - Explication de la commande Git : ici, vous exécutez la commande `rebase` de Git en mode interactif avec le hachage SHA-1 comme commit sur lequel se rebaser.\n- Votre éditeur de texte s’ouvre et affiche tous vos commits effectués après le commit sur lequel vous vous rebasez. \n\nCe qui va correspondre à : \n\n```\npick 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```\nChaque commit est précédé du mot `pick`. Ci-dessous, vous retrouverez tous les mots-clés disponibles. Pour éditer un commit, vous devez changer `pick 4155df1cdc7 Page Navigation View` en `edit 4155df1cdc7 Page Navigation View`. Sauvegardez les changements et quittez l’éditeur. \n\nVotre branche est désormais rebasée à l’endroit précédent le commit qui incluait `_navigation.html.haml`. 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 `git add _navigation.html.haml`.\n\nMaintenant 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 `git rebase -–continue`. \n\nVotre éditeur par défaut s’ouvrira dans le terminal et affichera le message de commit modifié lors du rebasage : `Page Navigation View`. 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. \n\nÀ 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. \n\nPuisque 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 : `git push --force-with-lease \u003Cremote_name> \u003Cbranch_name>`.\n\n## Situation 3 : comment ajouter, combiner ou supprimer des commits Git ?\n\nIl 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. \n\nPour cela, commencez le rebase interactif comme vous le feriez dans d’autres scénarios : \n\n```\npick 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```\n\nSi vous souhaitez combiner toutes ces modifications dans `c22a3fa0c5c Render navigation partial`, vous devez : \n\n- Déplacer les corrections afin de les placer juste en-dessous du commit que vous désirez garder à la fin.\n\n- Changer `pick` en `squash` ou `fixup` pour chacune des modifications. \n\n*Remarque:* `squash` conserve les messages de commit des corrections dans la description. `Fixup` oublie les messages de commit des corrections et conserve l’original. \n\nVous obtenez donc : \n\n```\npick 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```\n\nEnregistrez les changements et quittez l’éditeur. Voici le résultat : \n\n```\npick 4155df1cdc7 Page Navigation View\npick 96373c0bcf Render navigation partial\npick aa0a35a867e Add styles for navigation\n```\n\nComme précédemment, vous avez juste besoin d’exécuter `git push --force-with-lease \u003Cremote_name> \u003Cbranch_name>` et les changements sont appliqués.\n\nSi vous souhaitez supprimer un commit Git de la branche, utilisez plutôt la commande `drop` ou effacez la ligne. Nous conseillons d’éviter les commandes `squash` et `fixup` pour cela.\n\n### Comment éviter les conflits entre commits ?\n\nPour éviter tout conflit, assurez-vous que les commits que vous faites remonter n’impactent pas de fichiers modifiés par des commits suivants.\n\n```\npick 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```\n\n## Situation 4 : mon historique de commits Git est incohérent, comment repartir à zéro ?\n\nPour 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. \n\nC'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. \n\nImaginez que vous avez une branche (par exemple `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 :\n\n- 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 `master` et n’a pas de conflits avec celle-ci. \n\n- Vous pouvez exécuter `git rebase master` ou `git merge master` pendant que vous êtes dans la branche `add-page-navigation` pour obtenir tous les changements de la branche master sur votre branche. \n\n- Maintenant, créez le fichier patch. Pour ce faire, exécutez `git diff master add-page-navigation > ~/add_page_navigation.patch`.\n  - Explication de la commande : nous utilisons la fonctionnalité diff de Git. Nous demandons une diff entre la branche `master` et la branche `add-page-navigation`. Nous redirigeons le résultat (via le symbole `>`) vers un fichier nommé `add_page_navigation.patch` dans notre répertoire personnel (typiquement `~/` dans les systèmes d'exploitation *nix).\n\n- 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.\n\n- 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é.\n\n- Maintenant, vérifiez la branche `master`. Exécutez `git checkout master`.\n\n- Supprimez la branche `add-page-navigation` du dépôt local. Exécutez `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. \n\n- Créez une nouvelle branche avec le même nom (pendant que la branche `master` est sélectionnée). Exécutez `git checkout -b add-page-navigation`.\n\n- À ce stade, c'est une nouvelle branche qui n'a aucun de vos changements.\n\n- Enfin, appliquez vos changements à partir du fichier patch `git apply ~/add_page_navigation.patch`.\n\n- 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.\n\n- 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.\n\nComme dans les situations précédentes, nous avons essentiellement modifié toute la branche. Il est donc temps de la pousser de force. \n\n## Conclusion sur l'historique des commits Git\n\nBien 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 [documentation officielle de Git](https://git-scm.com/book/fr/v2/Utilitaires-Git-R%C3%A9%C3%A9crire-l%E2%80%99historique \"Documentation officielle de Git\"). \n\n*Photo par pan xiaozhen sur Unsplash.*\n","engineering",[23,24],"git","workflow","2024-07-11",{"slug":27,"featured":6,"template":28},"keeping-git-commit-history-clean","BlogPost","content:fr-fr:blog:keeping-git-commit-history-clean.yml","yaml","Keeping Git Commit History Clean","content","fr-fr/blog/keeping-git-commit-history-clean.yml","fr-fr/blog/keeping-git-commit-history-clean","yml",{"_path":37,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":39,"_id":452,"_type":30,"title":453,"_source":32,"_file":454,"_stem":455,"_extension":35},"/shared/fr-fr/main-navigation","fr-fr",{"logo":40,"freeTrial":45,"sales":50,"login":55,"items":60,"search":393,"minimal":429,"duo":443},{"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&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,105,204,209,314,374],{"text":62,"config":63,"cards":65,"footer":88},"Plateforme",{"dataNavLevelOne":64},"platform",[66,72,80],{"title":62,"description":67,"link":68},"La plateforme DevSecOps alimentée par l'IA la plus complète",{"text":69,"config":70},"Découvrir notre plateforme",{"href":71,"dataGaName":64,"dataGaLocation":44},"/fr-fr/platform/",{"title":73,"description":74,"link":75},"GitLab Duo (IA)","Créez des logiciels plus rapidement en tirant parti de l'IA à chaque étape du développement",{"text":76,"config":77},"Découvrez GitLab Duo",{"href":78,"dataGaName":79,"dataGaLocation":44},"/fr-fr/gitlab-duo/","gitlab duo ai",{"title":81,"description":82,"link":83},"Choisir GitLab","10 raisons pour lesquelles les entreprises choisissent GitLab",{"text":84,"config":85},"En savoir plus",{"href":86,"dataGaName":87,"dataGaLocation":44},"/fr-fr/why-gitlab/","why gitlab",{"title":89,"items":90},"Démarrer avec",[91,96,101],{"text":92,"config":93},"Ingénierie de plateforme",{"href":94,"dataGaName":95,"dataGaLocation":44},"/fr-fr/solutions/platform-engineering/","platform engineering",{"text":97,"config":98},"Expérience développeur",{"href":99,"dataGaName":100,"dataGaLocation":44},"/fr-fr/developer-experience/","Developer experience",{"text":102,"config":103},"MLOps",{"href":104,"dataGaName":102,"dataGaLocation":44},"/fr-fr/topics/devops/the-role-of-ai-in-devops/",{"text":106,"left":107,"config":108,"link":110,"lists":114,"footer":186},"Produit",true,{"dataNavLevelOne":109},"solutions",{"text":111,"config":112},"Voir toutes les solutions",{"href":113,"dataGaName":109,"dataGaLocation":44},"/fr-fr/solutions/",[115,141,164],{"title":116,"description":117,"link":118,"items":123},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":119},{"icon":120,"href":121,"dataGaName":122,"dataGaLocation":44},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[124,128,132,137],{"text":125,"config":126},"CI/CD",{"href":127,"dataGaLocation":44,"dataGaName":125},"/fr-fr/solutions/continuous-integration/",{"text":129,"config":130},"Développement assisté par l'IA",{"href":78,"dataGaLocation":44,"dataGaName":131},"AI assisted development",{"text":133,"config":134},"Gestion du code source",{"href":135,"dataGaLocation":44,"dataGaName":136},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":138,"config":139},"Livraison de logiciels automatisée",{"href":121,"dataGaLocation":44,"dataGaName":140},"Automated software delivery",{"title":142,"description":143,"link":144,"items":149},"Securité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":145},{"href":146,"dataGaName":147,"dataGaLocation":44,"icon":148},"/fr-fr/solutions/security-compliance/","security and compliance","ShieldCheckLight",[150,154,159],{"text":151,"config":152},"Sécurité et conformité",{"href":146,"dataGaLocation":44,"dataGaName":153},"Security & Compliance",{"text":155,"config":156},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":157,"dataGaLocation":44,"dataGaName":158},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":160,"config":161},"Conformité et gouvernance",{"href":162,"dataGaLocation":44,"dataGaName":163},"/fr-fr/solutions/continuous-software-compliance/","Compliance and governance",{"title":165,"link":166,"items":171},"Mesures",{"config":167},{"icon":168,"href":169,"dataGaName":170,"dataGaLocation":44},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[172,176,181],{"text":173,"config":174},"Visibilité et mesures",{"href":169,"dataGaLocation":44,"dataGaName":175},"Visibility and Measurement",{"text":177,"config":178},"Gestion de la chaîne de valeur",{"href":179,"dataGaLocation":44,"dataGaName":180},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":182,"config":183},"Données d'analyse et informations clés",{"href":184,"dataGaLocation":44,"dataGaName":185},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":187,"items":188},"GitLab pour",[189,194,199],{"text":190,"config":191},"Entreprises",{"href":192,"dataGaLocation":44,"dataGaName":193},"/fr-fr/enterprise/","enterprise",{"text":195,"config":196},"PME",{"href":197,"dataGaLocation":44,"dataGaName":198},"/fr-fr/small-business/","small business",{"text":200,"config":201},"Secteur public",{"href":202,"dataGaLocation":44,"dataGaName":203},"/fr-fr/solutions/public-sector/","public sector",{"text":205,"config":206},"Tarifs",{"href":207,"dataGaName":208,"dataGaLocation":44,"dataNavLevelOne":208},"/fr-fr/pricing/","pricing",{"text":210,"config":211,"link":213,"lists":217,"feature":301},"Ressources",{"dataNavLevelOne":212},"resources",{"text":214,"config":215},"Afficher toutes les ressources",{"href":216,"dataGaName":212,"dataGaLocation":44},"/fr-fr/resources/",[218,251,273],{"title":219,"items":220},"Premiers pas",[221,226,231,236,241,246],{"text":222,"config":223},"Installation",{"href":224,"dataGaName":225,"dataGaLocation":44},"/fr-fr/install/","install",{"text":227,"config":228},"Guides de démarrage rapide",{"href":229,"dataGaName":230,"dataGaLocation":44},"/fr-fr/get-started/","quick setup checklists",{"text":232,"config":233},"Apprentissage",{"href":234,"dataGaLocation":44,"dataGaName":235},"https://university.gitlab.com/","learn",{"text":237,"config":238},"Documentation sur le produit",{"href":239,"dataGaName":240,"dataGaLocation":44},"https://docs.gitlab.com/","product documentation",{"text":242,"config":243},"Vidéos sur les bonnes pratiques",{"href":244,"dataGaName":245,"dataGaLocation":44},"/fr-fr/getting-started-videos/","best practice videos",{"text":247,"config":248},"Intégrations",{"href":249,"dataGaName":250,"dataGaLocation":44},"/fr-fr/integrations/","integrations",{"title":252,"items":253},"Découvrir",[254,259,263,268],{"text":255,"config":256},"Histoires de succès client",{"href":257,"dataGaName":258,"dataGaLocation":44},"/fr-fr/customers/","customer success stories",{"text":260,"config":261},"Blog",{"href":262,"dataGaName":5,"dataGaLocation":44},"/fr-fr/blog/",{"text":264,"config":265},"Travail à distance",{"href":266,"dataGaName":267,"dataGaLocation":44},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":269,"config":270},"TeamOps",{"href":271,"dataGaName":272,"dataGaLocation":44},"/fr-fr/teamops/","teamops",{"title":274,"items":275},"Connecter",[276,281,286,291,296],{"text":277,"config":278},"Services GitLab",{"href":279,"dataGaName":280,"dataGaLocation":44},"/fr-fr/services/","services",{"text":282,"config":283},"Communauté",{"href":284,"dataGaName":285,"dataGaLocation":44},"/community/","community",{"text":287,"config":288},"Forum",{"href":289,"dataGaName":290,"dataGaLocation":44},"https://forum.gitlab.com/","forum",{"text":292,"config":293},"Événements",{"href":294,"dataGaName":295,"dataGaLocation":44},"/events/","events",{"text":297,"config":298},"Partenaires",{"href":299,"dataGaName":300,"dataGaLocation":44},"/fr-fr/partners/","partners",{"backgroundColor":302,"textColor":303,"text":304,"image":305,"link":309},"#2f2a6b","#fff","L'avenir du développement logiciel. Tendances et perspectives.",{"altText":306,"config":307},"carte promo The Source",{"src":308},"/images/navigation/the-source-promo-card.svg",{"text":310,"config":311},"Lire les articles les plus récents",{"href":312,"dataGaName":313,"dataGaLocation":44},"/fr-fr/the-source/","the source",{"text":315,"config":316,"lists":318},"Société",{"dataNavLevelOne":317},"company",[319],{"items":320},[321,326,332,334,339,344,349,354,359,364,369],{"text":322,"config":323},"À propos",{"href":324,"dataGaName":325,"dataGaLocation":44},"/fr-fr/company/","about",{"text":327,"config":328,"footerGa":331},"Emplois",{"href":329,"dataGaName":330,"dataGaLocation":44},"/jobs/","jobs",{"dataGaName":330},{"text":292,"config":333},{"href":294,"dataGaName":295,"dataGaLocation":44},{"text":335,"config":336},"Leadership",{"href":337,"dataGaName":338,"dataGaLocation":44},"/company/team/e-group/","leadership",{"text":340,"config":341},"Équipe",{"href":342,"dataGaName":343,"dataGaLocation":44},"/company/team/","team",{"text":345,"config":346},"Manuel",{"href":347,"dataGaName":348,"dataGaLocation":44},"https://handbook.gitlab.com/","handbook",{"text":350,"config":351},"Relations avec les investisseurs",{"href":352,"dataGaName":353,"dataGaLocation":44},"https://ir.gitlab.com/","investor relations",{"text":355,"config":356},"Centre de confiance",{"href":357,"dataGaName":358,"dataGaLocation":44},"/fr-fr/security/","trust center",{"text":360,"config":361},"Centre pour la transparence de l'IA",{"href":362,"dataGaName":363,"dataGaLocation":44},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":365,"config":366},"Newsletter",{"href":367,"dataGaName":368,"dataGaLocation":44},"/company/contact/","newsletter",{"text":370,"config":371},"Presse",{"href":372,"dataGaName":373,"dataGaLocation":44},"/press/","press",{"text":375,"config":376,"lists":377},"Nous contacter",{"dataNavLevelOne":317},[378],{"items":379},[380,383,388],{"text":51,"config":381},{"href":53,"dataGaName":382,"dataGaLocation":44},"talk to sales",{"text":384,"config":385},"Aide",{"href":386,"dataGaName":387,"dataGaLocation":44},"/support/","get help",{"text":389,"config":390},"Portail clients GitLab",{"href":391,"dataGaName":392,"dataGaLocation":44},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":394,"login":395,"suggestions":402},"Fermer",{"text":396,"link":397},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":398,"config":399},"gitlab.com",{"href":58,"dataGaName":400,"dataGaLocation":401},"search login","search",{"text":403,"default":404},"Suggestions",[405,408,413,415,420,425],{"text":73,"config":406},{"href":78,"dataGaName":407,"dataGaLocation":401},"GitLab Duo (AI)",{"text":409,"config":410},"Suggestions de code (IA)",{"href":411,"dataGaName":412,"dataGaLocation":401},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":125,"config":414},{"href":127,"dataGaName":125,"dataGaLocation":401},{"text":416,"config":417},"GitLab sur AWS",{"href":418,"dataGaName":419,"dataGaLocation":401},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":421,"config":422},"GitLab sur Google Cloud ",{"href":423,"dataGaName":424,"dataGaLocation":401},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":426,"config":427},"Pourquoi utiliser GitLab ?",{"href":86,"dataGaName":428,"dataGaLocation":401},"Why GitLab?",{"freeTrial":430,"mobileIcon":435,"desktopIcon":440},{"text":431,"config":432},"Commencer votre essai gratuit",{"href":433,"dataGaName":49,"dataGaLocation":434},"https://gitlab.com/-/trials/new/","nav",{"altText":436,"config":437},"Icône GitLab",{"src":438,"dataGaName":439,"dataGaLocation":434},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":436,"config":441},{"src":442,"dataGaName":439,"dataGaLocation":434},"/images/brand/gitlab-logo-type.svg",{"freeTrial":444,"mobileIcon":448,"desktopIcon":450},{"text":445,"config":446},"En savoir plus sur GitLab Duo",{"href":78,"dataGaName":447,"dataGaLocation":434},"gitlab duo",{"altText":436,"config":449},{"src":438,"dataGaName":439,"dataGaLocation":434},{"altText":436,"config":451},{"src":442,"dataGaName":439,"dataGaLocation":434},"content:shared:fr-fr:main-navigation.yml","Main Navigation","shared/fr-fr/main-navigation.yml","shared/fr-fr/main-navigation",{"_path":457,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"title":458,"button":459,"config":463,"_id":465,"_type":30,"_source":32,"_file":466,"_stem":467,"_extension":35},"/shared/fr-fr/banner","GitLab Duo Agent Platform est maintenant disponible en version bêta publique !",{"text":84,"config":460},{"href":461,"dataGaName":462,"dataGaLocation":44},"/gitlab-duo/agent-platform/","duo banner",{"layout":464},"release","content:shared:fr-fr:banner.yml","shared/fr-fr/banner.yml","shared/fr-fr/banner",{"_path":469,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":470,"_id":676,"_type":30,"title":677,"_source":32,"_file":678,"_stem":679,"_extension":35},"/shared/fr-fr/main-footer",{"text":471,"source":472,"edit":478,"contribute":483,"config":488,"items":493,"minimal":667},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence",{"text":473,"config":474},"Afficher le code source de la page",{"href":475,"dataGaName":476,"dataGaLocation":477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":479,"config":480},"Modifier cette page",{"href":481,"dataGaName":482,"dataGaLocation":477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":484,"config":485},"Veuillez contribuer",{"href":486,"dataGaName":487,"dataGaLocation":477},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":489,"facebook":490,"youtube":491,"linkedin":492},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[494,517,571,604,638],{"title":62,"links":495,"subMenu":500},[496],{"text":497,"config":498},"Plateforme DevSecOps",{"href":71,"dataGaName":499,"dataGaLocation":477},"devsecops platform",[501],{"title":205,"links":502},[503,507,512],{"text":504,"config":505},"Voir les forfaits",{"href":207,"dataGaName":506,"dataGaLocation":477},"view plans",{"text":508,"config":509},"Pourquoi choisir GitLab Premium ?",{"href":510,"dataGaName":511,"dataGaLocation":477},"/fr-fr/pricing/premium/","why premium",{"text":513,"config":514},"Pourquoi choisir GitLab Ultimate ?",{"href":515,"dataGaName":516,"dataGaLocation":477},"/fr-fr/pricing/ultimate/","why ultimate",{"title":518,"links":519},"Solutions",[520,525,528,530,535,540,544,547,550,555,557,559,561,566],{"text":521,"config":522},"Transformation digitale",{"href":523,"dataGaName":524,"dataGaLocation":477},"/fr-fr/topics/digital-transformation/","digital transformation",{"text":151,"config":526},{"href":146,"dataGaName":527,"dataGaLocation":477},"security & compliance",{"text":138,"config":529},{"href":121,"dataGaName":122,"dataGaLocation":477},{"text":531,"config":532},"Développement agile",{"href":533,"dataGaName":534,"dataGaLocation":477},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":536,"config":537},"Transformation cloud",{"href":538,"dataGaName":539,"dataGaLocation":477},"/fr-fr/topics/cloud-native/","cloud transformation",{"text":541,"config":542},"SCM",{"href":135,"dataGaName":543,"dataGaLocation":477},"source code management",{"text":125,"config":545},{"href":127,"dataGaName":546,"dataGaLocation":477},"continuous integration & delivery",{"text":177,"config":548},{"href":179,"dataGaName":549,"dataGaLocation":477},"value stream management",{"text":551,"config":552},"GitOps",{"href":553,"dataGaName":554,"dataGaLocation":477},"/fr-fr/solutions/gitops/","gitops",{"text":190,"config":556},{"href":192,"dataGaName":193,"dataGaLocation":477},{"text":195,"config":558},{"href":197,"dataGaName":198,"dataGaLocation":477},{"text":200,"config":560},{"href":202,"dataGaName":203,"dataGaLocation":477},{"text":562,"config":563},"Formation",{"href":564,"dataGaName":565,"dataGaLocation":477},"/fr-fr/solutions/education/","education",{"text":567,"config":568},"Services financiers",{"href":569,"dataGaName":570,"dataGaLocation":477},"/fr-fr/solutions/finance/","financial services",{"title":210,"links":572},[573,575,577,579,582,584,588,590,592,594,596,598,600,602],{"text":222,"config":574},{"href":224,"dataGaName":225,"dataGaLocation":477},{"text":227,"config":576},{"href":229,"dataGaName":230,"dataGaLocation":477},{"text":232,"config":578},{"href":234,"dataGaName":235,"dataGaLocation":477},{"text":237,"config":580},{"href":239,"dataGaName":581,"dataGaLocation":477},"docs",{"text":260,"config":583},{"href":262,"dataGaName":5},{"text":585,"config":586},"Histoires de réussite client",{"href":587,"dataGaLocation":477},"/customers/",{"text":255,"config":589},{"href":257,"dataGaName":258,"dataGaLocation":477},{"text":264,"config":591},{"href":266,"dataGaName":267,"dataGaLocation":477},{"text":277,"config":593},{"href":279,"dataGaName":280,"dataGaLocation":477},{"text":269,"config":595},{"href":271,"dataGaName":272,"dataGaLocation":477},{"text":282,"config":597},{"href":284,"dataGaName":285,"dataGaLocation":477},{"text":287,"config":599},{"href":289,"dataGaName":290,"dataGaLocation":477},{"text":292,"config":601},{"href":294,"dataGaName":295,"dataGaLocation":477},{"text":297,"config":603},{"href":299,"dataGaName":300,"dataGaLocation":477},{"title":315,"links":605},[606,608,610,612,614,616,618,622,627,629,631,633],{"text":322,"config":607},{"href":324,"dataGaName":317,"dataGaLocation":477},{"text":327,"config":609},{"href":329,"dataGaName":330,"dataGaLocation":477},{"text":335,"config":611},{"href":337,"dataGaName":338,"dataGaLocation":477},{"text":340,"config":613},{"href":342,"dataGaName":343,"dataGaLocation":477},{"text":345,"config":615},{"href":347,"dataGaName":348,"dataGaLocation":477},{"text":350,"config":617},{"href":352,"dataGaName":353,"dataGaLocation":477},{"text":619,"config":620},"Sustainability",{"href":621,"dataGaName":619,"dataGaLocation":477},"/sustainability/",{"text":623,"config":624},"Diversité, inclusion et appartenance (DIB)",{"href":625,"dataGaName":626,"dataGaLocation":477},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":355,"config":628},{"href":357,"dataGaName":358,"dataGaLocation":477},{"text":365,"config":630},{"href":367,"dataGaName":368,"dataGaLocation":477},{"text":370,"config":632},{"href":372,"dataGaName":373,"dataGaLocation":477},{"text":634,"config":635},"Déclaration de transparence sur l'esclavage moderne",{"href":636,"dataGaName":637,"dataGaLocation":477},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":375,"links":639},[640,643,645,647,652,657,662],{"text":641,"config":642},"Échanger avec un expert",{"href":53,"dataGaName":54,"dataGaLocation":477},{"text":384,"config":644},{"href":386,"dataGaName":387,"dataGaLocation":477},{"text":389,"config":646},{"href":391,"dataGaName":392,"dataGaLocation":477},{"text":648,"config":649},"Statut",{"href":650,"dataGaName":651,"dataGaLocation":477},"https://status.gitlab.com/","status",{"text":653,"config":654},"Conditions d'utilisation",{"href":655,"dataGaName":656},"/terms/","terms of use",{"text":658,"config":659},"Déclaration de confidentialité",{"href":660,"dataGaName":661,"dataGaLocation":477},"/fr-fr/privacy/","privacy statement",{"text":663,"config":664},"Préférences en matière de cookies",{"dataGaName":665,"dataGaLocation":477,"id":666,"isOneTrustButton":107},"cookie preferences","ot-sdk-btn",{"items":668},[669,671,674],{"text":653,"config":670},{"href":655,"dataGaName":656,"dataGaLocation":477},{"text":672,"config":673},"Politique de confidentialité",{"href":660,"dataGaName":661,"dataGaLocation":477},{"text":663,"config":675},{"dataGaName":665,"dataGaLocation":477,"id":666,"isOneTrustButton":107},"content:shared:fr-fr:main-footer.yml","Main Footer","shared/fr-fr/main-footer.yml","shared/fr-fr/main-footer",[681],{"_path":682,"_dir":683,"_draft":6,"_partial":6,"_locale":7,"content":684,"config":688,"_id":690,"_type":30,"title":18,"_source":32,"_file":691,"_stem":692,"_extension":35},"/en-us/blog/authors/kushal-pandya","authors",{"name":18,"config":685},{"headshot":686,"ctfId":687},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659454/Blog/Author%20Headshots/kushalpandya-headshot.png","kushalpandya",{"template":689},"BlogAuthor","content:en-us:blog:authors:kushal-pandya.yml","en-us/blog/authors/kushal-pandya.yml","en-us/blog/authors/kushal-pandya",{"_path":694,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"header":695,"eyebrow":696,"blurb":697,"button":698,"secondaryButton":702,"_id":704,"_type":30,"title":705,"_source":32,"_file":706,"_stem":707,"_extension":35},"/shared/fr-fr/next-steps","Commencez à livrer des logiciels de meilleurs qualité plus rapidement","Plus de 50 % des entreprises du classement Fortune 100 font confiance à GitLab","Découvrez comment la plateforme DevSecOps intelligente\n\n\npeut aider votre équipe.\n",{"text":46,"config":699},{"href":700,"dataGaName":49,"dataGaLocation":701},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":51,"config":703},{"href":53,"dataGaName":54,"dataGaLocation":701},"content:shared:fr-fr:next-steps.yml","Next Steps","shared/fr-fr/next-steps.yml","shared/fr-fr/next-steps",1754424544325]