{"title":"Enviando código","version":"1.9","locale":"pt-br","docname":"internals/contributing/committing-code","url":"/pt-br/1.9/internals/contributing/committing-code/","canonical":"https://djangodocs.dev/pt-br/1.9/internals/contributing/committing-code/","summary":"Esta seção é direcionada aos Committers e a todos os interessados em saber como um trecho de código é incorporado ao Django pelos desenvolvedores do projeto.","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 é direcionada aos <a class=\"reference internal\" href=\"/pt-br/1.9/internals/roles/#committers\"><span class=\"std std-ref\">Committers</span></a> e a todos os interessados em saber como um trecho de código é incorporado ao Django pelos desenvolvedores do projeto. Se você é um membro da comunidade que deseja contribuir com o Django enviando o seu código, dê uma olhada em <a class=\"reference internal\" href=\"/pt-br/1.9/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 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>Evite usar o botão “Merge pull request” no site do GitHub já que isso cria um  “merge commit” tosco fazendo a navegação no histórico ficar mais difícil.</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. Testes e documentação não devem emitir quaisquer warnings.</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 mude o histórico publicado das branches django/django! <strong>Nunca force um push para django/django.</strong> Se você absolutamente precisar (por questões de segurança por exemplo) primeiro discuta a situação com o time do projeto.</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>Se você trouxer algo novo para a lista django-developers e ninguém te respondeu por favor não entenda isso como sendo um sinal de que a sua ideia é excelente e deve ser implementada imediatamente já ninguém a contestou. Os desenvolvedores do Django não tem muito tempo disponível para ler as discussões na lista de e-mail imediatamente. Então você pode precisar esperar alguns dias antes de conseguir uma resposta.</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>As mensagens de commit devem ser em linhas de no máximo 72 caracteres. Deve existir uma linha de assunto, separada por uma linha em branco e então parágrafos de linhas de 72 caracteres. Os limites são boas práticas. Para a linha de assunto, quanto mais curta melhor. Em um corpo de uma mensagem de commit mais detalhes é melhor que menos:</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>Fixed <span class=\"c1\">#18307 -- Added git workflow guidelines</span>\n\nRefactored the Django<span class=\"s1\">&#39;s documentation to remove mentions of SVN</span>\nspecific tasks<span class=\"o\">.</span> Added guidelines of how to use Git<span class=\"p\">,</span> GitHub<span class=\"p\">,</span> <span class=\"ow\">and</span>\nhow to use pull request together <span class=\"k\">with</span> Trac instead<span class=\"o\">.</span>\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>Limite os commits para a mudança mais granular que fizer sentido. Isso significa, fazer uso de commits pequenos e frequentes ao invés de commits grandes e pouco frequentes. Por exemplo, se implementar a funcionalidade X requer uma pequena mudança na biblioteca Y, primeiro faça um commit da mudança na biblioteca Y, depois faça commit da funcionalidade X em um outro commit separado. Isso já <em>facilita muito</em> no processo de ajudar todos os desenvolvedores do Django a seguir as suas alterações.</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.9/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>Escreva mensagens de commit para backports usando este formato:</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><span class=\"p\">[</span><span class=\"o\">&lt;</span>Django version<span class=\"o\">&gt;</span><span class=\"p\">]</span> Fixed <span class=\"o\">&lt;</span>ticket<span class=\"o\">&gt;</span> <span class=\"o\">--</span> <span class=\"o\">&lt;</span>description<span class=\"o\">&gt;</span>\n\nBackport of <span class=\"o\">&lt;</span>revision<span class=\"o\">&gt;</span> <span class=\"kn\">from</span> <span class=\"o\">&lt;</span>branch<span class=\"o\">&gt;.</span>\n</code></pre></div>\n<p>Por exemplo:</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><span class=\"p\">[</span><span class=\"mf\">1.3</span><span class=\"o\">.</span>x<span class=\"p\">]</span> Fixed <span class=\"c1\">#17028 -- Changed diveintopython.org -&gt; diveintopython.net.</span>\n\nBackport of <span class=\"mi\">80</span>c0cbf1c97047daed2c5b41b296bbc56fe1d7e3 <span class=\"kn\">from</span> <span class=\"nn\">master.</span>\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ê sem querer fez um push de uma branch para django/django, simplesmente delete ela. Por exemplo, se você fez: git push upstream funcionalidade_antigravidade`, apenas faça um push reverso: <code class=\"docutils literal notranslate\">git push upstream :funcionalidade_antigravidade</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.9/internals/"},{"docname":"internals/contributing/index","title":"Contribuindo com o Django","url":"/pt-br/1.9/internals/contributing/"}],"prev":{"docname":"internals/contributing/localizing","title":"Localizando Django","url":"/pt-br/1.9/internals/contributing/localizing/"},"next":{"docname":"internals/mailing-lists","title":"Listas de email","url":"/pt-br/1.9/internals/mailing-lists/"},"formats":{"html":"/pt-br/1.9/internals/contributing/committing-code/","markdown":"/pt-br/1.9/internals/contributing/committing-code.md","json":"/pt-br/1.9/internals/contributing/committing-code.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/internals/contributing/committing-code.txt","official":"https://docs.djangoproject.com/pt-br/1.9/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","es"]}