A fork is a remote, server-side copy of a git repository that you manage. A fork is not really conceptually part of git. It is a feature most git hosting services (such as GitHub, GitLab and Bit Bucket) provide. It is majorly used in open source development.
Fork Button on Github
If you want to contribute to an existing project to which you don’t have push access or commit rights, you can fork the project.
When you fork a repository, for example an open source project that is actively maintained; the original repository is likely to evolve as other users commit changes to it. These changes do not appear in your fork automatically; you need to sync the fork in order to pull newer commits that was made on the repository after you forked.
Lets say you have cloned a copy of a forked repository on your GitHub account.
$ git clone https://github.com/[YOUR_USERNAME]/[YOUR_FORK].git
Now let's check the remote details of your local forked repository.
$ git remote
origin
$ git remote -v
origin https://github.com/[YOUR_USERNAME]/[YOUR_FORK].git (fetch)
origin https://github.com/[YOUR_USERNAME]/[YOUR_FORK].git (push)
You see that you have just one remote
repository (origin) which is your forked git repository on github https://github.com/[YOUR_USERNAME]/[YOUR_FORK].git
.
Syncing The Forked Git Repository With The Original
Let's consider using a GitHub repository.
- First, you need to set up the
remote
repository that will be synced with the fork (that is the original repository). You often give theremote
repository a descriptive nameupstream
. Run$ git remote add upstream <ORIGINAL_REPOSITORY_URL>
$ git remote add upstream https://github.com/[ORIGINAL_OWNER]/[ORIGINAL_REPOSITORY].git
You can now see that remote
upstream has been added.
$ git remote -v
origin https://github.com/[YOUR_USERNAME]/[YOUR_FORK].git (fetch)
origin https://github.com/[YOUR_USERNAME]/[YOUR_FORK].git (push)
upstream https://github.com/[ORIGINAL_OWNER]/[ORIGINAL_REPOSITORY].git (fetch)
upstream https://github.com/[ORIGINAL_OWNER]/[ORIGINAL_REPOSITORY].git (push)
- You need to get your forked repository in sync with the original repository by fetching all the commits, branches and all metadata from the original repository.
$ git fetch upstream
And be sure to be on the master
of your forked local repository.
$ git checkout master
Switched to branch 'master'
- Merge commits from the
HEAD
branch usuallymaster
of original repository to your local forked repository.
$ git merge upstream/master
NOTE You don't have to merge changes in all branches from upstream since you majorly want to work a branch.
- Make your contribution - I typically advice you create a new branch for the feature you want to add. You would do this by branching out from the
master
branch.
$ git checkout -b [YOUR_NEW_BRANCH]
Don't commit directly to the master branch
Obviously, when done with your contributions, you commit and push changes to your remote
forked repository (origin).
- Finally, Head over to the original upstream
remote
repository (in this case GitHub) and submit a Pull Request (PR) to merge commits from the [NEW_BRANCH] on your forked repository.
See GitHub specific workflow below:
Pull Request Button on Github
Compare Across Forks Link
Choose Original Repository And Branch
Choose Head Fork Compare Branch
Visit Github Help Page for creating a PR from a forked repository for GitHub specific workflow.