summaryrefslogtreecommitdiff
path: root/docs/internals/contributing/writing-code/working-with-git.txt
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2012-06-08 11:26:22 +0200
committerAymeric Augustin <aymeric.augustin@m4x.org>2012-06-08 11:26:22 +0200
commit329bb9296f402c6e7d7b648937b72b13a6f5756c (patch)
treedeccdef6822d7439c086860a7ae712f18fa1e65f /docs/internals/contributing/writing-code/working-with-git.txt
parent23d230f05833a63e951b8f451ff6c9f570eb3208 (diff)
Proof-read the new contributing guide.
Many thanks to Daniele Procida.
Diffstat (limited to 'docs/internals/contributing/writing-code/working-with-git.txt')
-rw-r--r--docs/internals/contributing/writing-code/working-with-git.txt178
1 files changed, 101 insertions, 77 deletions
diff --git a/docs/internals/contributing/writing-code/working-with-git.txt b/docs/internals/contributing/writing-code/working-with-git.txt
index dee9b9e074..ad03a29860 100644
--- a/docs/internals/contributing/writing-code/working-with-git.txt
+++ b/docs/internals/contributing/writing-code/working-with-git.txt
@@ -11,18 +11,20 @@ that you also work using GitHub.
After installing Git the first thing you should do is setup your name and
email::
- $ git config --global user.name "Firstname Lastname"
- $ git config --global user.email "your_email@youremail.com"
+ $ git config --global user.name "Your Real Name"
+ $ git config --global user.email "you@email.com"
Note that ``user.name`` should be your real name, not your GitHub nick. GitHub
should know the email you use in the ``user.email`` field, as this will be
used to associate your commits with your GitHub account.
Now we are going to show how to create a GitHub pull request containing the
-changes for Trac ticket #xxxxx. By creating a fully ready pull request you
-will make the committers' job easier, and thus your work is more likely to be
-merged into Django. You can also upload a traditional patch to Trac, but it's
-less practical for reviews.
+changes for Trac ticket #xxxxx. By creating a fully-ready pull request you
+will make the committers' job easier, meaning that your work is more likely to
+be merged into Django.
+
+You could also upload a traditional patch to Trac, but it's less practical for
+reviews.
.. _Git: http://git-scm.com/
.. _GitHub: https://github.com/
@@ -31,14 +33,18 @@ less practical for reviews.
Setting up local repository
---------------------------
-When you have created a GitHub account, with the nick "github_nick", and
-forked Django's repository, you should create a local copy of your fork::
+When you have created your GitHub account, with the nick "github_nick", and
+forked Django's repository, create a local copy of your fork::
git clone git@github.com:github_nick/django.git
-This will create a new directory "django" containing a clone of your GitHub
-repository. Your GitHub repository will be called "origin" in Git. You should
-also setup django/django as an "upstream" remote::
+This will create a new directory "django", containing a clone of your GitHub
+repository.
+
+Your GitHub repository will be called "origin" in Git.
+
+You should also setup 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 git@github.com:django/django.git
git fetch upstream
@@ -50,12 +56,15 @@ You can add other remotes similarly, for example::
Working on a ticket
-------------------
-When working on a ticket you will almost always want to create a new branch
-for the work, and base that work on upstream/master::
+When working on a ticket create a new branch for the work, and base that work
+on upstream/master::
git checkout -b ticket_xxxxx upstream/master
-If you are working for a fix on the 1.4 branch, you would instead do::
+The -b flag creates a new branch for you locally. Don't hesitate to create new
+branches even for the smallest things - that's what they are there for.
+
+If instead you were working for a fix on the 1.4 branch, you would do::
git checkout -b ticket_xxxxx_1_4 upstream/stable/1.4.x
@@ -64,7 +73,7 @@ commit them::
git commit
-When writing the commit message, you should follow the :ref:`commit message
+When writing the commit message, follow the :ref:`commit message
guidelines <committing-guidlines>` to ease the work of the committer. If
you're uncomfortable with English, try at least to describe precisely what the
commit does.
@@ -77,69 +86,77 @@ necessary::
Publishing work
~~~~~~~~~~~~~~~
-You can publish your work on GitHub by just using::
+You can publish your work on GitHub just by doing::
git push origin ticket_xxxxx
When you go to your GitHub page you will notice a new branch has been created.
+
If you are working on a Trac ticket, you should mention in the ticket that
your work is available from branch ticket_xxxxx of your github repo. Include a
link to your branch.
-Note that the above branch is called a "topic branch" in Git parlance. This
-means that other people should not base their work on your branch. In
-particular this means you are free to rewrite the history of this branch (by
-using ``git rebase`` for example). There are also "public branches". These are
-branches other people are supposed to fork, and thus their history should
-never change. Good examples of public branches are the ``master`` and
-``stable/A.B.x`` branches in the django/django repository.
+Note that the above branch is called a "topic branch" in Git parlance. You are
+free to rewrite the history of this branch, by using ``git rebase`` for
+example. Other people shouldn't base their work on such a branch, because
+their clone would become corrupt when you edit 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 ``master`` and ``stable/A.B.x`` branches in the
+django/django repository.
When you think your work is ready to be pulled into Django, you should create
-a pull request at GitHub. A good pull request contains:
+a pull request at GitHub. A good pull request means:
-* Commits with one logical change in each, following the
- :doc:`coding style <coding-style>`.
+* commits with one logical change in each, following the
+ :doc:`coding style <coding-style>`,
-* Well formed messages for each commit: a summary line and then paragraphs
- wrapped at 72 characters thereafter. See the :ref:`committing guidelines
- <committing-guidlines>` for more details.
+* well-formed messages for each commit: a summary line and then paragraphs
+ wrapped at 72 characters thereafter -- see the :ref:`committing guidelines
+ <committing-guidlines>` for more details,
-* Documentation and tests, if needed. Actually tests are always needed, except
- for documentation changes.
+* documentation and tests, if needed -- actually tests are always needed,
+ except for documentation changes.
-* The test suite passes and the documentation builds without warnings.
+The test suite must pass and the documentation must build without warnings.
Once you have created your pull request, you should add a comment in the
-related Trac ticket explaining what you've done. In particular you should tell
-in which environment you've run the tests, for instance: "all tests pass under
-SQLite and MySQL".
+related Trac ticket explaining what you've done. In particular you should note
+the environment in which you ran the tests, for instance: "all tests pass
+under SQLite and MySQL".
-Your pull request should be ready for merging into Django. Pull requests at
-GitHub have only two states: open and closed. The committers who deals 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 committer will finish it himself.
+Pull requests at GitHub have only two states: open and closed. The committer
+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 committer will finish it
+himself.
Rebasing branches
~~~~~~~~~~~~~~~~~
In the example above you created two commits, the "Fixed ticket_xxxxx" commit
-and "Added two more tests" commit. We do not want to have the "Added two more
-tests" commit in the Django's repository as it would just be useless noise.
-Instead, we would like to only have one commit. To rework the history of your
-branch you can squash the commits into one by using interactive rebase::
+and "Added two more tests" commit.
+
+We do not want to have the entire history of your working process in your
+repository. Your commit "Added two more tests" would be unhelpful noise.
+Instead, we would rather only have one commit containing all your work.
+
+To rework the history of your branch you can squash the commits into one by
+using interactive rebase::
git rebase -i HEAD~2
The HEAD~2 above is shorthand for two latest commits. The above command
will open an editor showing the two commits, prefixed with the word "pick".
-You should change the second line to "squash" instead. This will keep the
-first commit, and squash the second commit to the first one. Save and quit
-the editor. A second editor window should open. Here you can reword the
-commit message for the commit.
+
+Change the second line to "squash" instead. This will keep the
+first commit, and squash the second commit into the first one. Save and quit
+the editor. A second editor window should open, so you can reword the
+commit message for the commit now that it includes both your steps.
You can also use the "edit" option in rebase. This way you can change a single
-commit. For example::
+commit, for example to fix a typo in a docstring::
git rebase -i HEAD~3
# Choose edit, pick, pick for the commits
@@ -148,17 +165,18 @@ commit. For example::
git commit --amend
# reword the commit message if needed
git rebase --continue
- # The second and third commit should be applied.
+ # The second and third commits should be applied.
-If you need to change an already published topic branch at GitHub, you will
-need to force-push the changes::
+If your topic branch is already published at GitHub, for example if you're
+making minor changes to take into account a review, you will need to force-
+push the changes::
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 any more. This is acceptable, as the branch is topic
-branch, and nobody should be basing their work on this branch.
+commit hashes do not match any more. This is acceptable, as the branch is merely
+a topic branch, and nobody should be basing their work on it.
After upstream has changed
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -173,16 +191,18 @@ The work is automatically rebased using the branch you forked on, in the
example case using upstream/master.
The rebase command removes all your local commits temporarily, applies the
-upstream commits, and then applies your local commits again on the work. If
-there are merge conflicts you will need to resolve them and then use ``git
+upstream commits, and then applies your local commits again on the work.
+
+If there are merge conflicts you will need to resolve them and then use ``git
rebase --continue``. At any point you can use ``git rebase --abort`` to return
to the original state.
-Note that you want to rebase on upstream, not merge the upstream. The reason
-for this is that by rebasing, your commits will always be on top of the
-upstream's work, not mixed with the changes in the upstream. This way your
-branch only contains commits related to its topic, and this makes squashing
-easier.
+Note that you want to *rebase* on upstream, not *merge* the upstream.
+
+The reason for this is that by rebasing, your commits will always be *on
+top of* the upstream's work, not *mixed in with* the changes in the upstream.
+This way your branch will contain only commits related to its topic, which
+makes squashing easier.
After review
------------
@@ -190,31 +210,35 @@ After review
It is unusual to get any non-trivial amount of code into core without changes
requested by reviewers. In this case, it is often a good idea to add the
changes as one incremental commit to your work. This allows the reviewer to
-easily check what changes you have done::
+easily check what changes you have done.
- # Do changes required by the reviewer, commit often.
- # Before publishing the changes, rebase your work. Assume you added two
- # commits to the work.
- git rebase -i HEAD~2
- # squash the second commit into the first, write a commit message something
- # like this:
- Made changes asked in review by the_reviewer
+In this case, do the changes required by the reviewer. Commit as often as
+necessary. Before publishing the changes, rebase your work. If you added two
+commits, you would run::
- - Fixed whitespace errors in foo/bar
- - Reworded the doc string of the_method()
+ git rebase -i HEAD~2
- # Push your work back to your github repo, there should not be any need
- # for force (-f) push, as you didn't touch the public commits in the rebase.
- git push origin ticket_xxxxx
- # Check your pull request, it should now contain the new commit, too.
+Squash the second commit into the first. Write a commit message along the lines of::
+
+ Made changes asked in review by <reviewer>
+
+ - Fixed whitespace errors in foobar
+ - Reworded the docstring of bar()
+
+Finally push your work back to your GitHub repository. Since you didn't touch
+the public commits during the rebase, you should not need to force-push::
+
+ git push origin ticket_xxxxx
+
+Your pull request should now contain the new commit too.
-The committer is likely to squash the review commit into the previous commit
+Note that the committer is likely to squash the review commit into the previous commit
when committing the code.
Summary
-------
-* Work on GitHub if possible.
+* Work on GitHub if you can.
* Announce your work on the Trac ticket by linking to your GitHub branch.
* When you have something ready, make a pull request.
* Make your pull requests as good as you can.