I'm still fairly new to Git, and I'm not entirely sure what the accepted etiquette is for contributing patches to other people's projects. Here's the best approach I've come up with for making changes to someone else's project and giving them the option to incorporate those changes.
Clone the repository
First, grab a copy of the project. Hopefully they're using Git -- I haven't worked out a good workflow for when they're not.
git clone git://github.com/username/project_name.git
cd project_name.git
Add a public repository
If you're like me and often work offline, you'll want a public repository where you can push your changes so others can access them. I set up a public Git repository for exactly this purpose. If you're always connected (or at least whenever another developer might want to pull your code), you can probably skip this step.
git remote add public ssh://barkingiguana.com/~craig/code/project_name.git
git push public master
Time to work
Here comes the hard but interesting bit: actually doing the work. Typically this means checking out a branch for a feature, bug fix, or topic area.
git checkout -b sprozzle-the-gromits
# ... do the work ...
git add gromits/blue.txt
git commit -m "Sprozzle Gromit with the blue face."
# ... do more work ...
git add gromits/cherry.txt
git commit -m "Cherry Gromits are even better with more Sprozzle."
Conflict resolution
While you've been working on your patch (and until it's accepted back into the project), there may be upstream changes. You'll want to make sure your patch applies cleanly to the master branch, since that dramatically increases the chances it'll be accepted.
git checkout master
git pull origin master
git checkout sprozzle-the-gromits
git rebase master
# resolve any conflicts
git commit -m "Made branch patch master at 351ac1b cleanly."
git push public
Advertise your changes
Push just the changes on your branch to the public repository. Again, this is only necessary if you work offline and need others to be able to access your code independently.
git push public sprozzle-the-gromits:refs/heads/sprozzled-gromits
Automation is awesome
Mark Brown pointed out that you can use git request-pull to generate a few paragraphs suitable for emailing to the project team, containing all the information needed for your changes to be reviewed and merged into the project.
git request-pull \
b9e0f1b4ff4bc196513c9551f6c25f0ee40d991f \
http://barkingiguana.com/~craig/project_name.git
And relax...
Your changes are now available to the public. Anyone can clone your repository and fetch your pushed branches. Now would be a good time to email the project owner and ask nicely if they'll pull from your repository and review your changes.
If you need to make further changes to the branch, just do the work, commit it, and run git push public from the branch (or git push public sprozzle-the-gromits from a different branch).
Difference is the spice of life
The project you want to contribute to may not support this style of collaboration. Check with the project team before you get started. If you'd prefer not to (or can't) publish your own copy of the repository, the Git book covers using Git and email as an alternative.