{"title":"Enviando código","version":"1.11","locale":"pt-br","docname":"internals/contributing/committing-code","url":"/pt-br/1.11/internals/contributing/committing-code/","canonical":"https://djangodocs.dev/pt-br/1.11/internals/contributing/committing-code/","summary":"This section is addressed to the committers and to anyone interested in knowing how code gets committed into Django.","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>This section is addressed to the committers and to anyone interested in knowing\nhow code gets committed into Django. If you’re a community member who wants to\ncontribute code to Django, look at <a class=\"reference internal\" href=\"/pt-br/1.11/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Trabalhando com Git e GitHub</span></a> instead.</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 agora é hospedado no GitHub, a maioria das melhorias é fornecida 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<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Antes de fazer um merge, mas depois de revisar, faça com que o Jenkins teste o pull request comentando “buildbot, test this please” no PR. Veja nossa página wiki do ‘Jenkins’_ para mais detalhes.</p>\n</aside>\n<p>Um jeito fácil de fazer checkout de um pull request localmente é adicionando um alias no seu <code class=\"docutils literal notranslate\">~/.gitconfig</code> (estamos assumindo que <code class=\"docutils literal notranslate\">django/django</code> é o nosso <code class=\"docutils literal notranslate\">upstream</code>):</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>Agora você pode simplesmente executar <code class=\"docutils literal notranslate\">git pr ####</code> para realizar o checkout do pull request correspondente.</p>\n<p>A partir deste momento, você pode trabalhar no código. Utilize <code class=\"docutils literal notranslate\">git rebase -i</code> e <code class=\"docutils literal notranslate\">git commit --amend</code> para garantir que os commits tenham o nível de qualidade desejado. Quando você estiver pronto:</p>\n<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 master.</span>\n<span class=\"gp\">$ </span>git checkout master\n<span class=\"gp\">$ </span>git pull upstream master\n<span class=\"gp\">$ </span><span class=\"c1\"># Rebase the pull request on master.</span>\n<span class=\"gp\">$ </span>git checkout pr/####\n<span class=\"gp\">$ </span>git rebase master\n<span class=\"gp\">$ </span>git checkout master\n<span class=\"gp\">$ </span><span class=\"c1\"># Merge the work as &quot;fast-forward&quot; to master 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 merge --ff-only 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 push --dry-run upstream master\n<span class=\"gp\">$ </span><span class=\"c1\"># Push!</span>\n<span class=\"gp\">$ </span>git push upstream master\n<span class=\"gp\">$ </span><span class=\"c1\"># Delete the pull request branch.</span>\n<span class=\"gp\">$ </span>git branch -d pr/xxxx\n</code></pre></div>\n<p>Para mudanças em suas próprias branches, force o push no seu fork depois de fazer o rebase na master mas antes de fazer merge e push para o upstream. Isso permite que os hashes dos commits na master e na sua branch coincidam o que fecha o pull request automaticamente. Como você não pode fazer push na branch de outros contribuidores, comente no pull request “Merged in XXXXXXX” (trocando pelo hash do commit) depois que você fizer o merge. Trac procura esse formato de mensagem para indicar na página do ticket se foi feito um merge de um pull request ou não.</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. Já 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 vai de cada committer decidir o quanto refinar o histórico antes de um pull request. Os principais objetivos devem ser 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\">django/django</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/1.11/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>Se o patch não foi um pull request, você deverá dar crédito as pessoas que contribuiram na mensagem de commit: “Obrigado A por avisar, B pelo patch e C por revisar.”</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] Corrigido #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>Separe as correções de bug das mudanças nas funcionalidades. Correções de bug podem ter que ser portadas para a branch stable, de acordo com a <a class=\"reference internal\" href=\"/pt-br/1.11/internals/release-process/#backwards-compatibility-policy\"><span class=\"std std-ref\">backwards-compatibility política de compatibilidade</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>Se o seu commit fecha um ticket e está dentro de uma branch, utilize o nome da branch primeiro, depois o “Corrigido #xxxxx.” Por exemplo: “[1.4.x] Corrigido #123 – Adicionada a funcionalidade whizbang.”</p>\n<p>Para os curiosos, nós estamos utilizando um plugin do Track para isso.</p>\n</li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Repare que a integração com o Trac não sabe nada sobre os pull requests. Portanto, se você tentar fechar um pull request com a frase “encerra #400 na sua mensagem de commit, o GitHub irá fechar o pull request, mas o plugin do Trac irá fechar também o respectivo ticket dentro do 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>Write commit messages for backports using this pattern:</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 master.\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</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>Se você erroneamente fizer um “push” em um “branch” para “django/django”, apenas delete. Por exemplo, se você fizer <code class=\"docutils literal notranslate\">git push upstream feature_antigravity</code>, apenas reverta o “push”: <code class=\"docutils literal notranslate\">git push upstream :feature_antigravity</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/1.11/internals/"},{"docname":"internals/contributing/index","title":"Contribuindo com o Django","url":"/pt-br/1.11/internals/contributing/"}],"prev":{"docname":"internals/contributing/localizing","title":"Localizando Django","url":"/pt-br/1.11/internals/contributing/localizing/"},"next":{"docname":"internals/mailing-lists","title":"Listas de email","url":"/pt-br/1.11/internals/mailing-lists/"},"formats":{"html":"/pt-br/1.11/internals/contributing/committing-code/","markdown":"/pt-br/1.11/internals/contributing/committing-code.md","json":"/pt-br/1.11/internals/contributing/committing-code.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/internals/contributing/committing-code.txt","official":"https://docs.djangoproject.com/pt-br/1.11/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","fr","ja","id","pt-br","ko","es","el","pl"]}