How to create a pull request in GitHub

Learn how to fork a repo, make changes, and ask the maintainers to review and merge it.
250 readers like this.
a checklist for a team

So, you know how to use git. You have a GitHub repo and can push to it. All is well. But how the heck do you contribute to other people's GitHub projects? That is what I wanted to know after I learned git and GitHub. In this article, I will explain how to fork a git repo, make changes, and submit a pull request.

When you want to work on a GitHub project, the first step is to fork a repo.

Forking a GitHub repo

Use my demo repo to try it out.

Once there, click on the Fork button in the top-right corner. This creates a new copy of my demo repo under your GitHub user account with a URL like:<YourUserName>/demo

The copy includes all the code, branches, and commits from the original repo.

Next, clone the repo by opening the terminal on your computer and running the command:

git clone<YourUserName>/demo

Once the repo is cloned, you need to do two things:

  1. Create a new branch by issuing the command:

    git checkout -b new_branch
  2. Create a new remote for the upstream repo with the command:

    git remote add upstream

In this case, "upstream repo" refers to the original repo you created your fork from.

Now you can make changes to the code. The following code creates a new branch, makes an arbitrary change, and pushes it to new_branch:

$ git checkout -b new_branch
Switched to a new branch ‘new_branch’
$ echo “some test file” > test
$ cat test
Some test file
$ git status
On branch new_branch
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
nothing added to commit but untracked files present (use "git add" to track) 
$ git add test
$ git commit -S -m "Adding a test file to new_branch"
[new_branch (root-commit) 4265ec8] Adding a test file to new_branch
 1 file changed, 1 insertion(+)
 create mode 100644 test
$ git push -u origin new_branch
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 918 bytes | 918.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
Remote: Create a pull request for ‘new_branch’ on GitHub by visiting:
 * [new branch]  	new_branch -> new_branch

Once you push the changes to your repo, the Compare & pull request button will appear in GitHub.

GitHub's Compare &amp; Pull Request button

Click it and you'll be taken to this screen:

GitHub's Open pull request button

Open a pull request by clicking the Create pull request button. This allows the repo's maintainers to review your contribution. From here, they can merge it if it is good, or they may ask you to make some changes.


In summary, if you want to contribute to a project, the simplest way is to:

  1. Find a project you want to contribute to
  2. Fork it
  3. Clone it to your local system
  4. Make a new branch
  5. Make your changes
  6. Push it back to your repo
  7. Click the Compare & pull request button
  8. Click Create pull request to open a new pull request

If the reviewers ask for changes, repeat steps 5 and 6 to add more commits to your pull request.

Happy coding!

What to read next
User profile image.
Kedar is a Software Quality Engineer at Red Hat working with CloudForms(upstream ManageIQ) project and primarily looking at deployment/management of our internal infrastructure. Interested in Jenkins Pipeline and Ansible for automating deployments. Also writing Shinken modules for Monitoring and Alerting.


Wow great thanks for sharing this informative article with us! i really like your this article.

There's a lot about the lingo of git that I have a hard time understanding.
"Create a new remote for the upstream repo". remote-what? remote is an adjective. "upstream repo" - refers to what?
I still don't understand where the term "pull request" comes from and what it really means. Can these things be explained in a human-understandable language?

Hey Greg, there are few more articles I wrote about Git that you may find helpful.

Also, pull request is called such, because when you want your code to be merged in someone else's project you request them to "Pull" it in. Hence its called Pull Request. :) Upstream is the Repo that is usually owned by someone else and you want to contribute to it.
Lastly, Remote is just a term that is used to signify the name of the URL you interact with. If you clone a git repo, you can run

git remote -v

and you will see all remotes, which usually would be called "Origin" by default. And when you run command like :

git push origin xyz
git pull origin xyz

that origin is substituted with actual URL so git knows where to push the code.

Hope it helps.

In reply to by Greg P

Super helpful article. Thanks a lot!

Creative Commons LicenseThis work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.