The answers are correct but don’t mention how to sync code between the public repo and the fork.

Here is the full workflow

First, duplicate the repo as others said (details here):

Create a new repo (let’s call it private-repo) via the Github UI. Then:

git clone --bare
cd public-repo.git
git push --mirror
cd ..
rm -rf public-repo.git

Clone the private repo so you can work on it:

git clone
cd private-repo
make some changes
git commit
git push origin master

To pull new hotness from the public repo:

cd private-repo
git remote add public
git pull public master # Creates a merge commit
git push origin master

Awesome, your private repo now has the latest code from the public repo plus your changes.

Finally, to create a pull request private repo -> public repo:

The only way to create a pull request is to have push access to the public repo. This is because you need to push to a branch there (here’s why).

git clone
cd public-repo
git remote add private_repo_yourname
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

Now simply create a pull request via the Github UI for public-repo, as described here.

Once project owners review your pull request, they can merge it.

Of course the whole process can be repeated (just leave out the steps where you add remotes).

Taken from stackoverflow post by

Written by

Digital nomad, full stack web dev, lecturer and a geek dad

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade