Trabalhando com Git e GitHub¶
This section explains how the community can contribute code to Django via pull requests. If you’re interested in how mergers handle them, see Enviando código.
Abaixo, iremos mostrar como criar um “pull request” no GitHub, contendo as mudanças para o ticket #xxxxx do Trac. Criando um “pull request” totalmente pronto, você tornará mais fácil o trabalho dos revisores, o que quer dizer que seu trabalho está mais próximo de ser “mergeado” no Django.
Você também poderia fazer upload de um patch tradicional no Trac, mas isso é menos prático para os revisores.
Instalando Git¶
Django uses Git for its source control. You can download Git, but it’s often easier to install with your operating system’s package manager.
O repositório do Django é hospedado no GitHub, e é recomendado que você também trabalhe usando o GitHub.
After installing Git, the first thing you should do is set up your name and email:
$ git config --global user.name "Your Real Name"
$ git config --global user.email "[email protected]"
Note que user.name
deve ser o seu nome real, e não o seu nick no GitHub. O GitHub deve saber o email que você usa pelo campo user.email
, já que ele será usado para associar os seus commits com a sua conta no GitHub.
Configurando o repositório local¶
Uma vez que você tenha criado a sua conta no GitHub, com o nick “GitHub_nick”, e realizado o fork do repositório do Django, crie uma cópia local do seu fork:
git clone https://github.com/GitHub_nick/django.git
Isso irá criar um novo diretório “django”, contendo um “clone” do seu repositório do GitHub. O resto dos comandos git nesta página precisam ser executados dentro do diretório do seu “clone”, então vá para lá agora:
cd django
O seu repositório GitHub será chamado de “origin” no Git.
You should also set up django/django
as an “upstream” remote (that is, tell
git that the reference Django repository was the source of your fork of it):
git remote add upstream https://github.com/django/django.git
git fetch upstream
Você pode adicionar outros “upstreams” remotos de modo similar, por exemplo:
git remote add akaariai https://github.com/akaariai/django.git
Trabalhando em um ticket¶
When working on a ticket, create a new branch for the work, and base that work
on upstream/main
:
git checkout -b ticket_xxxxx upstream/main
A flag -b cria uma nova branch para você localmente. Não hesite em criar novas branches mesmo para as coisas mais simples - esse é o motivo delas existirem.
Se ao invés disso você estiver trabalhando em uma correção na branch 1.4, você poderia fazer:
git checkout -b ticket_xxxxx_1_4 upstream/stable/1.4.x
Assuma que o trabalho está sendo feito no “branch” chamado ticket_xxxxx. Faça algumas mudanças e então faça o commit:
git commit
When writing the commit message, follow the commit message guidelines to ease the work of the merger. If you’re uncomfortable with English, try at least to describe precisely what the commit does.
Se você precisar fazer trabalho adicional na sua branch, faça commit com tanta frequência quanto for necessário.
git commit -m 'Added two more tests for edge cases'
Publicando trabalho¶
You can publish your work on GitHub by running:
git push origin ticket_xxxxx
Quando acessar sua página no GitHub, irá perceber que um novo “branch” foi criado.
Se você está trabalhando em um ticket do Trac, você deve mencionar no ticket que o seu trabalho está disponível através da branch ticket_xxxxx do seu repositório no GitHub. Inclua um link para a sua branch.
Tenha em mente que a branch acima é chamada de “topic branch” no linguajar do Git. Você é livre para reescrever o histórico dessa branch, através do uso do git rebase
por exemplo. Outras pessoas não deveriam basear o seu trabalho em uma branch como essa, porque os clones dela serão corrompidos quando você editar os seus commits.
There are also “public branches”. These are branches other people are supposed
to fork, so the history of these branches should never change. Good examples
of public branches are the main
and stable/A.B.x
branches in the
django/django
repository.
Quando você achar que o seu trabalho está pronto para ser enviado para o Django, você deve criar um pull request no GitHub. Um bom pull request significa:
- Commits com uma mudança lógica, seguindo o estilo de código,
- Mensagens bem formatadas para cada commit: uma linha de sumário e então parágrafos embutidos em até 72 caracteres depois dela – veja as regras de commit para mais detalhes.
- Documentação e testes, quando necessário – na verdade testes são sempre necessários, exceto para mudanças na documentação.
A suíte de testes deve passar e a documentação deve ser gerada sem quaisquer warnings.
Uma vez que tenha criado seu pull request, você deve adicionar um comentário no ticket do Trac relacionado explicando o que você fez. Em particular, você deve mencionar o ambiente no qual você rodou os testes, por exemplo: “all tests pass under SQLite and MySQL”.
Pull requests at GitHub have only two states: open and closed. The merger who will deal with your pull request has only two options: merge it or close it. For this reason, it isn’t useful to make a pull request until the code is ready for merging – or sufficiently close that a merger will finish it themselves.
Fazendo rebase de branches¶
No exemplo acima, você criou dois commits, o “Fixed ticket_xxxxx” e o “Added two more tests”.
Nós não queremos ter o histórico inteiro do seu processo de trabalho no seu repositório. O seu commit “Added two more tests” seria poluído e pouco amigável. Ao invés disso, nós preferimos ter apenas um commit contendo todo o seu trabalho.
Para retrabalhar o histórico da sua branch você pode esmagar os commits tornando todos eles uma coisa só através do uso interativo do rebase:
git rebase -i HEAD~2
O HEAD~2 acima é um atalho para os dois últimos commits. O comando acima irá abrir um editor mostrando os dois commits, prefixados com a palavra “pick”.
Mude “pick” na segunda linha para “squash”. Isso manterá o primeiro commit, e esmagará o segundo commit dentro do primeiro. Salve e feche o editor. Uma segunda janela do editor deverá abrir, de modo que você possa reescrever a mensagem de commit agora que ele está incluindo os seus dois passos.
Você também pode usar a opção “edit” no rebase. Desta forma você pode mudar um único commit, por exemplo para corrigir um erro de ortografia em uma docstring:
git rebase -i HEAD~3
# Choose edit, pick, pick for the commits
# Now you are able to rework the commit (use git add normally to add changes)
# When finished, commit work with "--amend" and continue
git commit --amend
# Reword the commit message if needed
git rebase --continue
# The second and third commits should be applied.
Se seu “branch” já está publicado no GitHyb, por exemplo se você está fazendo alterações pequenas para considerar uma revisão, você precisa forçar o “push” com as alterações:
git push -f origin ticket_xxxxx
Note that this will rewrite history of ticket_xxxxx - if you check the commit hashes before and after the operation at GitHub you will notice that the commit hashes do not match anymore. This is acceptable, as the branch is a topic branch, and nobody should be basing their work on it.
Depois que o upstream foi modificado¶
Quando o “upstream” (“django/django”) for alterado, você deve fazer um “rebase” no seu trabalho. Para isso, use o:
git fetch upstream
git rebase
The work is automatically rebased using the branch you forked on, in the
example case using upstream/main
.
O comando rebase remove todos os seus commits locais temporariamente, aplica os commits do upstream, e então aplica os seus commits locais novamente.
Se houver conflitos nos “merges”, precisamos resolvê-los e então usar o get rebase --continue
. Em qualquer momento você pode usar o get rebase --abort
para retornar ao estado original.
Note que você quer fazer rebase no upstream, e não merge do upstream.
A razão para isso é que ao fazer o rebase, os seus commits sempre ficarão no topo do trabalho realizado no upstream e não misturado com as mudanças do upstream. Desta forma a sua topic branch irá conter somente commits relacionados a ela, o que faz com que o processo de esmagar os seus commits fique mais simples.
Depois de revisar¶
É muito incomum receber qualquer porção de código não trivial incluída no core do Django sem quaisquer alterações sendo solicitadas pelos revisores. Neste caso, costuma ser uma boa ideia adicionar as mudanças na forma de um commit incremental para o seu trabalho. Isso permite que os revisores possam checar facilmente quais mudanças você fez.
Neste caso, faça as mudanças solicitadas pelo revisor. Faça commit tão frequentemente quanto necessário. Antes de publicar as mudanças, faça o rebase do seu trabalho. Se você adicionou mais dois commits, você pode rodar o seguinte comando:
git rebase -i HEAD~2
Esmague o segundo commit dentro do primeiro. Escreva uma mensagem de commit junto das linhas de:
Made changes asked in review by <reviewer>
- Fixed whitespace errors in foobar
- Reworded the docstring of bar()
Finalmente, faça o “push” do seu trabalho de volta para o seu respotitório do GitHub. Uma vez que não tenha tocado nos “commits” públicos durante o “rebase”, você não vai precisar forçar um “push” (force-push):
git push origin ticket_xxxxx
O seu pull request deve agora conter um novo commit também.
Note that the merger is likely to squash the review commit into the previous commit when committing the code.
Trabalhando em um patch¶
Uma das formas que os desenvolvedores podem contribuir com o Django é revisando patches. Esses patches tipicamente existirão na forma de pull requests no GitHub e poderão ser facilmente integrados dentro do seu repositório local:
git checkout -b pull_xxxxx upstream/main
curl https://github.com/django/django/pull/xxxxx.patch | git am
Isso irá criar uma nova branch e então aplicar as mudanças do pull request nela. Neste momento você pode rodar os testes ou fazer qualquer coisa que você precise para investigar a qualidade do patch.
For more detail on working with pull requests see the guidelines for mergers.
Sumário¶
- Trabalhe no GitHub se você puder.
- Anuncie o seu trabalho no ticket do Trac adicionando um link para a sua branch no GitHub.
- Quando você tiver algo pronto, faça um pull request.
- Faça os pull requests tão bons quanto puder.
- Quando estiver fazendo correçṍes no seu trabalho, use
git rebase -i
para esmagar os commits. - Quando o upstream tiver sido alterado, faça
git fetch upstream; git rebase
.