{"title":"Enviando código","version":"3.2","locale":"pt-br","docname":"internals/contributing/committing-code","url":"/pt-br/3.2/internals/contributing/committing-code/","canonical":"https://djangodocs.dev/pt-br/3.2/internals/contributing/committing-code/","summary":"Esta seção é destinada para os committers e para qualquer interessado em entender como o código é comitado no Django. Se você é membro de uma comunidade e quer…","html":"<h1>Enviando código<a class=\"heading-anchor\" href=\"#committing-code\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Esta seção é destinada para os committers e para qualquer interessado em entender como o código é comitado no Django. Se você é membro de uma comunidade e quer contribuir com código para o Django, veja o <a class=\"reference internal\" href=\"/pt-br/3.2/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Trabalhando com Git e GitHub</span></a>.</p>\n<section id=\"handling-pull-requests\">\n<span id=\"id1\"></span><h2>Manipulando pull requests<a class=\"heading-anchor\" href=\"#handling-pull-requests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Como o Django é hospeado no GitbHub, os patches são provisionados na forma de pull requests.</p>\n<p>Ao fazer um pull request, certifique-se de que cada commit individualmente satisfaça as regras descritas abaixo. Espera-se de quem contribui os melhores pull requests possíveis de se fornecer. Na prática, entretanto, os committers, - quem provavelmente estará mais familiarizado com as regras do projeto - podem decidir melhorar a qualidade de um commit por conta própria.</p>\n<p>Você pode querer ter o Jenkins a testar o pull request com um dos pull requests builders que não rodem automaticamente, como o Oracle or Selenium. Veja a <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/Jenkins\">página wiki do Jenkins</a> para mais instruções</p>\n<p>If you find yourself checking out pull requests locally more often, this git\nalias will be helpful:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</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=\"Code code\"><code>[alias]\n    pr = !sh -c \\&quot;git fetch upstream pull/${1}/head:pr/${1} &amp;&amp; git checkout pr/${1}\\&quot;\n</code></pre></div>\n<p>Add it to your <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.gitconfig</span></code>, and set <code class=\"docutils literal notranslate\"><span class=\"pre\">upstream</span></code> to be <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code>.\nThen you can run <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">pr</span> <span class=\"pre\">####</span></code> to checkout the corresponding pull request.</p>\n<p>A partir deste momento, você pode trabalhar no código. Utilize <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">rebase</span> <span class=\"pre\">-i</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">commit</span> <span class=\"pre\">--amend</span></code> para garantir que os commits tenham o nível de qualidade desejado. Quando você estiver pronto:</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>Force push to the branch after rebasing on main but before merging and pushing\nto upstream. This allows the commit hashes on main and the branch to match\nwhich automatically closes the pull request.</p>\n<p>If a pull request doesn’t need to be merged as multiple commits, you can use\nGitHub’s “Squash and merge” button on the website. Edit the commit message as\nneeded to conform to <a class=\"reference internal\" href=\"#committing-guidelines\"><span class=\"std std-ref\">the guidelines</span></a> and remove\nthe pull request number that’s automatically appended to the message’s first\nline.</p>\n<p>Quando estiver reescrevendo o histórico de commits de um pull request, o objetivo é fazer com que o histórico de commits do Django seja o mais útil possível:</p>\n<ul class=\"simple\">\n<li><p>Se um patch possui retornos e avanços nos commits, então reescreva esses em um só. Por exemplo, se um commit adiciona mais código e um segundo commit faz ajustes em problemas de estilo introduzidos pelo primeiro commit, esses commits devem ser unificados antes de se fazer um merge.</p></li>\n<li><p>Separe as mudanças em diferentes commits por grupos lógicos: se você faz uma limpeza de estilo ao mesmo tempo em que você faz outras mudanças em um arquivo, a separação dessas mudanças em dois commits diferentes fará a revisão do histórico de alterações mais simples.</p></li>\n<li><p>Cuidado com merges de branches do upstream dentro de pull requests.</p></li>\n<li><p>Testes devem passar e a documentação deve ser gerada depois de cada commit. Nem os testes, nem a documentação devem emitir avisos.</p></li>\n<li><p>Patchs triviais e pequenos costumam ser melhor realizados em um único commit. Trabalhos médios ou maiores podem ser quebrados em múltiplos commits se isso fizer sentido.</p></li>\n</ul>\n<p>Praticidade vence pureza, então cabe a cada committer decidir o quanto refinar o histórico antes de um pull request. O principal é engajar a comunidade, terminar o trabalho, e ter um histórico de commits utilizável.</p>\n</section>\n<section id=\"committing-guidelines\">\n<span id=\"id2\"></span><h2>Regras de commit<a class=\"heading-anchor\" href=\"#committing-guidelines\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Adicionalmente, por favor siga as regras a seguir quando estiver commitando código para o repositório do Django no git:</p>\n<ul>\n<li><p>Nunca altere o histórico publicado dos “branches” do  <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code> através de um “push” forçado. Se for absolutamente necessário (por razões de segurança), primeiro discuta a situação com o time.</p></li>\n<li><p>Para qualquer mudança de média para grande, onde “média para grande” é de acordo com o seu próprio julgamento, por favor traga o problema para a lista de e-mail django-developers antes de fazer a mudança.</p>\n<p>If you bring something up on <a class=\"reference internal\" href=\"/pt-br/3.2/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a> and nobody responds,\nplease don’t take that to mean your idea is great and should be\nimplemented immediately because nobody contested it. Everyone doesn’t always\nhave a lot of time to read mailing list discussions immediately, so you may\nhave to wait a couple of days before getting a response.</p>\n</li>\n<li><p>Escreva os commits com mensagens detalhadas e utilizando o passado como tempo verbal, não o presente.</p>\n<ul class=\"simple\">\n<li><p>Bom: “Corrigido bug de Unicode na API de RSS.”</p></li>\n<li><p>Ruim: “Corrige bug de Unicode na API de RSS.”</p></li>\n<li><p>Ruim: “Corrigindo bug de Unicode na API de RSS.”</p></li>\n</ul>\n<p>The commit message should be in lines of 72 chars maximum. There should be\na subject line, separated by a blank line and then paragraphs of 72 char\nlines. The limits are soft. For the subject line, shorter is better. In the\nbody of the commit message more detail is better than less:</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>Credit the contributors in the commit message: “Thanks A for the report and B\nfor review.” Use git’s <a class=\"reference external\" href=\"https://docs.github.com/en/github/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors\">Co-Authored-By</a> as appropriate.</p>\n</li>\n<li><p>Para commits em uma branch, coloque antes da mensagem de commit o nome da branch. Por exemplo: “[1.4.x] Fixed #xxxxx – Adicionado suporte para leitura de mentes.”</p></li>\n<li><p>Limit commits to the most granular change that makes sense. This means,\nuse frequent small commits rather than infrequent large commits. For\nexample, if implementing feature X requires a small change to library Y,\nfirst commit the change to library Y, then commit feature X in a separate\ncommit. This goes a <em>long way</em> in helping everyone follow your changes.</p></li>\n<li><p>Separate bug fixes from feature changes. Bugfixes may need to be backported\nto the stable branch, according to <a class=\"reference internal\" href=\"/pt-br/3.2/internals/release-process/#supported-versions-policy\"><span class=\"std std-ref\">Versões suportadas</span></a>.</p></li>\n<li><p>Se o seu commit fecha um ticket no rastreador de tickets do Django, comece a sua mensagem de commit com o texto “Fixed #xxxxx”, onde “xxxxx” é o número do ticket que o seu commit corrige. Exemplo: “Corrigido #123 – Adicionada a funcionalidade whizbang.”.\nNós configuramos o Trac de modo que qualquer mensagem de commit nesse formato irá automaticamente fechar o ticket referenciado e colocar um comentário nele com a mensagem completa do commit.</p>\n<p>Para os curiosos, nós estamos utilizando um <a class=\"reference external\" href=\"https://github.com/trac-hacks/trac-github\">Trac plugin</a> para isso.</p>\n</li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Note that the Trac integration doesn’t know anything about pull requests.\nSo if you try to close a pull request with the phrase “closes #400” in your\ncommit message, GitHub will close the pull request, but the Trac plugin\nwill not close the same numbered ticket in Trac.</p>\n</aside>\n<ul>\n<li><p>Se o seu commit faz referência a um ticket no rastreador de tickets do Django mas <em>não</em> fecha o ticket, inclua a frase  “Refs #xxxxx”, onde “xxxxx” é o número do ticket que o seu commit faz menção. Isso irá automaticamente postar um comentário na página do respectivo ticket.</p></li>\n<li><p>Escreva mensagens de commit para backports usando esse formato:</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>Por exemplo:</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>Existe um <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/CommitterTips#AutomatingBackports\">script na wiki</a> para automatizar isso.</p>\n<p>If the commit fixes a regression, include this in the commit message:</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>(use the commit hash where the regression was introduced).</p>\n</li>\n</ul>\n</section>\n<section id=\"reverting-commits\">\n<h2>Revertendo commits<a class=\"heading-anchor\" href=\"#reverting-commits\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ninguém é perfeito; erros serão comitados.</p>\n<p>Mas esforce-se de verdade para garantir que erros não aconteçam. O fato de termos uma política de reversão não reduz a sua responsabilidade em buscar o maior padrão de qualidade possível. De verdade: revise o seu trabalho duas vezes, ou deixe ele ser revisado por outro committer, <strong>antes</strong> de você já ter feito o commit dele!</p>\n<p>Quando um commit indevido é descoberto, por favor siga as instruções abaixo:</p>\n<ul class=\"simple\">\n<li><p>Se possível, deixe que o autor original reverta o seu próprio commit.</p></li>\n<li><p>Não faça o revert das mudanças de outro autor sem a permissão do autor original.</p></li>\n<li><p>Utilize o git revert – isso irá fazer um commit reverso, mas o commit original ainda será parte do histórico de commits.</p></li>\n<li><p>Se o autor original não puder ser encontrado (dentro de um prazo razoável – um dia ou algo assim) e o problema é severo – bug quebrando a build, vários testes falhando, etc. – então pergunte se existe alguma objeção na lista de e-mail django-developers e então reverta o código se elas não existirem.</p></li>\n<li><p>Se o problema é pequeno (uma funcionalidade congelada, por exemplo) aguarde.</p></li>\n<li><p>Se existir um desacordo entre o committer e o autor do código a sofrer um revert então tente solucionar o problema na lista de e-mail django-developers. Se um acordo não puder ser encontrado então o problema deve ser submetido a uma votação.</p></li>\n<li><p>Se o commit introduziu uma vulnerabilidade de segurança confirmada, aberta então o commit deve ser revertido imediatamente sem permissão de ninguém.</p></li>\n<li><p>O mantenedor da branch de releases pode voltar commits nessa branch sem permissão caso o commit tenha quebrado a branch de releases.</p></li>\n<li><p>If you mistakenly push a topic branch to <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code>, delete it.\nFor instance, if you did: <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>,\ndo a reverse push: <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":"Manipulando pull requests","anchor":"handling-pull-requests","children":[]},{"title":"Regras de commit","anchor":"committing-guidelines","children":[]},{"title":"Revertendo commits","anchor":"reverting-commits","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Funcionamento interno do Projeto Django","url":"/pt-br/3.2/internals/"},{"docname":"internals/contributing/index","title":"Contribuindo com o Django","url":"/pt-br/3.2/internals/contributing/"}],"prev":{"docname":"internals/contributing/localizing","title":"Localizando Django","url":"/pt-br/3.2/internals/contributing/localizing/"},"next":{"docname":"internals/mailing-lists","title":"Listas de email","url":"/pt-br/3.2/internals/mailing-lists/"},"formats":{"html":"/pt-br/3.2/internals/contributing/committing-code/","markdown":"/pt-br/3.2/internals/contributing/committing-code.md","json":"/pt-br/3.2/internals/contributing/committing-code.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/internals/contributing/committing-code.txt","official":"https://docs.djangoproject.com/pt-br/3.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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}