{"title":"Commit de code","version":"5.2","locale":"fr","docname":"internals/contributing/committing-code","url":"/fr/5.2/internals/contributing/committing-code/","canonical":"https://djangodocs.dev/fr/5.2/internals/contributing/committing-code/","summary":"Cette section s’adresse aux fusionneurs et à quiconque est intéressé à savoir comment le code est commité dans Django. Si vous êtes un membre de la communauté…","html":"<h1>Commit de code<a class=\"heading-anchor\" href=\"#committing-code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Cette section s’adresse aux fusionneurs et à quiconque est intéressé à savoir comment le code est commité dans Django. Si vous êtes un membre de la communauté désirant contribuer du code à Django, consultez plutôt <a class=\"reference internal\" href=\"/fr/5.2/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Travailler avec Git et GitHub</span></a>.</p>\n<section id=\"handling-pull-requests\">\n<span id=\"id1\"></span><h2>Gestion des requêtes de contribution<a class=\"heading-anchor\" href=\"#handling-pull-requests\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Comme Django est hébergé sur GitHub, les correctifs sont fournis sous la forme de requêtes de contribution (« pull request »).</p>\n<p>En commitant une requête de contribution, vérifiez que chaque commit individuel corresponde aux lignes de conduite présentées ci-dessous. On attend des contributeurs qu’ils fournissent les meilleurs requêtes de contribution possibles. En pratique, c’est aux fusionneurs, plus familiers avec les exigences de qualité des commits, que revient la décision de parachever eux-mêmes un commit pour qu’il satisfasse aux exigences posées.</p>\n<p>Il peut être souhaitable de demander à Jenkins ou aux actions GitHub de tester la requête de contribution à l’aide d’un des constructeurs qui ne se lance pas automatiquement, tel que Oracle ou Selenium. Voir la <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/CI\">page de Wiki CI</a> pour plus d’instructions.</p>\n<p>S’il se trouve que vous deviez fréquemment récupérer localement des requêtes de contribution, cet alias git vous sera utile :</p>\n<div class=\"code-block\" data-language=\"ini\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Ini code\"><code><span class=\"k\">[alias]</span>\n<span class=\"w\">    </span><span class=\"na\">pr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">!sh -c \\&quot;git fetch upstream pull/${1}/head:pr/${1} &amp;&amp; git checkout pr/${1}\\&quot;</span>\n</code></pre></div>\n<p>Ajoutez-le à votre fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.gitconfig</span></code> et définissez <code class=\"docutils literal notranslate\"><span class=\"pre\">upstream</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code>. Vous pouvez alors exécuter <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">pr</span> <span class=\"pre\">####</span></code> pour récupérer en local la requête de contribution correspondante.</p>\n<p>À ce stade, vous pouvez travailler sur le code. Utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">rebase</span> <span class=\"pre\">-i</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">commit</span> <span class=\"pre\">--amend</span></code> pour vous assurer que les commits présentent le niveau de qualité requis. Quand vous êtes prêt :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"c1\"># Pull in the latest changes from main.</span>\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>main\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>pull<span class=\"w\"> </span>upstream<span class=\"w\"> </span>main\n<span class=\"gp\">$ </span><span class=\"c1\"># Rebase the pull request on main.</span>\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>pr/####\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>rebase<span class=\"w\"> </span>main\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>main\n<span class=\"gp\">$ </span><span class=\"c1\"># Merge the work as &quot;fast-forward&quot; to main to avoid a merge commit.</span>\n<span class=\"gp\">$ </span><span class=\"c1\"># (in practice, you can omit &quot;--ff-only&quot; since you just rebased)</span>\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>merge<span class=\"w\"> </span>--ff-only<span class=\"w\"> </span>pr/XXXX\n<span class=\"gp\">$ </span><span class=\"c1\"># If you&#39;re not sure if you did things correctly, check that only the</span>\n<span class=\"gp\">$ </span><span class=\"c1\"># changes you expect will be pushed to upstream.</span>\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>--dry-run<span class=\"w\"> </span>upstream<span class=\"w\"> </span>main\n<span class=\"gp\">$ </span><span class=\"c1\"># Push!</span>\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>upstream<span class=\"w\"> </span>main\n<span class=\"gp\">$ </span><span class=\"c1\"># Delete the pull request branch.</span>\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>branch<span class=\"w\"> </span>-d<span class=\"w\"> </span>pr/xxxx\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM Pull in the latest changes from main.</span>\n<span class=\"gp\">...\\&gt;</span> git checkout main\n<span class=\"gp\">...\\&gt;</span> git pull upstream main\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM Rebase the pull request on main.</span>\n<span class=\"gp\">...\\&gt;</span> git checkout pr/####\n<span class=\"gp\">...\\&gt;</span> git rebase main\n<span class=\"gp\">...\\&gt;</span> git checkout main\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM Merge the work as &quot;fast-forward&quot; to main to avoid a merge commit.</span>\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM (in practice, you can omit &quot;--ff-only&quot; since you just rebased)</span>\n<span class=\"gp\">...\\&gt;</span> git merge --ff-only pr/XXXX\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM If you&#39;re not sure if you did things correctly, check that only the</span>\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM changes you expect will be pushed to upstream.</span>\n<span class=\"gp\">...\\&gt;</span> git push --dry-run upstream main\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM Push!</span>\n<span class=\"gp\">...\\&gt;</span> git push upstream main\n<span class=\"gp\">...\\&gt;</span> <span class=\"c1\">REM Delete the pull request branch.</span>\n<span class=\"gp\">...\\&gt;</span> git branch -d pr/xxxx\n</code></pre></div></div></div>\n<p>Poussez de force dans la branche après un « rebase » sur main, mais avant de fusionner et de pousser vers le dépôt amont. Cela permet d’harmoniser les empreintes de commit sur main et sur la branche ce qui va automatiquement fermer la requête de contribution.</p>\n<p>Si une requête de contribution ne doit pas être fusionnée avec plusieurs commits différents, il est possible d’utiliser le bouton «Squash and merge» du site Web. Modifiez le message de commit afin qu’il corresponde aux :ref:lignes directrices &lt;committing-guidelines&gt;` et enlevez le numéro de la requête de contribution qui est automatiquement ajouté à la première ligne du message.</p>\n<p>Lorsque vous réécrivez l’historique des commits dans une requête de contribution, l’objectif est de rendre l’historique des commits de Django le plus propre possible:</p>\n<ul class=\"simple\">\n<li><p>Si un correctif a été effectué sur plusieurs commits, réécrivez-le en un seul. Par exemple, si un commit ajoute du code et qu’un second ne fait qu’améliorer son écriture, ces commits devraient être compressés en un seul avant d’être fusionné dans le projet.</p></li>\n<li><p>Regroupez les changements de façon logique dans plusieurs commits. Si vous faites des changements cosmétiques en même temps que des modifications de code dans un autre fichier, le faire en deux commits distincts aide à relire l’historique des changements.</p></li>\n<li><p>Évitez les fusions de branches amont dans les requêtes de contribution.</p></li>\n<li><p>Les tests et la documentation devraient être validés et ne pas émettre d’avertissements ou d’erreurs après chaque commit.</p></li>\n<li><p>Les petits correctifs triviaux devraient être fait dans un seul commit. Les contributions plus importantes peuvent être fait en plusieurs commits si cela est plus claire.</p></li>\n</ul>\n<p>Conformément au concept « pratique vaut mieux que pureté », c’est à chaque fusionneur de décider de la manipulation d’historique nécessaire pour une requête de contribution. Les points essentiels sont l’engagement de la communauté, le travail bien fait et un historique de commit utilisable.</p>\n</section>\n<section id=\"committing-guidelines\">\n<span id=\"id2\"></span><h2>Lignes directrices pour les commits<a class=\"heading-anchor\" href=\"#committing-guidelines\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En plus, veuillez suivre les lignes directrices suivantes lorsque vous envoyez des commits dans le dépôt Git de Django :</p>\n<ul>\n<li><p>Ne modifiez jamais l’historique publié des branches <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code> en poussant (push) de force. Si vous devez absolument le faire (par exemple pour des raisons de sécurité), discutez d’abord de la situation avec l’équipe principale.</p></li>\n<li><p>Pour toute modification moyenne à importante, où « moyenne à importante » dépend de votre jugement, présentez la situation sur le <a class=\"reference external\" href=\"https://forum.djangoproject.com/\">forum Django</a> avant de procéder au changement.</p>\n<p>SI vous exposez quelque chose et que personne ne répond, ne considérez pas que cela signifie que votre idée est géniale et qu’elle doit être mise en œuvre immédiatement car personne ne la contestée. Tout le monde n’a pas toujours beaucoup de temps pour lire immédiatement les discussions, il se peut donc que vous deviez attendre un certain nombre de jours avant d’obtenir une réponse.</p>\n</li>\n<li><p>Écrivez les messages de commit détaillés au passé, pas au présent.</p>\n<ul class=\"simple\">\n<li><p>Juste : « Fixed Unicode bug in RSS API. »</p></li>\n<li><p>Faux : « Fixes Unicode bug in RSS API. »</p></li>\n<li><p>Faux : « Fixing Unicode bug in RSS API. »</p></li>\n</ul>\n<p>Le message de commit doit comporter des lignes de maximum 72 caractères. Il doit y avoir une ligne de sujet, suivi d’une ligne vierge et de paragraphes de lignes à 72 caractères (limites douces). Pour la ligne de sujet, le plus court est le mieux. Dans le corps du message de commit, plus il y a de détails, mieux c’est :</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"None code\"><code>Fixed #18307 -- Added git workflow guidelines.\n\nRefactored the Django&#39;s documentation to remove mentions of SVN\nspecific tasks. Added guidelines of how to use Git, GitHub, and\nhow to use pull request together with Trac instead.\n</code></pre></div>\n<p>Remerciez les contributeurs dans le message de commit : «Merci A pour le rapport et B pour la relecture ». Utilisez la balise <a class=\"reference external\" href=\"https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors\">Co-Authored-By</a> de git lorsque c’est approprié.</p>\n</li>\n<li><p>Pour des commits d’une branche, préfixez le message de commit avec le nom de branche. Par exemple : « [1.4.x] Fixed #xxxxx – Added support for mind reading. »</p></li>\n<li><p>Limitez les commits à la plus petite granularité qui garde du sens. Cela signifie qu’il est préférable d’avoir plusieurs petits commits fréquents plutôt que de gros commits ponctuels. Par exemple, si l’implémentation de la fonctionnalité X requiert une petite modification à la bibliothèque Y, alors faites le commit de la fonctionnalité X séparément. Cela aide <em>grandement</em> toutes les personnes qui suivent vos modifications.</p></li>\n<li><p>Séparez les corrections de bogues des nouvelles fonctionnalités. Les corrections de bogues peuvent nécessiter un rétroportage vers la branche stable, en accord avec <a class=\"reference internal\" href=\"/fr/5.2/internals/release-process/#supported-versions-policy\"><span class=\"std std-ref\">Versions prises en charge</span></a>.</p></li>\n<li><p>Si un commit ferme un ticket dans le <a class=\"reference external\" href=\"https://code.djangoproject.com/\">système de suivi</a> de Django, commencez le message de commit par le texte « Fixed #xxxxx », où « xxxxx » est le numéro du ticket résolu par le commit. Example : « Fixed #123 – Added whizbang feature. ». Nous avons adapté Trac pour que tout message de commit respectant ce format ferme automatiquement le ticket référencé et écrive un message sur le ticket contenant le message de commit complet.</p>\n<p>Pour les curieux, nous utilisons un <a class=\"reference external\" href=\"https://github.com/trac-hacks/trac-github\">greffon Trac</a> pour cela.</p>\n</li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Notez que l’intégration Trac ne sait pas tout sur les requêtes de contribution. AInsi si vous essayez de fermer une requête de contribution avec la phrase « closes #400 » dans le message de commit, GitHub fermera la requête, mais le greffon Trac ne fermera pas le ticket ayant le même numéro dans Trac.</p>\n</aside>\n<ul>\n<li><p>Si votre commit fait référence à un ticket dans le <a class=\"reference external\" href=\"https://code.djangoproject.com/\">suivi des tickets</a> de Django mais ne résoud <em>pas</em> le ticket, incluez l’expression « Refs #xxxxx », où « xxxxx » est le numéro de ticket référencé par votre commit. Cela enverra automatiquement un commentaire dans le ticket concerné.</p></li>\n<li><p>Écrivez les messages de commit pour les rétroportages en utilisant ce modèle :</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"None code\"><code>[&lt;Django version&gt;] Fixed &lt;ticket&gt; -- &lt;description&gt;\n\nBackport of &lt;revision&gt; from &lt;branch&gt;.\n</code></pre></div>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"None code\"><code>[1.3.x] Fixed #17028 -- Changed diveintopython.org -&gt; diveintopython.net.\n\nBackport of 80c0cbf1c97047daed2c5b41b296bbc56fe1d7e3 from main.\n</code></pre></div>\n<p>Il existe un script dans le wiki &lt;<a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/MergerTips#AutomatingBackports\">https://code.djangoproject.com/wiki/MergerTips#AutomatingBackports</a>&gt;`_ pour automatiser cela.</p>\n<p>Si le commit corrige une régression, incluez ceci dans le message de commit :</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"None code\"><code>Regression in 6ecccad711b52f9273b1acb07a57d3f806e93928.\n</code></pre></div>\n<p>(utilisez l’empreinte du commit où la régression a été introduite).</p>\n</li>\n</ul>\n</section>\n<section id=\"reverting-commits\">\n<h2>Annulation de commits<a class=\"heading-anchor\" href=\"#reverting-commits\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Personne n’est parfait ; des erreurs seront forcément commises.</p>\n<p>Mais faites tout votre possible pour que de telles erreurs ne se produisent pas. Le fait d’avoir une politique d’annulation ne vous enlève pas la responsabilité de viser la plus haute qualité possible. Sérieusement, vérifiez votre travail autant de fois que nécessaire ou faites-le vérifier par un autre fusionneur <strong>avant</strong> de procéder au commit !</p>\n<p>Lorsqu’un commit fautif est découvert, veuillez suivre les directives suivantes :</p>\n<ul class=\"simple\">\n<li><p>Si possible, faites faire l’annulation d’un commit par son auteur.</p></li>\n<li><p>N’annulez pas les modifications d’un autre auteur sans la permission de celui-ci.</p></li>\n<li><p>Utilisez <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">revert</span></code> – ce qui va produire un commit d’annulation, le commit original faisant toujours partie de l’historique des commits.</p></li>\n<li><p>Si l’auteur d’origine ne peut pas être contacté (dans un espace de temps raisonnable, un à deux jours) et que le problème est sérieux (bogue de plantage, échecs de tests majeurs, etc.), demandez sur le <a class=\"reference external\" href=\"https://forum.djangoproject.com/\">forum Django</a> s’il y a des oppositions puis procédez à l’annulation s’il n’y en a pas.</p></li>\n<li><p>Si le problème est mineur (par ex. un commit de fonctionnalité après le gel des fonctionnalités), attendez encore un peu.</p></li>\n<li><p>S’il y a désaccord entre le fusionneur et celui qui propose l’annulation, il s’agit de résoudre le conflit sur le <a class=\"reference external\" href=\"https://forum.djangoproject.com/\">forum Django</a>. Si aucun accord n’est trouvé, la décision doit alors être soumise à un vote.</p></li>\n<li><p>Si le commit a introduit une vulnérabilité de sécurité confirmée et révélée, le commit peut être immédiatement annulé sans obtenir de permission supplémentaire.</p></li>\n<li><p>Le mainteneur de la branche versionnée peut annuler des commits de cette branche sans demander de permission si un commit casse cette branche versionnée.</p></li>\n<li><p>Si vous avez poussé par erreur une branche de travail vers <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code>, supprimez-la. Par exemple, si vous avez écrit : <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">push</span> <span class=\"pre\">upstream</span> <span class=\"pre\">feature_antigravity</span></code>, procédez à la commande inverse : <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">push</span> <span class=\"pre\">upstream</span> <span class=\"pre\">:feature_antigravity</span></code>.</p></li>\n</ul>\n</section>","rootId":"committing-code","toc":[{"title":"Gestion des requêtes de contribution","anchor":"handling-pull-requests","children":[]},{"title":"Lignes directrices pour les commits","anchor":"committing-guidelines","children":[]},{"title":"Annulation de commits","anchor":"reverting-commits","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Fonctionnement interne du projet Django","url":"/fr/5.2/internals/"},{"docname":"internals/contributing/index","title":"Contribuer à Django","url":"/fr/5.2/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Contribution au code","url":"/fr/5.2/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/accessibility","title":"Accessibility","url":"/fr/5.2/internals/contributing/accessibility/"},"next":{"docname":"internals/contributing/writing-documentation","title":"Écrire la documentation","url":"/fr/5.2/internals/contributing/writing-documentation/"},"formats":{"html":"/fr/5.2/internals/contributing/committing-code/","markdown":"/fr/5.2/internals/contributing/committing-code.md","json":"/fr/5.2/internals/contributing/committing-code.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/internals/contributing/committing-code.txt","official":"https://docs.djangoproject.com/fr/5.2/internals/contributing/committing-code/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}