diff options
| author | Cameron McEfee <cameron@github.com> | 2011-05-27 16:25:16 -0700 |
|---|---|---|
| committer | Cameron McEfee <cameron@github.com> | 2011-05-27 16:26:19 -0700 |
| commit | 75e24fdca4e70e751332c491a4b60a712e12c9e0 (patch) | |
| tree | ce505c13238ac1243de1026f85f26f848cd16d26 /_posts/2008-01-08-send-pull-requests.md | |
| parent | 379694ab364801b5d06c2070c43fa50594c4bf65 (diff) | |
Reorder files to alphabetize. Update titles to be more conducive to quick scans.
The posts have been re-dated to not only alphabetize them within their categories, but also to make them easier to find with their directory. Files marked 2008 are active post files. Files marked 2009 are outdated or are redirects to newer files. Files have been renamed to match their title for easier updating.
Diffstat (limited to '_posts/2008-01-08-send-pull-requests.md')
| -rw-r--r-- | _posts/2008-01-08-send-pull-requests.md | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/_posts/2008-01-08-send-pull-requests.md b/_posts/2008-01-08-send-pull-requests.md new file mode 100644 index 0000000..464ca1b --- /dev/null +++ b/_posts/2008-01-08-send-pull-requests.md @@ -0,0 +1,233 @@ +--- +layout: default +title: Send pull requests +description: How to notify others of your changes using Pull Requests. +categories: beginner +--- + +<style type="text/css"> +.main img { + border:1px solid #eee; + padding:5px; +} +.main img.inline { + vertical-align:middle; + border:0; +} +</style> + +<p class="intro">Pull requests let you tell others about changes you've pushed to a GitHub +repository. Once a pull request is sent, interested parties can review the set +of changes, discuss potential modifications, and even push follow-up commits if +necessary.</p> + +<p class="intro">This guide walks through the process of sending a hypothetical pull request and +using the various code review and management tools to take the change to +completion.</p> + +## A Quick Note on Collaborative Development Models + +There are two popular models of collaborative development on GitHub: + + 1. The *Fork + Pull Model* lets anyone fork an existing repository and + push changes to their personal fork without requiring access be granted + to the source repository. The changes must then be pulled into the source + repository by the project maintainer. This model reduces the amount of + friction for new contributors and is popular with open source projects + because it allows people to work independently without upfront + coordination. + + 2. The *Shared Repository Model* is more prevalent with small teams and + organizations collaborating on private projects. Everyone is granted push + access to a single shared repository and topic branches are used to isolate + changes. + +Pull requests are especially useful in the *Fork + Pull Model* because they +provide a way to notify project maintainers about changes in your fork. However, +they're also useful in the *Shared Repository Model* where they're used to +initiate code review and general discussion about a set of changes before being +merged into a mainline branch. + +## Before You Begin + +This guide assumes that [you have a GitHub account](http://github.com/signup), +that you've forked an existing repository and pushed your changes. For help with +forking and pushing changes, see the [Forking a project](/forking/) topic. + +## Initiating The Pull Request + +In the following example, **kneath** has completed some work on an error page +for the GitHub Jobs web application, pushed three commits to a topic branch in +his fork, and would like someone to review and merge. + +Navigate to **your repository** with the changes you want someone else to pull and +press the *Pull Request* button. + + + +Pull requests can be sent from any branch or commit but it's recommended that a +topic branch be used so that follow-up commits can be pushed to update the pull +request if necessary. + +## Previewing The Pull Request + +After pressing the *Pull Request* button, you are presented with a preview page +where you can enter a title and optional description, see exactly what +commits will be included when the pull request is sent, and also see who the +pull request will be sent to: + + + +If you're sending from a topic branch, the title is pre-filled based on the name +of the branch. Markdown is supported in the description, so you can embed images +or use preformatted text blocks. + +Switch to the *Commits* tab to ensure that the correct set of changes is being +sent: + + + +Review the diff of all changes by switching to the *Files Changed* tab: + + + +## Changing The Commit Range and Destination Repository + +By default, pull requests are assumed to be based on the parent-most +repository's integration branch. In this case, the `kneath/jobs` repository was +forked from `github/jobs` so the pull request is assumed to be based on the +`master` branch of the `github/jobs` repository. In a great majority of cases, +the defaults will be right; however, if any of this information is incorrect, press +the *Change Commits* button. + + + +The commit range selector will expand, allowing the base repository, base +branch, and head branch to be customized: + + + +The easiest way of thinking about the commit range is this: the *base branch* is +**where** you think changes should be applied, the *head branch* is **what** you +would like to be applied. + +Changing the base repository changes who is notified of the pull request. +Everyone that can push to the base repository will receive an email notification +and see the new pull request in their dashboard the next time they log in. + +Once you're happy with the commit range, press the *Update Commit Range* button +to update the commit and files changed preview areas. + +## Sending The Pull Request + +Once you've entered the title and description, made any necessary customizations +to the commit range, and reviewed the commits and file changes to be sent, press +the *Send pull request* button. + + + +The pull request is sent immediately. You're taken to the main pull request +discussion and review page. Additionally, all repository collaborators and +followers will see an event in their dashboard: + + + +## Managing Pull Requests + +All pull requests sent or received by you are browseable through the pull +request dashboard. + + + +Pull requests for a specific repository are also browseable by anyone with +access by visiting the *Network -> Pull Requests* page. + + + +The pull request dashboard and the repository pull request list support a wide +range of filtering and sorting controls. Use them to narrow down the list to +the pull requests you're interested in. + +## Reviewing Proposed Changes + +When you receive a pull request, the first thing to do is review the set of +proposed changes. Pull requests are tightly integrated with the underlying git +repository, so you can see exactly what commits would be merged should the +request be accepted: + + + +You can also review the cumulative diff of all file changes across all commits. + + + +## Pull Request Discussion + +After reviewing the basic description, commits, and cumulative diff, the person +tasked with applying the changes may have questions or comments. Perhaps the +coding style doesn't match project guideline, or the change is missing unit +tests, or maybe everything looks great and some props are in order. The +discussion view is designed to encourage and capture this type of discussion. + + + +The discussion view starts with the pull request's original title and +description and then captures additional activity to display chronologically +from there. Any of the following types of activity are captured as they happen: + + * Comments left on the pull request itself. + * Additional commits pushed to the pull request's branch. + * File and line notes left on any of the commits included in the pull request's range. + +Pull request comments are Markdown compatible, so you can embed images, use +preformatted text blocks, and other formatting supported by Markdown. + +## Merging a Pull Request + +Once the pull request is deemed satisfactory, someone with push access to the +destination repository must apply the changes and push the updated branch. +There are a variety of ways to accomplish this. Two popular methods are +described below. + +#### Fetch and Merge + +This is the most common method of fetching and applying changes. It requires +adding a remote for the person that sent the pull request, fetching from that +repository, merging the requested branch, fixing any conflicts, and pushing +the newly merged branch back to the repository: + +<pre class="console"> +<span>$</span> git checkout master +<span>$</span> git remote add kneath git://github.com/kneath/jobs.git +<span>$</span> git fetch kneath +<span>$</span> git merge kneath/error-page +<span>$</span> git push origin master +</pre> + +#### Patch and Apply + +The *fetch and merge* approach works great when you're working on a team or +repeatedly applying changes from the same small group of people. Another +approach that's a bit quicker in one-off cases is to use `git-am`. + +Every pull request has a `.patch` URL where you can grab a textual patch file +to feed into the `git-am` command: + +<pre class="console"> +<span>$</span> git checkout master +<span>$</span> curl http://github.com/github/jobs/pull/25.patch | git am +<span>$</span> git push origin master +</pre> + +## Closing a Pull Request + +Pull Requests are automatically closed when the requested commits are merged +into the destination repository. An event is generated to let all repository +collaborators and followers know that the merge occurred: + + + +It's also possible to manually close a pull request in cases where the set of +changes are rejected. This is also sometimes necessary if the changes are +applied with `git-cherry-pick` or using some other mechanism that disallows the +merge from being detected. |
